非同期通信
ストリーム上の通信は非同期かつ双方向です。クライアントは各レコードの確認を待たずに継続的にレコードをプッシュし、サーバーはレコードが永続化されると同時に同じ接続経由で確認応答を返します。この分離により、単一のクライアントで高いthroughputを維持できます。バックグラウンドで確認応答が届く間も、プッシュを継続できるためです。

オフセットと確認ループ
ストリーム上のすべてのサブミッションには、単一のレコードであるかバッチであるかにかかわらず、そのストリーム内での位置を示す論理オフセットが割り当てられます。サーバーは、各サブミッションを個別に確認するのではなく、これまでに耐久性を確保した最も高いコミット済みオフセットを通じて、累積的な耐久性の進捗状況を報告します。オフセットは順序付けられているため、1 つの確認応答で、そのサブミッションとそれ以前のすべてのサブミッションが確定します。
これが確認応答ループであり、接続を高速かつ信頼性の高いものに保つ仕組みです:
- クライアントはレコードをプッシュし、ローカルのインフライトバッファに保持します。
- サーバーはレコードを永続的に保存し、コミットされた最新のオフセットを定期的に返送します。
- そのオフセットを受け取ると、クライアントはそれまでのすべてのバッファリングされたレコードを安全にパージします。これらのレコードは永続化されているためです。
Zerobus Ingest SDK を使用する場合、SDK がこのループを自動的に実行します。プロデューサーがプッシュを続ける間、バックグラウンドでオフセットの追跡、インフライトバッファの維持、および確認応答の処理が行われます。ループを自分で実装する必要はありません。オプションで制御できるのは、耐久性をどのように監視するかです:
- 送信を続けてください。SDKは確認応答が到着するたびに処理します。
- アプリケーションが特定のレコードの耐久性を待機する必要がある場合にのみ、 オフセットでブロック します。以下をご覧ください。
- 確認コールバックを登録する ことで、ブロックすることなく、確認やエラーに非同期で対応します。確認コールバックを参照してください。
オフセット追跡およびバッファリングのループを自身で実装するのは、SDK を使用しないカスタムクライアントを構築する場合のみです。
インフライトバッファは、構成可能なインフライトレコード制限によって制限されます。取り込みはバッファがいっぱいになるまで非同期で行われます。バッファがいっぱいになると、確認応答が到着してスペースが解放されるまで、取り込み呼び出しはブロックされます。ワークロードに合わせて制限を調整してください。また、バッファリングされたレコードはインフライト中にクライアントメモリを消費することに注意してください。オプションとそのdefaultについては、Zerobus SDK リポジトリを参照してください。
接続が中断された場合、インフライトバッファに残っているレコード(最後にコミットされたオフセット以降のレコード)は耐久性が確認されていないため、リプレイされる可能性があります。復旧および再試行パターンを参照してください。
確認応答は耐久性を保証するものであり、クエリ可能性を保証するものではありません。コミットされたオフセットは、それらのレコードが永続的に保存され、失われないことを意味します。Zerobus Ingest は、その直後の別のステップとして永続的なレコードを Delta テーブルにマテリアライズします。その時点で、データは約 5 秒でクエリ可能になります。レイテンシーの詳細については、レイテンシーを参照してください。
レコードの待機とthroughputの最大化
アプリケーションが特定のレコードの耐久性が確認されるまで後続の実行をブロックする必要がある場合(例えば、アップストリームシステムに作業完了を通知する前など)、レコードのオフセットで待機します。待機はアプリケーションレベルの同期に関するものであり、耐久性の要件ではありません。レコードは、ブロックするかどうかにかかわらず、確認ループを通じて耐久性を持つようになります。
Blocking has a throughput cost:
- 各レコードの後に待機すると、取り込みは実質的に同期ワークフローになります。 次のメッセージを送信する前に各メッセージでブロックすると、クライアントは Zerobus Ingest の完全な throughput に到達できなくなります。
- High-throughput ingestion is continuous and asynchronous. クライアントは、レコードごとに一時停止するのではなく、以前のレコードのグループに対する確認応答が到着する間もレコードを送信し続けます。アプリケーションがその保証を真に必要とするチェックポイントでのみ特定のオフセットを待機するか、確認コールバックを使用してブロックせずに進行状況を追跡します。
取り込み方法、オフセットでブロックするタイミング、および確認コールバックの仕組みについては、メッセージのブロックと確認を参照してください。
ストリームの順序付け
確認応答とオフセットはストリーム単位です。順序は単一のストリーム内では保証されますが、ストリーム全体でグローバルに保証されるわけではありません。ストリームごとの順序付けの仕組みと、それに基づいた設計方法については、順序保証を参照してください。