2017-04-07 57 views
2

我有一個基於休息的應用程序部署在服務器(tomcat), 每個請求到服務器需要1秒的服務時間,現在我有一個問題,有時服務器接收更多請求然後它能夠​​提供服務器無響應。現在我在考慮是否可以將請求存儲在隊列中,以便服務器可以提出請求並提供該請求並處理選擇時間問題。我可以在我的休息中使用卡夫卡隊列我的服務

現在我在想卡夫卡對此有幫助,如果有的話,我可以開始的指針。

回答

0

Apache Kafka會對你的情況有所幫助。如果您使用卡夫卡經紀人,它可以讓您面對高峯期的要求。這些請求將按照您提及的方式存儲在隊列中,並由您的服務器以自己的速度處理。

由於你正在使用tomcat,我猜你在用Java開發你的服務器。 Apache Kafka提出了一個非常易於使用的Java API。

+0

我想你也可以使用Rabbitmq。 –

2

您可以使用Kafka(或任何其他消息系統用於此前的ActiveMQ,RabbitMQ等)。

當WebService的接收請求,添加請求卡夫卡隊列(與處理它所需的所有細節)(使用卡夫卡消息生產者details

單獨的服務(具有卡夫卡消費者details)將從主題(隊列)讀取和處理它。

如果需要在處理請求時向客戶端發送消息,服務器可以使用WebSocket將信息推送到客戶端(或者客戶端可以輪詢請求狀態,但是這需要請求狀態端點並且將導致該端點上的負載)。

+0

感謝Kaushal給你的輸入,但是如何將響應發送給同一個呼叫,因爲同一個來源正在發射多個呼叫。 – Vawani

+0

其中一個選擇是,您可以在向客戶端發送任何請求時(或者服務器可以創建標識併發送響應,用於跟蹤請求狀態)在客戶端設置請求標識(X-Request-ID或X-Correlation-ID) )。當此請求從kafka主題中出列(確保將請求ID保存爲kafka消息的一部分)並處理後,使用websocket從服務器發送消息。包含請求標識作爲從服務器推送的消息的一部分。通過這種方式,客戶端可以關聯哪個Web套接字幀發送了哪個http請求。 – Kaushal

+0

替代選項(但不是最佳解決方案)客戶端可以在單獨的http調用中進行輪詢(小心在請求仍在處理或隊列中時會導致不必要的http請求)。如果您不想實施websocket來從服務器進行推送通知,則此選項可用。 – Kaushal

相關問題