0

NettyクライアントがTCPNettyサーバーに非同期でメッセージを送信しています。

ChannelPipelineサーバーの順序を維持するためにExecutionHandlerOrderedMemoryAwareThreadPoolExecutor

私の理解では、サーバーに送信されたメッセージはチャネルのキューに入れられます。メッセージがチャネルにキューイングされている間にサーバーが停止した場合、メッセージの損失を防ぐ必要があります。

私の現在の解決策は、各メッセージをクライアント側のキューに追加し、サーバーから各メッセージのAckメッセージを受信したときにのみキューから削除することです。どう思いますか?

4

1 に答える 1

1

あなたが提案していることはかなり一般的であり、送信ウィンドウとして知られていることもあります。以前も同様の手法を使用しましたが、送信されたメッセージをマップに保存しました。これは、サーバーが理論的にはメッセージを順不同で処理および確認できるためです。

TCPは、SMPPのようなプロトコルや非同期送信を許可するJMSプロバイダー(たとえば、hornetQ)と同様の手法を使用します。HTTPパイプラインも同様ですが、リクエストを順番に処理して確認する必要があります。

考慮しなければならないことの1つは、サーバーが再送信されたメッセージをどのように処理するかです。元のメッセージはすでに処理されている可能性がありますが、クライアントに到達する前にackが失われました。たとえば、メッセージが何らかの支払いを要求している場合、ackが失われたため、その人に2回請求することは望ましくありません。

于 2012-11-22T12:18:45.577 に答える