Play Framework Scala 线程亲和性

Play Framework Scala thread affinity

我们的 HTTP 层由 Scala 中的 Play Framework 提供服务。我们的 API 之一是以下形式:

POST          /customer/:id

请求由我们的 UI 团队发送,他们通过 React 框架调用这些 API。

问题是,有时,请求是分批发出的,一个接一个地针对同一个客户 ID。发生这种情况时,不同的线程处理这些请求,因此我们的持久层 (MySQL) 由于处理这些请求的时间戳不同而达到不一致的状态。

是否可以在 Play Scala 中配置某种线程关联?我的意思是,我能否配置 Play 以确保特定客户 ID 的请求在应用程序的整个生命周期中由同一线程处理?

批量

put several API calls into a single HTTP request.

批处理请求是一个 HTTP 请求中的一组命令,就像这里 https://developers.facebook.com/docs/graph-api/making-multiple-requests/

你描述为

The issue is that, sometimes, the requests are issued in batches, successively one after the other for the same customer ID. When this happens, different threads process these requests and so our persistent layer (MySQL) reaches an inconsistent state due to the difference in the timestamp of the handling of these requests.

这是一组并发请求。 Play 框架通常用作无状态服务器。我假设您也将其组织为无状态。没有什么可以将一个请求绑定到另一个请求,您无法控制顺序。嗯,你可以,如果你创建一个特殊的协议,比如 "opening batch request",请求 #1,#2,... "closing batch request"。您需要检查所有请求是否正确。您还需要 运行 一些有状态的线程和一些队列……认为 akka 可以帮助解决这个问题,但我很确定您不会这样做。

这个问题不是 "play-framework" 依赖的。您将在任何服务器中复制它。比如一般情况:

你可以选择任何一种方式:

1。 "Batch" 一个请求中的命令

您需要更改客户端,以便将 "batch" 个请求合并为一个。您还需要更改服务器,以便它一个接一个地处理批处理中的所有命令。

请求示例:https://developers.facebook.com/docs/graph-api/making-multiple-requests/

2。 "Pipeline" 请求

您需要更改客户端,使其在收到上一个请求的响应后发送下一个请求。

示例:

The solution to this is to pipeline Ajax requests, transmitting them serially. ... . The next request sent only after the previous one has returned successfully."