2015-09-29 30 views
2

我需要在我的golang應用中讀取sse,但不是實時的,事件返回緩衝。正如我所看到的,這是由於標準的golang傳輸。我怎樣才能解決這個問題,而無需實施我自己的交通工具 此代碼由cryptix溶液啓發:在客戶端讀取未緩存的服務器發送的事件

resp, _ := http.Get(sseURL) 
events := make(chan Event) 
wg:= sync.WaitGroup{} 
wg.Add(1) 
go func() { 
    event:= Event{} 
    reader := bufio.NewReader(resp.Body) 

    for { 
     line, err := reader.ReadBytes('\n') 

     if err != nil { 
      log.Println(os.Stderr, "error during resp.Body read:%s\n", err) 
      close(events) 
     } 

     json.Unmarshal(line,&event) 

     events<-event 
    } 
    wg.Done() 
}() 

go func(){ 
    for ev:= range events { 
     log.Println(ev) 
    } 
}() 
wg.Wait() 
+0

由於客戶端的傳輸不應該有延遲。您是否通過觀看電線上的數據來驗證時機? (另外,如果你有換行符分隔的json,你可以直接使用'json.Decoder') – JimB

+0

Thx,@JimB。是的,我驗證了數據是以curl實時發送的。 – hjortron

+1

如果服務器刷新完整的json對象*和*換行符,此方法可正常工作。 (我看到的延遲小於1μs)。您確實需要修復像在封閉通道上發送的問題,以及需要Fprintf的Println,但這不會增加任何延遲。確保服務器準確地*發送您預期的數據。 – JimB

回答

1

想出,數據被緩衝nginx的透明因爲壓縮的。因此,爲了毫不拖延地獲得數據,我們必須像這樣禁用壓縮:

client := &http.Client{} 
transport := &http.Transport{} 
transport.DisableCompression = true 
client.Transport = transport 
req, err := http.NewRequest("GET", essURL, nil) 
if err != nil { 
    log.Fatal(err); 
} 
resp, _ := client.Do(req) 

reader := bufio.NewReader(resp.Body) 
for { 
    line,_:=reader.ReadSlice('\n') 
    log.Println(string(line))  
} 
相關問題