Go的”SingleFlight”库可以在一次调用中完成并行函数调用,非常方便

Go语言中的并发函数库”SingleFlight”非常方便,可以在一次调用中完成。

太长没时间阅读。

    高頻度に叩かれがちな重めの取得系関数呼び出しはSingleFlight を使おう!

動機是什麼嗎?

    Cacheが切れた途端Mysqlに大量のアクセスが流れ込み、LAが上がる現象をどう回避しようか考えていたときに、SingleFlight というライブラリを見つけたため使えるか計測してみた。

SingleFlight是什么?

    • 複数人が同じ関数呼び出しを同時にした場合、最初の1人だけ関数を実行し、残りの人は、最初の人が実行した関数呼び出しが終了するまで待機し、最初の1人が関数呼び出しの結果を取得したら、待機してる残りの人に結果をシェアしてくれる。

 

    • Goからリソースへのアクセスが同時に行われても、1本だけでよくなるから嬉しい。効率的。

 

    もちろんイミュータブルな関数じゃないと使えない。

测量环境

测量对象

    3本のMysqlQueryを叩き、合計が500ms位かかるGo API

测量工具

    vegeta

测量指令

    秒間100リクエスト を1分間 (叩きすぎかな?)
echo "GET http://localhost:1323/hoge" | vegeta attack -duration=1m -rate=100 | vegeta report -reporter=plot > plot.html

计量模式

    1. 只需要一种选择:

1. 在中文中进行改述:
直接使用
插入一个每10秒重置的MemCache
插入SingleFlight
插入每10秒重置的MemCache + SingleFlight

测量结果

vegeta-plot-cache10s-singleflight.png

底线

    重めのMysqlを叩く + 高頻度リクエスト => SingleFlightは必須。
bannerAds