簡體   English   中英

如何保證的REST API以有序的方式執行傳入的請求

[英]How to ensure REST APIs to execute the incoming requests in a sequenced manner

我們需要處理從客戶端到我們托管在Jetty 服務器上的 REST API 的並發請求,但所有請求都應按順序執行

Web 服務器是否保證它收到的請求的順序執行? 如果沒有,可能的解決方案是什么?

假設我們按照 API 的順序接收請求。

我們同步了 Controller 方法以確保每個請求創建的線程以順序方式執行,但如何保證線程按順序進入控制器。

Ours is a standalone application and only one Jetty instance is running and no load-balancers, cache implemented.

Jetty 將按照客戶端要求的任何順序處理請求,使用為 HTTP/1.1 和 HTTP/2 定義的標准行為。

如果它是 HTTP/1.1 上的單個持久連接,那么請求將按照它們在該 HTTP/1.1 連接上發送的順序進行處理。

如果客戶端使用多個 HTTP/1.1 連接,那么每個單獨的連接都會被獨立處理,就好像它們是不同的唯一客戶端一樣。

如果客戶端使用 HTTP/2,那么請求將被多路復用並在該 HTTP/2 會話上接收到整個請求行和標頭時進行處理。

請注意,上述語句中的客戶端是 HTTP 客戶端與 Jetty 通信的任何內容。 如果您在 Jetty 前面有負載平衡器、防火牆、緩存或 TLS/SSL 卸載程序,那么該機器將成為您的客戶端。 確保在該機器上正確配置連接處理以滿足您的需求。

基本上,Jetty 遵守各種 HTTP 規范,並且您正在尋找的行為 100% 由客戶端控制,如果客戶端使用單個 HTTP/1.1 連接並在其中發送管道請求,那么您將得到您想要的最終結果,但如果您在瀏覽器上使用 javascript,那么您將獲得跨多個活動瀏覽器連接並行發送的所有 AJAX 調用。

另一種選擇是,您還可以人為地將排序強制到您的 API 中,其中必須將先前響應中提供的唯一標識符提供給下一個 API 調用,以便按照所需的有序調用進行。

您可能想閱讀過去的答案,以更深入地了解您非常困難的要求。

也許不是同步控制器方法,而是在全局順序信號量上實現一些超時活動等待。 就像是:

STATIC INT SEMAPHORE := START_SEQUENCE
WHILE (INCOMING_REQUEST.ID != SEMAPHORE) {
  TIMEDOUT_WAIT;
}
PROCESS(INCOMING_REQUEST)
SEMAPHORE := SEMAPHORE+1

這是一個簡單的解決方案,仍然需要實現一些錯誤處理。 使用此解決方案,您還需要對請求進行排序

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM