Задержка SSE в golang

Я пытаюсь сделать консоль с помощью sse, которая показывает клиенту, что делает сервер. В настоящее время он делает то, что я хочу, за исключением задержки (около 2 секунд). Я добавил http.Flusher, но, похоже, он абсолютно ничего не делает. Я вызываю UpdateLogMessage с помощью горутин: go UpdateLogMessage("Example")

ССЭ:

type Upl struct {
    log string
}

var Log chan *Upl

func DashboardHandler(w http.ResponseWriter, r *http.Request) {
    f, ok := w.(http.Flusher)
    if !ok {
        fmt.Println("Streaming unsuported")
    }

    w.Header().Set("Content-Type", "text/event-stream")
    w.Header().Set("Cache-Control", "no-cache")
    w.Header().Set("Connection", "keep-alive")

    msg := <-Log
    fmt.Fprintf(w, "data: %v\n\n", msg.log)
    f.Flush()
}

//Updates log message with curent time and message content
func UpdateLogMessage(msg string) {
    curentTime := time.Now().Format("15:04:05")
    ul := fmt.Sprintf("<%v> %v", curentTime, msg)
    up := &Upl{
        log: ul,
    }
    Log <- up
}

func MakeChan() {
    Log = make(chan *Upl)
}

Javascript:

function onLoaded(){
    var source = new EventSource("sse/dashboard")
    var logg = "";
    var currentmsg = "";

    source.onmessage = function (event){
        var dashboard = event.data;
        //If message changed print it to console
        if (dashboard != currentmsg){
            console.info("OnMessage called:");
            console.dir(event);
            currentmsg = dashboard;
            logg += currentmsg + "<br/>";
            console.info(logg);
            document.getElementById("console").innerHTML = logg;
        }
    }
}

Размещенный вами код не объясняет задержки, но SSE используется не так (или не должен использоваться). Вы возвращаетесь из обработчика после отправки первого сообщения. Обычно обработчики SSE имеют цикл для отправки обновлений клиенту. Кроме того, способ получения из канала Log опасен, если несколько клиентов подключатся к конечной точке SSE, они будут соревноваться за получение сообщения, и вы не сможете обрабатывать отмену контекста.

icza 13.03.2019 15:04

И если клиент не прослушивается, вы будете сливать горутины с go UpdateLogMessage("Example"), так как они не смогут отправить на канал и, таким образом, зависнут навсегда. Посмотрите на этот пример: Почему выполнение Golang http.ResponseWriter задерживается?

icza 13.03.2019 15:04

Спасибо! Задержка, вероятно, произошла из-за того, что с каждым сообщением я возвращался из обработчика, как вы сказали. Теперь я изменил это, добавив цикл, поэтому он должен работать нормально, но поскольку я использую форму загрузки, когда я начинаю загружать файл, HTTP-соединение закрывается, и я получаю 0 сообщений во время загрузки. Мне, вероятно, нужно использовать Ajax для загрузки файлов, чтобы он работал правильно.

batijo 14.03.2019 13:43
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
0
3
627
0

Другие вопросы по теме