Play框架Scala线程亲和性

3
我们的HTTP层由Play Framework in Scala提供支持。我们的API之一是如下形式的:
POST          /customer/:id

我们的UI团队通过React框架调用这些API来发送请求。有时候,相同客户ID的请求会连续批量发出。当这种情况发生时,不同的线程处理这些请求,导致我们的持久层(MySQL)由于处理这些请求的时间戳差异而达到不一致状态。是否可以在Play Scala中配置某种线程亲和性? 我的意思是,我能否配置Play确保特定客户ID的请求在应用程序的整个生命周期内由同一个线程处理?

您也可以尝试添加Akka来处理背压。 - Rex
1个回答

1

批处理是将多个API调用放入一个HTTP请求中。

批量请求是一组命令在一个HTTP请求中,例如这里https://developers.facebook.com/docs/graph-api/making-multiple-requests/

您可以描述它为

问题在于,有时候,请求会按照同一客户ID连续发出。当这种情况发生时,不同的线程处理这些请求,因此我们的持久层(MySQL)由于处理这些请求的时间戳不同而达到不一致的状态。

这是一组并发请求。Play框架通常作为无状态服务器工作。我假设您也将其组织为无状态。没有任何东西将一个请求绑定到另一个请求,您无法控制顺序。好吧,您可以通过创建特殊协议来控制顺序,如“打开批处理请求”,请求#1、#2等,“关闭批处理请求”。您需要检查是否所有请求都正确。您还需要运行一些有状态的线程和一些队列...虽然akka可以帮助解决这个问题,但我很确定您不想这样做。

这个问题与"play-framework"无关,您可以在任何服务器上重现它。例如,一般情况下: 是否可能使用HTTP接收无序响应? 您有两种选择:
1. 将命令“批处理”到一个请求中
您需要更改客户端,使其将“批处理”请求组合成一个请求。您还需要更改服务器,以便它按顺序处理批处理中的所有命令。
请求示例:https://developers.facebook.com/docs/graph-api/making-multiple-requests/ 2. "管道"请求
您需要更改客户端,使其在接收到前一个响应后发送下一个请求。
示例:是否可能使用HTTP接收无序响应? "解决方法是通过管道传输Ajax请求,按顺序逐个发送。只有前一个请求成功返回后,才会发送下一个请求。保证请求的连续性。"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接