2009-07-21 74 views
6

使用套接字在兩臺服務器之間發送數據是一個好主意,還是應該使用類似MQ的東西來移動數據。插座是否可靠?

我的問題:如果我只需要一次/確保數據交付,套接字是否可靠?

還有其他解決方案嗎?

謝謝。

+1

...的插座可靠嗎? – 2009-07-21 07:30:08

+2

@modosansreves:只要第一個字母和最後一個字母就位,只要拼寫的單詞清晰可讀,那麼不正確的語法就不會傷害太多。專注於信息而不是單個單詞。 – 2009-07-21 08:28:36

回答

12

套接字是用於執行網絡通信的應用程序級API。套接字的可靠性取決於您在創建套接字時選擇的網絡協議。如果您選擇TCP/IP,您將獲得「可靠」的傳輸......達到極限。如果你選擇UDP/IP,你會得到「不可靠」的傳輸。

在其他的答案說,TCP確保不會丟失或損壞的數據到一個點:

  1. ,如果有一個足夠長的網絡 停運,或發送者或接收者 死一TCP/IP連接將中斷 ,除非您的步驟 重新啓動 連接,否則將丟失數據。
  2. 如果存在網絡 級別數據損壞,則存在由校驗和檢測到的 小概率。

對於比TCP/IP提供的更高級別的可靠性保證,您需要在應用程序的基於Socket的網絡層頂部實現更靈敏的校驗和和保證傳送機制。或者使用消息排隊產品,爲您做好工作。

所以你的問題的答案是,它取決於你如何使用套接字,以及你的系統需要什麼級別的可靠性。

2

套接字與您的實現一樣可靠,並且基於底層硬件。如果你不想讓保證送貨服務的麻煩(在什麼條件下?100%永遠不會發生),消息隊列系統是一個不錯的選擇。消息隊列將實現所有的持久性,排隊,重試等,如果你使用標準套接字,你需要實現自己。

2

如果您需要有保證的交付,無論發生什麼事情(比如如果另一方爲了維護而下線)並且您不想自己編寫所有邏輯,那麼您應該使用MQ。套接字是您用來連接到另一方的信息,無論該方是MQ還是郵件的最終接收方。

1

套接字是傳輸數據的原始機制。其他一切都在此基礎上實施。在OSI network model中,它們屬於第4層。雖然它們實現可靠的端到端連接,但它們很少用作最終協議。你幾乎總是需要實現一個應用程序層。這將取決於您的應用程序(您是否需要傳輸文件或僅發送消息)和您的網絡基礎設施。

0

如果使用stream socket,則TCP協議確保數據在傳輸過程中不會丟失,並且不太可能被破壞(儘管您必須決定其16位校驗和是否足夠,或者您需要應用層校驗和機制) 。

MQ系統提供什麼,以及您可能需要或可能不需要的是應用程序級別的可靠性,即即使面對間歇的硬件或軟件故障也能保證交付。

0

根據數據類型的不同,簡單的Web服務可能是最快的解決方案。他們相對容易設置和測試。雖然對於一些特定的例子,我需要知道你正在運行的是什麼樣的數據和環境。

0

這取決於您正在開發的應用程序的類型。它正在編寫一個程序,您需要對發送的消息進行響應或確認,然後TCP套接字就很好。但是,如果您正在實施某種工作流類型的場景,則應該使用消息隊列。

2

套接字是可靠的,因爲每個通信都在其上完成,包括MQ。

但是,您可能希望使用MQ添加一些保證的交付以提高應用程序的可靠性。它是什麼?保證送達確保消息至少處理一次,不超過一次。 消費者是否關閉?製片人關閉了? MQ服務器關閉了?磁盤崩潰了?感謝MQ,不管發生什麼情況,都不會丟失任何消息(前提是管理員知道他的工作)。 除此之外,如果您重新啓動使用者,則不會處理兩次消息。如果消息包含百萬美元的轉移,這可能很重要。 但它並不保證你的消息在可處理的時間內被處理。並且處理時間有時候更重要,因爲您的應用程序會提供保證的交付。

您可以根據自己的需要選擇最佳的服務器通信方式。保證交付交付既有財務成本,也有性能成本,所以只有在真正需要的情況下才能使用(例如以百萬美元爲單位)。

對於大多數應用程序,只有在失敗時重試消息才能獲得滿意的結果。但這不是真正的只有一次保證的交付。不要試圖自己來實現它,這是一件非常困難的事情,只有少數人能夠實現。考慮重新開發像MQ或Apache AQ這樣複雜的軟件是徒勞的。

希望有所幫助。

  • 傑布