国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

請求量太大下游扛不住怎么辦?進來學一招

開發 前端
如果只是改邏輯合并一下請求,吭哧吭哧改代碼就完了,也不值得寫這篇文章了,如何改最少的代碼來實現合并請求才是最難的。

背景

這個問題簡單說一下背景,如果不明白可以看上篇文章 ,不想看也沒關系,這是個通用的解法,后面我會總結抽象下。

在上篇文章的最后提到對每個摘除的地址做決策時,需要順序執行,且每一個要摘除的地址都要實時獲取該集群的地址信息,以便做出是否需要兜底的決策。

當被摘除的機器非常多時,獲取地址信息的請求量就會非常大,對注冊中心造成了不小的壓力。

請求數據源的接口如下所示(其中 cuuid 是集群的 id)

type Read interface {
ListClusterEndpoints(ctx context.Context, cuuid string) ([]ptypes.Endpoint, error)
}

相信大家也能理解這個非常簡單的背景并且能想到一些解法。每次決策需要按 cuuid 獲取集群,也就是單個單個地獲取實時集群地址信息,由于是實時信息,緩存首先排除,其次自然而然地能想到如果能將請求合并一下,是不是就能解決請求量大的問題?

難點

如果只是改邏輯合并一下請求,吭哧吭哧改代碼就完了,也不值得寫這篇文章了,如何改最少的代碼來實現合并請求才是最難的。

解法

那天遇到這個問題,晚上輾轉反側想到了這個解法,其實主要也是參考 Go http client 的實現,都說看源碼沒用,這不就是用處么?

Read? 數據源接口定義保持不變,也就是上層的業務代碼完全不用改,只需要把 ListClusterEndpoints 的實現換掉。

我們可以用一個隊列把每個請求入隊,入隊列以后,調用方阻塞,然后起一些協程去隊列里取一批請求參數,發起批量請求,響應之后喚醒阻塞的調用方。

圖片

為此,我們實現一個可以阻塞并被其他協程喚醒的工具:

type token struct {
value interface{}
err error
}

type Token chan token

func NewToken() Token {
return make(Token, 1)
}

func (t Token) Done(value interface{}, err error) {
t <- token{value: value, err: err}
}

func (t Token) Wait(timeout time.Duration) (value interface{}, err error) {
if timeout <= 0 {
tk := <-t
return tk.value, tk.err
}

select {
case tk := <-t:
return tk.value, tk.err
case <-time.After(timeout):
return nil, ErrTokenTimeout
}
}

其次,定義隊列和其他參數:

type DataSource struct {
paramCh chan param
readTimeout time.Duration
concurrency int
step int
}

type param struct {
cuuid string
token Token
}

替換掉原來 ListClusterEndpoints 的實現:

func (p *DataSource) ListClusterEndpoints(ctx context.Context, cuuid string) ([]ptypes.Endpoint, error) {
req := param{
cuuid: cuuid,
token: NewToken(),
}

select {
case p.paramCh <- req:
default:
return nil, fmt.Errorf("list cluster endpoints write channel failed")
}

value, err := req.token.Wait(p.readTimeout)
if err != nil {
return nil, err
}
eps, ok := value.([]ptypes.Endpoint)
if !ok {
return nil, fmt.Errorf("value is not endpoints")
}
return endpoints, nil
}

再起幾個協程來處理任務:

func (p *DataSource) startListClusterEndpointsLoop() {
for i := 0; i < p.concurrency; i++ {
go func() {
for {
reqs := p.getListClusterEndpointsReqFromChan()
p.doBatchListClusterEndpoints(reqs)
}
}()
}
}

最關鍵的是 getListClusterEndpointsReqFromChan 的實現,既不能讓協程空跑,這樣太消耗cpu,又要能及時地取到一批參數,我們采取的方法是先阻塞地獲取一個參數,如果沒數據則阻塞,如果有數據,繼續取,直到數量達到上限或者取不到數據為止,此時這一批數據就可以批量地進行調用了。

func (p *DataSource) getListClusterEndpointsReqFromChan() []param {
reqs := make([]param, 0)
select {
case req := <-p.paramCh:
reqs = append(reqs, req)
for i := 1; i < p.step; i++ {
select {
case reqNext := <-p.paramCh:
reqs = append(reqs, reqNext)
default:
break
}
}
}
return reqs
}

最后

這個方法很簡單,但是有一些要注意的地方,得做好監控,比如調用方單個請求的QPS、RT,實際批量請求的QPS、RT,這樣才好計算出處理協程開多少個合適,還有隊列寫入失敗、隊列長度等等監控,當容量不足時及時做出調整。

責任編輯:武曉燕 來源: 捉蟲大師
相關推薦

2020-10-20 08:01:30

MySQL密碼Windows

2021-11-22 11:30:37

JavaScript代碼瀏覽器

2023-10-06 20:52:47

2020-07-24 07:38:20

Nginx并發量日志

2021-10-08 08:58:35

MySQL函數脫敏

2021-03-06 09:54:22

PythonHTTP請求頭

2018-05-23 16:56:40

戴爾

2013-07-30 11:24:33

SAP“簡化IT 一招

2021-04-16 23:33:48

區塊鏈安全私鑰

2022-05-10 07:31:49

消息隊列CPUQPS

2021-06-01 22:20:07

私鑰互聯網安全

2021-11-28 17:01:49

工業公司網絡攻擊黑客

2021-10-17 07:14:08

Windows 11操作系統微軟

2017-05-31 12:52:55

大數據數據文件解決思路

2020-08-13 13:41:31

Python數據密度散點圖

2021-01-29 07:45:27

if-else代碼數據

2023-09-08 15:48:13

2017-11-02 13:35:39

2025-07-08 09:33:08

2018-10-10 14:34:27

ARM嵌入式系統硬件
點贊
收藏

51CTO技術棧公眾號

麻豆成人av在线| 亚洲一区高清| 久久av在线| 国产精品无码av无码| 欧美在线不卡一区| 成人免费一区| 91tv亚洲精品香蕉国产一区7ujn| 久久精品成人| 成人黄动漫网站| 亚洲福利在线视频| 欧美在线电影| 日韩视频一二三| 日韩欧美高清在线视频| japansex久久高清精品| 欧美日韩亚洲免费| 亚洲综合精品自拍| 成人网av.com/| 婷婷五月色综合| 婷婷综合五月天| 国产日韩在线观看视频| 欧美在线播放一区二区| 亚洲国产精品一区二区www| 456成人影院在线观看| 国产高清自拍一区| 亚洲图片激情小说| 久久久久黄色| 精品一区二区三区日本| 国产精品乱码人人做人人爱| xxxx在线视频| 自拍视频在线观看一区二区| 99视频在线免费| 久久久最新网址| 亚洲毛片在线免费观看| 欧美国产亚洲精品| 夜夜春亚洲嫩草影视日日摸夜夜添夜| 天天综合天天做天天综合| 国产精品一站二站| 一本一道久久a久久精品综合| 日韩欧美亚洲综合| 亚洲小说图片视频| 日本www.色| 九九九久久久久久| 久久精品免费看| 日本中文字幕在线看| 国产精品亚洲片夜色在线| 2021国产精品久久精品| 中文字幕这里只有精品| 日韩欧美国产二区| 51午夜精品国产| 亚洲欧洲综合| 国产中文在线视频| 成人午夜在线影院| 福利视频第一区| 欧美1级日本1级| av网在线观看| 精品无人乱码一区二区三区的优势 | 国产成人精品影视| www欧美xxxx| 天堂一区二区三区| 91精品欧美一区二区三区综合在 | 欧美人与性动交α欧美精品图片| 国产精品日韩一区二区免费视频| 大荫蒂欧美视频另类xxxx| 精品国产91| 992tv在线观看免费进| 国产精品电影网| 一区二区在线看| 欧美综合精品| 2018av男人天堂| 午夜精品久久久久久久久久久久| 中文欧美字幕免费| 先锋影音国产精品| 在线免费观看高清视频色| 成人午夜在线影院| 欧美日韩亚洲综合一区| 久久精品盗摄| 成人性生活视频| 免费看毛片的网址| 久久91亚洲人成电影网站| 久久免费国产精品| 日本精品影院| 亚洲52av| 欧美高清一区二区| 亚洲欧美国产另类| 国产视频一区二区在线观看| 国产精品亚洲人成在99www| 污视频网站在线| 精品婷婷色一区二区三区蜜桃| 日韩亚洲欧美成人一区| 国产一区二区三区香蕉| 白嫩亚洲一区二区三区| 久久久久久77777| 国产欧美一区二区三区另类精品 | 亚洲福利在线看| 91美女福利视频| 深夜福利久久| 免费大片黄在线观看视频网站| 992tv成人免费观看| 久久免费精品日本久久中文字幕| 婷婷中文字幕一区三区| 奇米在线7777在线精品| 欧美影院精品| 国产资源在线观看| 欧美高清中文字幕| 国产精品成人国产乱一区| 欧美欧美欧美欧美| av不卡在线播放| 久久精品国产99久久| 97影院秋霞午夜在线观看| 久久这里只有精品23| 国产激情综合五月久久| 欧美成人国产一区二区| 国产精品三级久久久久三级| 国内精品久久久久国产盗摄免费观看完整版 | 国产精品亚洲一区二区三区| 欧美日韩精品一区二区天天拍小说 | 天堂资源在线亚洲| 黄在线免费观看| 午夜精品久久久久久久无码| 国产精品美女主播在线观看纯欲| 日韩欧美一区在线观看| youjizz久久| 精品成人一区| 日韩精品中文字幕吗一区二区| 九色在线观看| 日韩一级免费在线观看| 国产伦精品一区二区三区照片91| 北条麻妃在线一区二区| 欧美日韩国产区| 国产精品一级黄| 欧美aaaa视频| 成人看片在线观看| 头脑特工队2在线播放| 国产女主播自拍| 国产精品jizz视频| 欧美精品久久久久久久久久| 欧美xxxxxxxx| 亚洲午夜久久久久| 97久久精品人人爽人人爽蜜臀| 国色天香一区二区| 国产suv精品一区| 玖玖在线播放| 蜜桃视频在线播放| 久久久精品麻豆| 小说区视频区图片区| 91网免费观看| 91av国产在线| x99av成人免费| 亚洲精品成人久久久| 日本久久精品电影| 亚洲精品你懂的| 91影院在线观看| 麻豆精品视频在线观看免费| 中文字幕人成人乱码| 蜜桃视频欧美| 欧美成人家庭影院| 91九色porn在线资源| 在线看无码的免费网站| 欧美日韩国产精品一区| 亚洲成aⅴ人片久久青草影院| 在线观看污污视频| 涩涩涩视频在线观看| 国产精品久久久久av蜜臀| 91伊人久久大香线蕉| 精品国产91久久久久久久妲己 | av在线理伦电影| 久久综合av| 一级日本不卡的影视| 午夜免费久久久久| 国产区二区三区| 欧美做受69| 一区二区三区在线高清| 热99久久精品| а√天堂资源官网在线资源| 极品少妇一区二区| 日韩中文字幕免费看| 亚洲成年人专区| 粉嫩的18在线观看极品精品| 精品久久香蕉国产线看观看gif| 一区二区在线中文字幕电影视频 | 亚洲另类激情图| 色阁综合av| 欧美激情啪啪| 久久精品亚洲乱码伦伦中文| 欧美国产一区二区三区| 欧美激情精品久久久久久小说| avtt综合网| 久久综合99re88久久爱| 国内精品久久久久影院 日本资源| 中文字幕伊人| 日本欧美一区二区在线观看| 国产亚洲人成a一在线v站| 色戒在线免费观看| 国产日韩欧美一区二区三区在线观看| 2018日韩中文字幕| 筱崎爱全乳无删减在线观看 | 国产视频在线观看一区| 国产91在线播放精品| 亚洲免费在线看| 欧美黑人经典片免费观看|