Google Cloud Pub/Sub のat-least-onceってどれくらい重複するの?
Google Cloud Platform その2 Advent Calendar 2018の15日目の記事です。
Google Cloud Pub/Sub とは
Google Cloud Pub/SubはGCPの非同期メッセージングサービスです。 Pub/Subの概念の詳細やユースケースついてはGoogle Cloud Pub/Subのドキュメントに書いてあるのでそちらをご覧ください。
at-least-once配信
Cloud Pub/Subの特徴としてat-least-once配信があります。 at-least-once配信とはメッセージが1 回以上配信することを指します。
ドキュメントの中のサブスクライバーガイドには以下のように書かれています。
通常、Pub/Sub は各メッセージを公開された順序で 1 回配信します。ただし、メッセージが順不同で配信される場合や複数回配信される場合があります。通常、複数回の配信に対応するには、メッセージの処理時にサブスクライバーがべき等である必要があります。Google Cloud Pub/Sub メッセージ ストリームを 1 回だけ処理するには、Cloud Dataflow の PubsubIO を使用します。
これがなかなか厄介です。
そもそもat-least-once配信って言うけど実際どのくらい重複が起きるの? という疑問がある。
そこで以下のような検証をしてみた。
検証
順序が分かる10万件のデータをPublishし、その後すべてSubscribeする。
10万件Publishするスクリプト gist.github.com
すべてSubscribeするスクリプト gist.github.com
結果
10万件だと重複はなかった。 Rubyの処理速度だと重複があまり起きない? 100万件でやろうとしたけど時間がかかるのでまた別の機会に...
ただ気になったのは1回のpullで取ってくる件数。 maxで1000件まで取ってくる設定にしていたが、以下のように件数が上下していた。
10回の単純移動平均をとると
途中で200件が続いてるのが気になる... 過去にCloud Pub/Subを使っていてデータがあるのに0件で返ってくるケースもあったので、pullするときの件数はばらつきがあるみたいだ。
順序性を保証しようとするとどれくらいパフォーマンスが落ちるのかなど調べたいことはまだあるのでまた調査したい。