精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

使用增強(qiáng)版 Singleflight 合并事件推送,效果炸裂!

開(kāi)發(fā) 前端
理論上,如果沒(méi)有并發(fā),事件和以前一樣推送,沒(méi)有合并,當(dāng)然這也沒(méi)毛病。當(dāng)并發(fā)大于 2 時(shí),開(kāi)始發(fā)揮威力。在實(shí)際的壓測(cè)上,注冊(cè)并發(fā) 1500 時(shí),合并的事件達(dá)到 99.9%,效果相當(dāng)炸裂!

hello,大家好啊,我是小樓。

最近在工作中對(duì) Go 的 singleflight 包做了下增強(qiáng),解決了一個(gè)性能問(wèn)題,這里記錄下,希望對(duì)你也有所幫助。

singleflight 是什么

singleflight 直接翻譯為"單(次)飛(行)",它是對(duì)同一種請(qǐng)求的抑制,保證同一時(shí)刻相同的請(qǐng)求只有一個(gè)在執(zhí)行,且在它執(zhí)行期間的相同請(qǐng)求都會(huì) Hold 直到執(zhí)行完成,這些 Hold 的請(qǐng)求也使用這次執(zhí)行的結(jié)果。

舉個(gè)例子,當(dāng)程序中有讀(如 Redis、MySQL、Http、RPC等)請(qǐng)求,且并發(fā)非常高的情況,使用 singleflight 能得到比較好的效果,它限制了同一時(shí)刻只有一個(gè)請(qǐng)求在執(zhí)行,也就是并發(fā)永遠(yuǎn)為1。

圖片

singleflight 的原理

最初 singleflight 出現(xiàn)在 groupcache 項(xiàng)目中,這個(gè)項(xiàng)目也是 Go 團(tuán)隊(duì)所寫(xiě),后來(lái)該包被移到 Go 源碼中,在 Go 源碼中的版本經(jīng)過(guò)幾輪迭代,稍微有點(diǎn)復(fù)雜,我們以最原始的源碼來(lái)講解原理,更方便地看清本質(zhì)。

https://github.com/golang/groupcache/blob/master/singleflight/singleflight.go

singleflight 把每次請(qǐng)求定義為 call,每個(gè) call 對(duì)象包含了一個(gè) waitGroup,一個(gè) val,即請(qǐng)求的返回值,一個(gè) err,即請(qǐng)求返回的錯(cuò)誤。

type call struct {
 wg  sync.WaitGroup
 val interface{}
 err error
}

再定義全局的 Group,包含一個(gè)互斥鎖 Mutex,一個(gè) key 為 string,value 為 call 的 map。

type Group struct {
 mu sync.Mutex       
 m  map[string]*call
}

Group 對(duì)象有一個(gè) Do 方法,其第一個(gè)參數(shù)是 string 類型的 key,這個(gè) key 也就是上面說(shuō)的 map 的 key,相同的 key 標(biāo)志著他們是相同的請(qǐng)求,只有相同的請(qǐng)求會(huì)被抑制;第二個(gè)參數(shù)是一個(gè)函數(shù) fn,這個(gè)函數(shù)是真正要執(zhí)行的函數(shù),例如調(diào)用 MySQL;返回值比較好理解,即最終調(diào)用的返回值和錯(cuò)誤信息。

func (g *Group) Do(key string, fn func() (interface{}, error)) (interface{}, error) {
 // ①
  g.mu.Lock()
 if g.m == nil {
  g.m = make(map[string]*call)
 }
  // ②
 if c, ok := g.m[key]; ok {
  g.mu.Unlock()
  c.wg.Wait()
  return c.val, c.err
 }
  // ③
 c := new(call)
 c.wg.Add(1)
 g.m[key] = c
 g.mu.Unlock()

 c.val, c.err = fn()
 c.wg.Done()

 g.mu.Lock()
 delete(g.m, key)
 g.mu.Unlock()

 return c.val, c.err
}

將整個(gè)代碼分成三塊:

  • ① 懶加載方式初始化 map;
  • ② 如果當(dāng)前 key 存在,即相同請(qǐng)求正在調(diào)用中,就等它完成,完成后直接使用它的 value 和 error;
  • ③ 如果當(dāng)前 key 不存在,即沒(méi)有相同請(qǐng)求正在調(diào)用中,就創(chuàng)建一個(gè) call 對(duì)象,并把它放進(jìn) map,接著執(zhí)行 fn 函數(shù),當(dāng)函數(shù)執(zhí)行完喚醒 waitGroup,并刪除 map 相應(yīng)的 key,返回 value 和 error。

讀可以抑制,寫(xiě)呢?

我們通過(guò)上面的介紹能了解,singleflight 能解決并發(fā)讀的問(wèn)題,但我又遇到一個(gè)并發(fā)寫(xiě)的問(wèn)題。為了能讓大家快速進(jìn)入狀態(tài),先花一點(diǎn)篇幅描述一下遇到的實(shí)際問(wèn)題:

微服務(wù)中的注冊(cè)中心想必大家都有所了解,如果不了解,可以去查查相關(guān)概念,或者翻看我以前的文章,老讀者應(yīng)該能發(fā)現(xiàn)我寫(xiě)了很多相關(guān)的文章。

服務(wù)提供方在注冊(cè)之后,會(huì)將變更事件推送到消費(fèi)方,推送事件的處理流程是:接收到事件,查詢組裝出最新的數(shù)據(jù),然后推送給訂閱者。存在兩種情況可能會(huì)導(dǎo)致短時(shí)間內(nèi)注冊(cè)請(qǐng)求非常多,推送事件多會(huì)影響整個(gè)注冊(cè)中心的性能:

  • 接口級(jí)注冊(cè)(類似 Dubbo),每臺(tái)機(jī)器會(huì)注冊(cè)N多次
  • 服務(wù)并發(fā)發(fā)布,例如每次發(fā)布重啟100臺(tái)機(jī)器,那么注冊(cè)的并發(fā)就可能是100

拿到這種問(wèn)題,第一想到的解法是:合并推送。但,怎么合并呢?

是不是每次推送的時(shí)候等一等,等事件都來(lái)了再一把推過(guò)去就可以了?但等多久呢?什么時(shí)候該等呢?粗暴點(diǎn),每秒鐘推送一次,這樣就能將一秒內(nèi)的時(shí)間都聚合,但這會(huì)影響推送的時(shí)效性,顯然不符合我們精益求精的要求。

直接使用 singleflight,能行嗎?

套用上面 singleflight ,在第一個(gè)事件推送過(guò)程中,其他相同的事件被 Hold 住,等第一個(gè)事件推送完成后,這些 Hold 的事件不再執(zhí)行推送直接返回。

稍微想一下就知道這樣是有問(wèn)題的,假設(shè)有三個(gè)事件 A、B、C,分別對(duì)應(yīng)到三個(gè)版本的數(shù)據(jù)A1、B1、C1,A 最先到達(dá),在 A 開(kāi)始推送后但沒(méi)完成時(shí) B、C 事件到達(dá),A 事件觸發(fā)推送了 A1 版本的數(shù)據(jù),B、C 事件在 A 事件推送完成后,直接丟棄,最終推送到消費(fèi)者上的數(shù)據(jù)版本為 A1,但我們肯定期望推送的數(shù)據(jù)版本為 C1,畫(huà)個(gè)圖線感受下:

圖片

增強(qiáng)一點(diǎn)點(diǎn) ????

假設(shè)有事件 A、B、C、D 先后到達(dá),A 事件仍然先正常執(zhí)行推送,在 A 事件推送的時(shí)候,B、C、D 事件 Hold 住,當(dāng) A 事件推送完成后,B 事件開(kāi)始推送,B 事件將把 A 事件推送時(shí)期積攢的事件都一起推送掉,即 B、C、D 一次性推送完成。

圖片

增強(qiáng)代碼參考

增強(qiáng)的定義為 WriteGroup,借用 singleflight 原先的實(shí)現(xiàn),具體代碼就不必解讀了,對(duì)照上面的例子應(yīng)該很好理解。

package singleflight

import (
 "sync"
)

type WriteGroup struct {
 mu    sync.Mutex
 wgs   map[string]*sync.WaitGroup
 group Group
}

func (g *WriteGroup) Do(key string, fn func() error) error {
 g.mu.Lock()
 if g.wgs == nil {
  g.wgs = make(map[string]*sync.WaitGroup)
 }
 wg, ok := g.wgs[key]
 if !ok {
  wg = &sync.WaitGroup{}
  wg.Add(1)
  g.wgs[key] = wg
 }
 g.mu.Unlock()

 if !ok {
  err := fn()

  g.mu.Lock()
  wg.Done()
  delete(g.wgs, key)
  g.mu.Unlock()
  return err
 }

 wg.Wait()
 _, err := g.group.Do(key, func() (interface{}, error) {
  return nil, fn()
 })
 return err
}

效果如何?

理論上,如果沒(méi)有并發(fā),事件和以前一樣推送,沒(méi)有合并,當(dāng)然這也沒(méi)毛病。當(dāng)并發(fā)大于 2 時(shí),開(kāi)始發(fā)揮威力。在實(shí)際的壓測(cè)上,注冊(cè)并發(fā) 1500 時(shí),合并的事件達(dá)到 99.9%,效果相當(dāng)炸裂!

責(zé)任編輯:武曉燕 來(lái)源: 捉蟲(chóng)大師
相關(guān)推薦

2023-09-03 19:43:46

htmxJavaScript網(wǎng)絡(luò)

2013-05-15 09:14:01

2011-01-05 11:12:34

C++

2021-01-27 10:01:46

MySQL數(shù)據(jù)庫(kù)SQLX

2022-09-21 10:50:43

pickledillPython

2011-09-15 14:00:52

IOS應(yīng)用SpoolInstapaper

2011-05-26 17:55:08

2009-01-05 10:30:23

賽門(mén)鐵克Veritas數(shù)據(jù)中心

2009-12-29 14:18:43

ADO.NET2.0

2015-09-23 11:27:20

Office 2016ISO鏡像微軟

2013-08-20 17:46:43

通達(dá)OA

2023-04-06 08:27:47

SidecarSet容器

2013-10-09 14:57:41

通達(dá)oa

2012-08-28 13:37:30

2010-08-25 10:42:20

GroovyGroovy++

2023-09-12 11:10:00

代碼優(yōu)化Go

2023-04-04 07:25:46

KubernetesOpenKruise

2023-05-30 14:59:41

人工智能工具數(shù)字化

2013-10-15 14:40:51

通達(dá)OA
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

日本欧美在线看| 少妇精品久久久| 亚洲国产日韩精品| 久久精品五月婷婷| 久久午夜鲁丝片| 欧美成人久久| 日韩精品免费视频| 99国产精品久久久久久| 99在线视频影院| 久久久九九九九| 国产精品视频午夜| 久久精品99国产精| 郴州新闻综合频道在线直播| 日韩一区二区视频| 国产熟女高潮视频| 亚洲妇熟xxxx妇色黄| 久久久噜噜噜久噜久久综合| 91香蕉嫩草影院入口| 久久夜色精品国产噜噜亚洲av| 亚洲一区二区三区| 日韩大陆欧美高清视频区| 999在线精品视频| 中文在线а√天堂| 一区二区三区四区亚洲| 亚洲精品无人区| 日本不卡视频一区二区| 国产精品1区2区3区| 国产精品午夜一区二区欲梦| 国产精品人人人人| 午夜精品亚洲| 精品国产一区二区三区四区在线观看 | 国产青青草在线| 99在线视频精品| 成人免费在线看片| av免费观看在线| 精品一区二区三区影院在线午夜| 日韩美女免费线视频| 日韩黄色a级片| 欧美日韩 国产精品| 久久夜精品香蕉| 高清国产在线观看| 国产成人3p视频免费观看| 亚洲国产精久久久久久| 一二三区视频在线观看| 欧美久久一区二区三区| 91精品国产色综合久久| 99日在线视频| 亚洲人成网站在线在线观看| 欧美日韩美少妇| 日本黄大片一区二区三区| 一二区成人影院电影网| 日本黄色一区二区| 超碰在线97免费| 456成人影院在线观看| 欧美视频13p| 国产 日韩 欧美在线| 久操av在线| 夜夜嗨av一区二区三区中文字幕| 在线观看欧美亚洲| 爱久久·www| 国产日韩视频一区二区三区| 久久精品日产第一区二区三区乱码 | 尤物九九久久国产精品的特点| 熟妇高潮精品一区二区三区| 激情小说亚洲色图| 精品sm在线观看| 国产免费a级片| 国色天香久久精品国产一区| 欧美日韩国产免费| 国产原创精品在线| 粉嫩av一区二区三区四区五区| 在线中文字幕一区二区| aa在线免费观看| 亚洲精品日产| 精品久久久久久电影| 免费一级特黄特色毛片久久看| 日本在线视频中文有码| 亚洲一区在线观看网站| 日韩黄色片在线| 国精一区二区三区| 一区二区三区.www| 人妻av中文系列| 欧亚在线中文字幕免费| 日本韩国一区二区| 五月天激情视频在线观看| 国产91欧美| 6080国产精品一区二区| 亚洲天堂小视频| 第四色中文综合网| 亚洲精品色婷婷福利天堂| 在线观看国产精品一区| 日韩电影免费网址| 久久99精品视频一区97| 日韩欧美三级在线观看| 乱人伦精品视频在线观看| 国产精品久久久久久久久久| 国产丝袜视频在线观看| 成人在线综合网| 久久久久久一区| 国产福利第一视频在线播放| 中文字幕一区二区三区色视频| 国产日韩欧美大片| 精品人人视频| 欧美色窝79yyyycom| 亚洲欧美激情一区二区三区| 亚洲第一福利社区| 俺去啦;欧美日韩| 欧美交换国产一区内射| 久久精品九九| 成人在线精品视频| 天堂在线观看视频| 国产精品乱子久久久久| 欧美这里只有精品| 日韩在线短视频| 日韩视频在线你懂得| a级在线观看视频| 亚洲成人精选| 欧美综合激情网| 国产免费高清视频| 久久久影视传媒| 亚洲 日韩 国产第一区| 青春草视频在线| 在线观看区一区二| 亚洲少妇一区二区三区| 成人激情免费视频| 97热精品视频官网| 国产人妖在线播放| 久久精品欧美一区二区三区不卡| 狠狠精品干练久久久无码中文字幕| 经典三级一区二区| 亚洲第一精品夜夜躁人人爽| 人与动物性xxxx| 免费一区视频| 91九色蝌蚪国产| 成人精品一区二区三区免费| 天天综合网 天天综合色| 成人av毛片在线观看| 精品国产乱码久久久久久蜜坠欲下 | 亚洲综合网站在线观看| 中文字幕国内自拍| 亚洲尤物av| 2019av中文字幕| 国产免费黄色片| 亚洲精品写真福利| 网站在线你懂的| 欧美在线色图| 国产成人精品综合| 你懂得在线网址| 午夜精品久久久久| 午夜不卡久久精品无码免费| 一区二区三区在线电影| 91视频88av| 美女黄视频在线观看| 欧美视频一区二区在线观看| 亚洲高潮女人毛茸茸| 日韩国产在线一| 日韩免费三级| 日韩av福利| 亚洲午夜精品久久久久久性色| 久久免费激情视频| 99精品偷自拍| 久在线观看视频| 你懂的在线观看一区二区| 国语自产精品视频在线看抢先版图片| 国产99久一区二区三区a片 | 日韩精品在线私人| 欧美啪啪小视频| 95精品视频在线| www国产精品内射老熟女| 久久这里只有精品一区二区| 国内精品一区二区三区| 午夜av免费在线观看| 亚洲第一成年网| 五级黄高潮片90分钟视频| 欧美综合二区| 日韩三级电影| 亚洲美女色播| 欧美激情免费在线| 亚州av在线播放| 色偷偷一区二区三区| av免费播放网站| 久久亚洲国产精品一区二区| 亚洲高清乱码| 欧美日韩黄色| 久久久久久久久久久国产| 丰满人妻一区二区| 高跟丝袜一区二区三区| 国产视频不卡在线| 国产精品18久久久久| 精品无码国模私拍视频| 精品一区免费| 成人午夜高潮视频| 91黄页在线观看| 亚洲人成电影网| 91女人18毛片水多国产| 一区二区免费在线| 成年人网站免费看| 久久成人综合网| 欧美极品少妇无套实战| 免费视频亚洲| 91在线免费看网站| 美女的胸无遮挡在线观看| 亚洲欧美变态国产另类| 91av久久久| 午夜精品免费在线观看| 成人在线手机视频| 成人一区二区视频| a在线观看免费视频| 欧美日韩三级电影在线| 日韩激情久久| 亚洲综合色婷婷在线观看| 国产精品成人aaaaa网站| www亚洲人| 亚洲欧美国产精品| 精品人妻一区二区三区蜜桃| 色94色欧美sute亚洲线路一久| 538任你躁在线精品视频网站| 91论坛在线播放| 亚洲高清在线不卡| 丝袜亚洲另类丝袜在线| www.av蜜桃| 手机亚洲手机国产手机日韩| 国产成人看片| 国产在线视频欧美一区| 国产精品aaaa| 国产传媒在线| 久久亚洲春色中文字幕| 日韩一级片免费看| 91精品国产综合久久精品app| 国产专区第一页| 亚洲午夜日本在线观看| 在线观看黄网址| 2021国产精品久久精品| 亚洲午夜久久久久久久久| 黄页网站大全一区二区| 别急慢慢来1978如如2| 亚洲国产日韩在线| 久久最新免费视频| 日韩毛片视频| 品久久久久久久久久96高清| 欧美日韩麻豆| 国产精品一码二码三码在线| 综合中文字幕| 1卡2卡3卡精品视频| 欧美在线se| 国产福利视频一区二区| 亚洲三级欧美| 亚洲**2019国产| www.综合网.com| 欧美国产中文字幕| 麻豆最新免费在线视频| 精品国产依人香蕉在线精品| 91啦中文在线| 中文字幕在线看视频国产欧美| 美女做暖暖视频免费在线观看全部网址91 | 色妞在线综合亚洲欧美| 国产区视频在线播放| 日韩大陆欧美高清视频区| 亚洲三级中文字幕| 亚洲国产91精品在线观看| 蜜桃视频久久一区免费观看入口| 日韩欧美一二三四区| 国产丝袜视频在线观看| 欧美一卡二卡三卡| 亚洲高清精品视频| 精品国产污污免费网站入口| 懂色av成人一区二区三区| 日韩成人网免费视频| 日本一区高清| 亚洲一区www| www.黄在线观看| 日韩中文字幕免费视频| 九色porny在线| 久久视频免费观看| 色噜噜狠狠狠综合欧洲色8| 久久久99免费视频| 欧美卡一卡二| 91sa在线看| 国模一区二区| 91精品久久久久久久久中文字幕| 9999精品视频| 国产精品一区在线观看| 一本色道久久综合亚洲精品酒店 | 特级丰满少妇一级| 久久国产精品无码网站| 国模大尺度视频| 99久久er热在这里只有精品66| 黄色国产在线观看| 国产精品久久久久影院亚瑟| 国产盗摄一区二区三区在线| 一区二区在线观看视频 | 欧美午夜片在线免费观看| 亚洲黄色免费观看| 欧美精品精品一区| 亚洲老妇色熟女老太| 亚洲乱码av中文一区二区| 自拍视频在线免费观看| 欧美激情国产高清| 在线观看的黄色| 91精品视频免费| 欧美日韩导航| 一级黄色免费在线观看| 一本色道久久综合一区| 国产无色aaa| 97超碰欧美中文字幕| 国产小视频你懂的| 一级女性全黄久久生活片免费| 亚洲精品国产精品乱码视色| 欧美va亚洲va| h网站视频在线观看| 欧美第一淫aaasss性| 成人不卡视频| 国外成人在线视频网站| 日韩视频在线观看| 久久福利一区二区| 免费视频久久| 成年人看片网站| 国产欧美日韩一区二区三区在线观看| 精品国产欧美日韩不卡在线观看| 欧美日韩综合视频| 性做久久久久久久久久| 国产一区二区久久精品| 在线你懂的视频| 国产日韩欧美日韩| 精品产国自在拍| 777精品久无码人妻蜜桃| 国产精品一区一区| 老司机福利在线观看| 欧美午夜性色大片在线观看| 亚洲系列在线观看| 亚洲国产精品热久久| 成人无遮挡免费网站视频在线观看| 庆余年2免费日韩剧观看大牛| 中文字幕一区二区三区中文字幕 | 国产高清日韩| 亚洲国产欧美不卡在线观看| 亚洲免费网址| 美女伦理水蜜桃4| 一区二区三区精品| 中文字幕精品一区二区精| 国产一区二区精品丝袜| 成人线上视频| 久久亚洲综合网| 亚洲国产99| 在线观看亚洲免费视频| 亚洲视频一二三区| 中文字幕有码视频| 亚洲日本成人女熟在线观看| 吞精囗交69激情欧美| 欧美性xxxx69| 鲁大师成人一区二区三区 | www.久久草.com| 亚洲欧美久久234| 奇米亚洲午夜久久精品| 国产又黄又粗的视频| 色综合久久六月婷婷中文字幕| 深爱五月激情五月| 性欧美办公室18xxxxhd| 国产丝袜一区| 免费看黄在线看| www国产成人| 欧美激情黑白配| 亚洲免费av电影| 成人性生交大片免费网站| 欧美一级爽aaaaa大片| 久久一二三四| 久久久精品成人| 欧美日韩三级一区| 97caopron在线视频| av一区二区三区在线观看| 精品成人免费| 屁屁影院国产第一页| 欧美日韩一二三四五区| 欧美一区二区三区少妇| 国产精品户外野外| 国产欧美日韩免费观看| 日韩高清第一页| 亚洲精品国产精品乱码不99| www.亚洲欧美| 97在线视频免费观看| 女厕嘘嘘一区二区在线播放 | 九9re精品视频在线观看re6 | 美女网站视频黄色| 亚洲欧美在线视频观看| 精品乱子伦一区二区| 97欧美精品一区二区三区| 免费久久精品| 人人爽人人爽av| 欧美日韩中文字幕在线| 9色在线视频| 岛国视频一区| 久久人人精品| 国产亚洲精品久久久久久豆腐| 日韩欧美一区二区三区在线| 超碰在线99| 日本在线视频不卡| 国产99一区视频免费| 日韩手机在线视频| 久久亚洲影音av资源网| 色综合久久中文|