2017-08-11 76 views
0

我們想開發一個基於微服務體系結構的應用程序。 要異步地在各種服務之間進行通信,我們計劃使用消息隊列(如RabbitMQ,ActiveMQ,JMS等)。有消息隊列可用於實現進程間通信嗎?沒有消息隊列的進程間(服務)通信

謝謝。

回答

1

您應該使用隊列來處理不需要實時完成的任務。

追加隊列中的任務,當有空間時,處理器將從隊列中取任務並處理&將從隊列中移除。

例子:

  1. 假設與影像應用程序交易,用戶上傳這麼多的圖片。上傳隊列中的任務以壓縮圖像。當處理器空閒時,它將壓縮排隊的圖像。

  2. 當您想要寫入某種類型的系統日誌時,將其提供給隊列,一個進程將從隊列中取出日誌並將其寫入磁盤。所以主流程不會浪費時間進行I/O操作。

建議:

如果你想實時響應,你不應該使用的隊列。你需要不斷地對隊列進行ping讀取,這是不好的做法。並且不保證隊列會立即處理您的任務。

因此,解決方案是:

  1. Redis的緩存 - 你可以把你的消息到緩存和其他進程將讀取該消息。 Redis是「內存數據結構」。它非常快速且易於使用。互聯網上的圖書館和資源過多,因爲它是開源的。 Read more about Redis.但是在這裏,您還需要檢查是否有某種可用的消息,並且如果可以從中讀取,處理並給出響應。但從Redis中讀取,並不是很昂貴。使用redis,您不需要擔心內存管理,它可以很好地由開源社區管理。

  2. 使用插座。套接字速度非常快,你可以使這個輕量級(如果你想),因爲它是基於事件的。一個進程將ping端口,其他進程將監聽並給出響應。但是你需要管理內存。如果緩衝內存已滿,則不能在此處放置更多消息。如果有這麼多用戶生成郵件,則需要設法向誰回覆。

所以這取決於你的需求,就像你要不斷地讀取消息?你想使一對一通信或多對一的溝通?

+0

謝謝烏賈瓦爾。安裝了各種傳感器,這些傳感器將定期發送數據(也可根據某人的事件或請求)發送數據。我們希望獲得數據和流程,並堅持並進行操作。爲了解決這個問題,我們需要一個更具擴展性和高效率,鬆耦合的解決方案。 – JavaUser

+0

所以這是多對一的。 你是否需要實時做這個程序?通過套接字,你可以做到實時(傳感器將在套接字上發出請求,而在另一側上,進程將監聽,操作和完成請求),使用redis可以將數據放入緩存中,當需要時,從中獲取數據並使用,因此讀取速度會變得很快,並及時存儲到數據庫中。這兩件事都是可擴展的。我可以使用緩存來存儲FB喜歡更快的訪問,我可以使用套接字使進程異步,所以它取決於你如何製作。 –

+0

@Ujjaval Moradiya你能否詳細說明陳述「你應該使用隊列來處理不太重要的任務(..)」。在我看來,隊列比直接通信更可靠(如REST或基於套接字)。請記住,您也可以使用某些產品的pub-sub功能,這樣就不需要頻繁組合了。 –