あなたの最初の質問については:あなたが(nc.Request
を使用して)、タイムアウトで要求メッセージを公開しようとしているように私には思えます。その場合、タイムアウトはクライアントによって管理されます。効果的に、クライアントは要求メッセージを発行し、応答サブジェクトにサブスクリプションを作成します。サブスクリプションがタイムアウト内にメッセージを受け取らない場合は、タイムアウト条件を通知し、返信サブジェクトから退会します。
2番目の質問では、キューグループを使用していますか? NATSのキューグループは、キューグループ名を指定するサブスクリプションです。同じキュー・グループ名を持つすべてのサブスクリプションは、サーバーによって特別に扱われます。サーバは、メッセージが到着すると、その間に回転するようにメッセージを送信するために、キューグループ購読の1つを選択します。ただし、サーバーの責任は単にメッセージを配信することです。
タイムアウトと最大数1のメッセージを使用して、要求/応答を使用して機能を実装してください。タイムアウト後に応答がない場合、クライアントは何らかの遅延や要求メッセージを再送信できます。他のタイプの回復ロジックを実行します。返信メッセージは、メッセージが適切に処理されたことを知るための「プロトコル」でなければなりません。これがメッセージングアーキテクチャの設計に反映されることに注意してください。たとえば、要求受信者がメッセージを受信して処理した後で、クライアントまたはサーバーが応答を公開する前に、タイムアウトが発生する可能性があります。その場合、要求送信者はその差異を知ることができず、最終的に再発行することになります。これは、そのようなタイプの相互作用が重複した副作用を防ぐために要求を冪等価にする必要があることを示唆しています。
NATS Streaming Serverにもキューがあり、* ManualAck *という名前のオプションと再配信の動作があります(https://github.com/nats-io/nats-streaming-server/issues/186を参照)。 ) –