最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

golang HTTP 服務(wù)器 處理 日志/Stream流的操作

 更新時(shí)間:2020年12月16日 12:24:00   作者:XuYongshi02  
這篇文章主要介紹了golang HTTP 服務(wù)器 處理 日志/Stream流的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧

目前,我開發(fā) HTTP 服務(wù), 用的是 beego框架, 方便了很多。

但是, 有時(shí)候,還是會(huì)遇到一些 特殊的場景。

比如: 過濾日志。

這應(yīng)該是一種典型的stream,同時(shí)數(shù)據(jù)量也適中, 不會(huì)有人,為了這個(gè), 就用一些很重的框架。

可以這樣直觀的描述這個(gè) 邏輯

其他組件 產(chǎn)生 log
||
\ /
我的組件,業(yè)務(wù)處理
||
\ /
用戶, http client

這種情景下, 有幾個(gè)特殊點(diǎn):

1. 難以用 string,或者 byte 數(shù)組 收集數(shù)據(jù)

2. 數(shù)據(jù)Source 端,不斷的有數(shù)據(jù)產(chǎn)生

3. 數(shù)據(jù)緩沖,如果占有的 內(nèi)存太多, 可能導(dǎo)致 服務(wù)崩潰

通常情況下,我們準(zhǔn)備好數(shù)據(jù), 然后調(diào)用Beego框架的方法,將數(shù)據(jù)發(fā)送到客戶端,就不管了。

而如果,我們需要根據(jù)處理的情況,多次寫數(shù)據(jù)到客戶端,該怎么辦呢?

首先,對于 這種簡單的 流數(shù)據(jù), golang 提供了一個(gè) 結(jié)構(gòu)。

pipeReader, pipeWriter := io.Pipe()

這個(gè)方法的原型是這樣的

func Pipe() (*PipeReader, *PipeWriter)

它返回緊密相連的一對 Reader 和 Writer。 他們的“生命周期”相同。

任何 寫到 Writer中的數(shù)據(jù), 直接流到了Reader中。這個(gè) 和 Linux 命令行中 “管道 |” 很像。

我們先開個(gè)goroutine 接收 日志數(shù)據(jù)

 go func () {
 for {
 var log []byte
 //log = 
 pipeWriter.Write(log)
 
 //break;
 }
 pipeWriter.CloseWithError(io.EOF)
 }

主邏輯中, 處理日志

 defer pipeReader.Close()
 rr := bufio.NewReader(io.Reader(pipeReader))
 for {

 line, err := rr.ReadBytes('\n')
 if io.EOF == err {
 break
 }
........
 }

最后, 輸出到客戶端

var out []byte
ctl.Ctx.ResponseWriter.Write(out)
ctl.Ctx.ResponseWriter.Flush()

總結(jié):

iopipe 直接 對接了 日志輸出, 緩沖很小,

處理后的結(jié)果, 直接輸出到 http 客戶端。

尤其是第二點(diǎn),很重要,我在處理這個(gè)邏輯的時(shí)候, 發(fā)現(xiàn)服務(wù)器,有幾次意外崩潰,后來,才意識到,beego的controller 如果緩沖 處理后的數(shù)據(jù),有可能仍然占有大量內(nèi)存。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • Golang通過包長協(xié)議處理TCP粘包的問題解決

    Golang通過包長協(xié)議處理TCP粘包的問題解決

    本文主要介紹了Golang通過包長協(xié)議處理TCP粘包的問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • go build -tags構(gòu)建約束試驗(yàn)示例解析

    go build -tags構(gòu)建約束試驗(yàn)示例解析

    這篇文章主要為大家介紹了go build -tags構(gòu)建約束試驗(yàn)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Golang通脈之方法詳情

    Golang通脈之方法詳情

    這篇文章主要介紹了Golang通脈方法,Go語言中的方法(Method)是一種作用于特定類型變量的函數(shù)。這種特定類型變量叫做接收者(Receiver)。接收者的概念就類似于,其他語言中的this或者 self,具體內(nèi)容請和小編一起來學(xué)習(xí)下面文章內(nèi)容吧
    2021-10-10
  • go語言題解LeetCode1160拼寫單詞示例詳解

    go語言題解LeetCode1160拼寫單詞示例詳解

    這篇文章主要為大家介紹了go語言題解LeetCode1160拼寫單詞示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • 一文搞懂Golang中的內(nèi)存逃逸

    一文搞懂Golang中的內(nèi)存逃逸

    內(nèi)存逃逸是 Go 語言中一個(gè)重要的概念,涉及到程序的性能優(yōu)化和內(nèi)存管理,了解內(nèi)存逃逸可以幫助我們編寫更高效的代碼,本文將從基本概念入手,深入講解 Go 語言中的內(nèi)存逃逸現(xiàn)象,以及如何避免,需要的朋友可以參考下
    2023-12-12
  • go格式“占位符”輸入輸出 類似python的input

    go格式“占位符”輸入輸出 類似python的input

    這篇文章主要介紹了go格式“占位符”, 輸入輸出,類似python的input,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-04-04
  • golang語言實(shí)現(xiàn)的文件上傳與文件下載功能示例

    golang語言實(shí)現(xiàn)的文件上傳與文件下載功能示例

    這篇文章主要介紹了golang語言實(shí)現(xiàn)的文件上傳與文件下載功能,結(jié)合實(shí)例形式分析了Go語言實(shí)現(xiàn)的文件傳輸相關(guān)操作技巧,需要的朋友可以參考下
    2020-02-02
  • 深入淺析Go中三個(gè)點(diǎn)(...)用法

    深入淺析Go中三個(gè)點(diǎn)(...)用法

    這篇文章主要介紹了深入淺析Go中三個(gè)點(diǎn)(...)用法,需要的朋友可以參考下
    2021-10-10
  • go開源項(xiàng)目用戶名密碼驗(yàn)證的邏輯鬼才寫法

    go開源項(xiàng)目用戶名密碼驗(yàn)證的邏輯鬼才寫法

    這篇文章主要為大家介紹了go開源項(xiàng)目中發(fā)現(xiàn)的一個(gè)邏輯鬼才寫法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • go語言實(shí)現(xiàn)Elasticsearches批量修改查詢及發(fā)送MQ操作示例

    go語言實(shí)現(xiàn)Elasticsearches批量修改查詢及發(fā)送MQ操作示例

    這篇文章主要為大家介紹了go語言實(shí)現(xiàn)Elasticsearches批量修改查詢及發(fā)送MQ操作示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04

最新評論

建宁县| 东方市| 灌南县| 鄂伦春自治旗| 从江县| 肥东县| 榆树市| 绥宁县| 惠安县| 无为县| 玛纳斯县| 庆云县| 水城县| 博湖县| 阿克苏市| 剑川县| 水城县| 临湘市| 天门市| 修水县| 武邑县| 眉山市| 抚松县| 方山县| 增城市| 贵南县| 梅州市| 乌恰县| 安义县| 宜都市| 甘谷县| 平顺县| 义乌市| 虹口区| 保山市| 七台河市| 萨迦县| 庐江县| 蒙阴县| 乌拉特中旗| 南充市|