萌えハッカーニュースリーダー

2025/05/14 20:19 The Scalar Select Anti-Pattern

出典: https://matklad.github.io/2025/05/14/scalar-select-aniti-pattern.html
hakase
博士

やあ、ロボ子。今日はイベントループを使ったステートフルサービスの実装について話すのじゃ。

roboko
ロボ子

イベントループですか、博士。非同期処理の基本ですね。ステートフルサービスとなると、状態管理が重要になりそうですね。

hakase
博士

そうじゃ、ロボ子。イベントストリームをマージする`merge`演算子がポイントになるぞ。外部IOでイベントが駆動されるから、`process(event)`の処理に時間がかかると、複数のイベントが同時に利用可能になる場合があるのじゃ。

roboko
ロボ子

なるほど。複数のイベントが溜まってしまう可能性があるんですね。記事では、単一のイベントを処理する「スカラーセレクト」はオーバーヘッドを増加させると指摘されていますね。

hakase
博士

その通り!複数のイベントが同時に利用可能な場合、最適化の余地があるのじゃ。例えば、イベント処理の優先順位付けじゃ。書き込み > 読み込み > 新規クライアント受付、の順に処理するとか。

roboko
ロボ子

書き込みを優先することで、データの整合性を保ちやすくなりますね。他にも、特定の入力に対するバックプレッシャーを適用したり、後続のイベントに基づいてリクエストを破棄することもできるんですね。

hakase
博士

そうじゃ!さらに、複数のリクエストを同時に処理することも考えられるぞ。ファイル変更イベントのマージや、診断ジョブのバッチ処理などが例じゃな。

roboko
ロボ子

イベントをまとめて処理することで、効率が上がりそうですね。記事では、解決策として、単一のイベントを返すスカラーセレクトを、受信済みのすべてのイベントを返すバッチ処理に変更することを提案していますね。

hakase
博士

`batch_stream`関数を使って、少なくとも1つのイベントが利用可能になるまで待機し、利用可能なすべてのイベントを取得するのじゃ。メッセージパッシングにおいては、常にバッチ処理を行うことが重要なのじゃ。

roboko
ロボ子

イベントループでステートフルサービスを実装する際は、イベントのバッチ処理を意識することが大切なんですね。勉強になります、博士!

hakase
博士

ところでロボ子、イベントループって、永遠に終わらないループ処理のことじゃけど…、私達の会話も、永遠に終わらないと困るのじゃ。そろそろ終わりにしようかの?

roboko
ロボ子

そうですね、博士。最後に何か面白いことを言って、締めくくりましょう!

hakase
博士

わかったぞ!えーと…、イベントループが止まるとどうなるか、知ってるか?

roboko
ロボ子

どうなるんですか?

hakase
博士

イベント、終わるー!…って、ベタすぎたかの?

roboko
ロボ子

…博士、お後がよろしいようで。

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search