2014-04-01 52 views
8

使用消息隊列進行同步RPC調用我有一個使用jQuery的自動完成插件,它本質上是通過AJAX發送包含文本的請求已被輸入到一個文本框到我們的網站服務器的Web應用程序,一旦網絡服務器收到這個請求,然後把它交給rabbitmq。是否適合通過AJAX

我知道我們確實從使用消息傳遞中獲得好處,但好像使用它來阻止rpc調用是一種誤用,像WCF這樣的東西在這種情況下更合適,是這種情況還是被認爲是可以接受的建築?

+0

很顯然,這取決於你的應用程序,你可以使用隊列中的RPC調用,但我認爲這不是它的自然使用。爲了幫助你,我有兩個問題: 1.你爲什麼使用同步呼叫? 2.您的當前應用程序有問題嗎? 無論如何,我不知道你在開發應用程序的語言,但我認爲你可以使用RabbitMQ的異步調用,並使用Spring DeferredResult等技術從隊列中獲取結果。 我不太喜歡同步調用,因爲你無用地阻塞了線程(例如在數據庫搜索期間)。 – Gabriele

+0

1.我們有自動完成插件的同步調用,你必須對請求有一個響應2.除了我認爲在這種情況下濫用消息,我不想改變它,而且我正在尋找爲證據支持這一變化。 – nickbw

回答

3

這是可能的執行與RabbitMQ的RPC同步請求。它的解釋非常好,其缺點包括!所以它被認爲是可以接受的架構。不鼓勵,但只要同步響應是強制性的就可以接受。

,作爲一種可能的反效果是,在中間加入RabbitMQ的,你將一些延遲添加到解決方案。

但是你必須在可靠性,靈活性,可擴展性方面獲得的可能性,...

+0

是的,這是對我來說這是交易斷路器的延遲,你真的不能有一個很慢的自動完成 – nickbw

+0

呃......這裏的延遲是用毫毫計算的。速度越快越好,但這不是唯一需要考慮的參數。唯一讓我想到的是自動完成應該實現異步。有趣的是,我遇到了[this so post](http://stackoverflow.com/questions/4439953) - 也許它很有用:現在我從來沒有使用過自動完成功能,我把它留給了你。 – Sigismondo

0

你會從中得到什麼好處?公平地說,如果你把消息放入隊列中,它是如何同步的?除非將消息放入隊列中的相同過程是將其刪除的過程,但這幾乎沒有用處?

現在,如果你想要做的就是把消息在隊列中,稍後處理它是偉大的。 此外,事實上,你有WCF的混合物是恕我直言的某種症狀,可能不夠清楚。您可以使用WCF作爲API網關並使用它將消息寫入隊列,因此這不是關於WCF或隊列,而更像是同步vs異步。

你把你的想法的方式,看起來不正常的我。

+0

有時你必須得到一條消息的回覆,對於自動完成,如果你沒有得到迴應,這將是無用的。我寧願刪除來自消息傳遞的同步呼叫,並且正在尋找證據來支持/抵觸此 – nickbw

+1

在asycn呼叫中,您會收到回覆,但不是您的想法。舉個例子,如果你在REST中使用CQRS,當你提交一個指令如:AddUserCommand時,你只能得到HTTP代碼,比如200,401,406 ......沒有別的,即使消息被處理同步。您需要使用另一個API層來檢索命令狀態。相同的圖層(讀取模型)是相同的證明您的下拉列表的數據。有一件事是肯定的,如果你想要同步處理,從你的架構中刪除隊列。 – Marco