繁体   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