osFoundry / Platform
リアルタイムデータチャネル
少なくとも1回配信、履歴リプレイ、サブスクライバー単位カーソルを備えたPub/Subチャネル。
概要
リアルタイムデータチャネルは、ワークスペースの各部品のあいだでイベントを流すためのosFoundryのメッセージング基盤です。エージェント、実行中のアプリ、コードのプロセス、チャットといったあらゆる生産者が、名前の付いたチャネルにメッセージを発行すると、そのチャネルを購読しているすべての受信者にメッセージが届きます。これは古典的なPub/Sub(発行/購読)モデルであり、生産者と消費者が疎結合になっているため、発行側のコードに手を入れずに購読者を追加したり外したりでき、ひとつのイベントを多数の読み手へ一度に配信できます。
配信はat-least-once(最低1回)です。いったん発行されたメッセージは、再接続や再起動をまたいでも各購読者に必ず届きます。その代わり、同じメッセージが購読者に二重に見えることがまれに起こるため、消費者側はハンドラを冪等に保つ必要があります(メッセージIDを鍵にするか、自然キーで重複を排除してください)。チャネルは、メッセージを読んだ瞬間に捨てるのではなく履歴を保持します。これによって2つのことが可能になります。ひとつはリプレイで、購読者はライブで届くものだけを見るのではなく、チャネルから過去のメッセージを読み直せます。もうひとつは購読者ごとのカーソルで、各購読者が自分の読み取り位置を独立して管理します。カーソルがあるおかげで、処理が遅れたり切断したり後から起動したりした購読者も、中断したところから正確に再開できますし、同じチャネルの2つの購読者がストリーム上のまったく異なる地点にいても、互いに干渉することはありません。
osFoundryはBYOK(キー持ち込み型)でローカルファーストのデスクトップ・ワークスペースなので、このデータプレーンは、自分で用意してシートごとに課金される外部のメッセージブローカーを経由するのではなく、作業のすぐ隣で動きます。チャネルは、変化が起きたその瞬間に反応する必要がある機能を支える配管です。処理すべき新しい項目を監視するエージェント、上流のデータが届いた瞬間に更新するアプリ、あるステージが次のステージへ引き継ぐパイプラインといった部品が、ポーリングや密結合なしに通信でき、しかもデータは手元のデバイスに留めておけます。
主な機能
- Pub/Subチャネルが生産者と消費者を疎結合にするため、発行側のコードを変えずに、ひとつの発行イベントをすべての購読者へ配信できます
- at-least-once配信により、メッセージは再接続や再起動をまたいでも失われません。同じメッセージがまれに重複するので、消費者は冪等に設計してください
- 履歴リプレイにより、購読者はライブの流れを追うだけでなく過去のメッセージを読み直せます。後から参加したケースや再処理に役立ちます
- 購読者ごとのカーソルが各読み手の位置を独立して追跡するため、遅延・再起動・後発の購読者も中断した位置から正確に再開します
- エージェント、アプリ、コード、チャットを共有のローカルファーストなデータプレーンでつなぎます。用意すべき外部ブローカーもシート課金もありません
活用例
- エージェント開発者: エージェントが受信タスクのチャネルを購読して1件ずつ処理し、再起動後もカーソルから再開して、取りこぼしや二重処理なく作業を続けます
- アプリ開発者: ワークスペースのアプリがチャネルを購読し、タイマーでポーリングする代わりに、上流データが発行された瞬間に表示を更新します
- パイプライン作者: ステージ1が結果をチャネルへ発行し、ステージ2がそれを消費します。ロジック変更後に履歴を再処理したいときはリプレイも使えます
よくある質問
at-least-once配信は自分のコードにとって何を意味しますか。
発行されたメッセージが切断や再起動をまたいでも各購読者に届くことを保証しますが、まれに同じメッセージを2回以上受け取ることがあります。ハンドラを冪等にして(メッセージIDや自然キーで重複を排除して)、重複が二重計上ではなく無害になるようにしてください。
新規または再起動した購読者は、見逃したメッセージに追いつけますか。
はい。チャネルは履歴を保持し、各購読者は自分のカーソルを持ちます。後から参加したり再起動後に戻ってきたりした購読者も、過去のメッセージをリプレイして、接続中に届いた分だけでなく最後に記録した位置から再開できます。
同じチャネルの2つの購読者はストリーム上の位置を共有しますか。
いいえ。カーソルは購読者ごとなので、各読み手が独立して進みます。同じチャネルで一方が最新のメッセージまで追いついていて、もう一方はまだ古い履歴を処理していても、互いに影響しません。