如何确保REST API以顺序方式执行传入请求

问题描述

我们需要处理从客户端到 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

这是一个简单的解决方案,仍然需要实现一些错误处理。 使用此解决方案,您还需要对请求进行排序

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...