好吧,首先你不能保證任何東西在一個不可靠的鏈接。 Two Generals' Problem證明了這對於確定性和非確定性協議。你所能做的就是將不可靠性降低到可接受的程度。
最簡單的方法是,在你的情況下,一旦服務器收到一個輪詢請求,它會發送x
數量的回覆,全部使用相同的GUID
。例如。
S: B, anything new?
S: B, anything new?
S: B, anything new?
B: Yes, S, I need a jacket (order #123).
S: B, anything new?
B: Yes, S, I need a jacket (order #123).
S: B, anything new?
B: Yes, S, I need a jacket (order #123).
S: B, anything new?
B: Yes, S, I need a jacket (order #123).
B: Yes, S, I need some shoes (order #124).
S: B, anything new?
B: Yes, S, I need a jacket (order #123).
B: Yes, S, I need some shoes (order #124).
S: B, anything new?
B: Yes, S, I need some shoes (order #124).
S: B, anything new?
B: Yes, S, I need some shoes (order #124).
...
S
可以收到大量郵件與訂單,但由於#與每個請求一起發送,這不是什麼大不了的事。如果我們之前錯過了,我們現在就得到它。如果我們沒有得到它,嗚呼!我們現在擁有它。系統工作!在我的示例中,您會注意到B
發送消息5
次。在現實的情況下,您可能會發送數百或數千次的消息,直到您獲得所需的可靠性。
現在上述解決方案是處理和帶寬密集型,但它確實工作。一個更聰明的方法是做TCP的工作:有一個三方握手。
S: Hello B. Are you there? -> SYN
B: Hello S, yep I'm here. What's up? -> SYN+ACK
S: Oh good, you're there. -> ACK
S: B, anything new?
B: Yes, S, I need a jacket (order #123).
但HTTP ..已經這樣做。所以如果有什麼東西沒有到位,你會知道的。連接超時,連接斷開等。
現在,您可以在應用程序級別(輸入WS-ReliableMessaging)中重新編寫這些方案,但確實TCP已經可靠。對這些SOAP(ish)框架和人造協議(他們通常在HTTP之上工作)的一些批評者指責他們在更高級別的抽象層面上本質上重塑了輪子 - 輪子的問題。
底線是任何系統都可能失敗,包括可靠的消息傳遞系統。
就最終一致性而言,我想你可能會感到困惑。最終的一致性僅適用於分佈式存儲系統,在Write()
之後,您可能無法確定性檢索Read()
一段時間。這看起來並不像你的問題。我的意思是,我看到你在說什麼,但是在一個eventually consistent
系統中,假設節點之間有可靠的(足夠的)連接。你不會做出這樣的假設(即使我認爲你應該...... TCP是相當可靠的)。
在e分佈式系統中,單調遞增的ID有些困難,但是我們可以額外添加:「我現在已經存儲了消息,可以刪除它」請求。 – max 2010-10-27 09:37:11
++爲網絡服務 – 2010-11-09 16:43:17
您能否給我一個「Web服務」的例子,WS- *堆棧似乎給我一個不兼容的複雜混亂,但這可能只是我缺乏經驗。我在哪裏可以找到Github上的WS- *的Ruby/Python/PHP/Perl庫? – max 2010-11-11 19:00:29