2012-11-19 81 views
0

我有一個Netty客戶端向TCP Netty服務器異步發送消息。排隊消息以防止服務器故障

爲了維護訂單,服務器ChannelPipeline有和ExecutionHandler加上OrderedMemoryAwareThreadPoolExecutor

我的理解是發送到服務器的消息在通道中排隊。如果服務器在通道中排隊的消息中死掉,我需要防止消息丟失。

我目前的解決方案是將每條消息添加到客戶端的一個隊列中,並且只有當我收到來自服務器的每條消息的確認消息時,纔將它們從隊列中刪除。你怎麼看?

回答

1

你的建議是相當普遍的,有時被稱爲發送窗口。我之前使用過類似的技術,雖然我將發送的消息存儲在地圖中,因爲服務器理論上可以處理並按順序確認它們。

TCP使用類似的技術,像SMPP這樣的協議,甚至允許異步發送的JMS提供者(例如HornetQ)。 HTTP流水線是相似的,但這確實需要按順序處理和確認請求。

你必須考慮的一件事是服務器用重發消息做什麼。它可能已經處理了原始消息,但是在到達客戶端之前ack已經丟失。例如,如果消息請求某種付款,您不希望兩次向該人收費,因爲ack丟失了。