Hori Blog

フリーランスでバックエンドエンジニアとして活動している Ryota Hori のブログです。
最近はテック系記事より雑記ブログ気味。

eyecatch image of CA.go #2 で golang.org/x/sync について喋りました #ca_go

CA.go #2 で golang.org/x/sync について喋りました #ca_go

CA.go #2 - connpass にて golang.org/x/sync 以下にある 4 つのパッケージを用いて効率的に非同期処理をする技術についてお話しました。

登壇内容

golang.org/x/sync による効率的な非同期処理 と題し、 golang.org/x/sync の使い所と雑感、注意点について紹介しました。

sync - GoDoc

第一回で紹介した sync.Pool と同じく “明日から使える” 系です。

内容はスライドを参照いただければ問題ないかと思いますが、概要としては以下です。

  • golang.org/x は Go のプロジェクトではあるが標準パッケージとは別で管理されているライブラリ群
  • golang.org/x/sync は標準パッケージの syncsync/atomic に入れる前のおためし版的な扱いっぽい
  • syncmap は排他制御付きの map 。 Go 1.9 から標準パッケージの仲間入り
  • errgroupsync.WaitGroup みたいに全非同期処理が終わるまで wait するやつ。エラーが起きた場合、 context で cancel させて始めのエラーを返す
  • semaphore は重み付きの並列数管理。 context に対応しているので待ち時間のタイムアウトもできる
  • singleflight は並列に叩かれる処理で使うもので、1 つ目以外の処理リクエストは待たせておいて、1 つ目の処理が終わったら待たせていた他の処理リクエストにも戻り値を配ってくれるやつ。キャッシュ切れ時の origin リクエストに使ったりすると良さそう

どれも chan を使って自作できそうな(今までは自作していた)ようなものではありますが、特にトラブル時の問題切り分けを煩雑にしないためにも積極的に利用していきたいところです。

特にマイクロサービス構成の動画サービスでは各所で重いデータのリクエストや更新管理の難しいキャッシュデータが生まれがちなので、 singleflight は今後ぜひ使っていきたいなーと思っております。

スライドには使用イメージとしてサンプルコードも載せてありますので、ぜひ見ていただけると嬉しいです。

スライド制作

以前から使っている @ahomu さん製の Talkie をラップした、 talkiego で作りました。今回のスライドを作るにあたって highlight.js の Go 対応と、 serve コマンドのオプション指定機能を追加しました。

hori-ryota/talkiego: talkiego is wrapper for Talkie.

カスタムテーマは未対応ですが、カスタム CSS は対応してみたのでとりあえず色々とカスタムはできるはず。とはいえ自分はデフォルトでしか使っていないです。

お礼

前回に引き続き、今回も主催兼、司会兼、第一登壇者で参加させていただきました。登壇タイトルの更新が遅かったり、登壇者の入れ替えがあったり、ご迷惑をおかけいたしました。

ポツポツと雨が降っているにも関わらず多くの方々に足を運んでいただき嬉しく思っております。ぜひ今後も有益な情報を提供できるよう尽力してますので、今後とも宜しくお願いいたします。

次回からは登壇からは身を引いて、運用に回ろうかなーと思っております(といいつつまた出てくるかもです)。

また 2,3 ヶ月後に第三回を実施したいなーと思っています。よろしくお願いいたします!