Play Framework Scala тема близости - PullRequest
3 голосов
/ 19 марта 2019

У нас есть наш HTTP-слой, обслуживаемый Play Framework в Scala. Один из наших API-интерфейсов имеет вид:

POST          /customer/:id

Запросы отправляются нашей командой UI, которая вызывает эти API через React Framework.

Проблема в том, что иногда запросы выдаются партиями, последовательно, один за другим, для одного и того же идентификатора клиента. Когда это происходит, разные потоки обрабатывают эти запросы, и поэтому наш постоянный уровень (MySQL) переходит в несовместимое состояние из-за разницы в отметке времени обработки этих запросов.

Можно ли настроить какую-то привязку потоков в Play Scala? Под этим я подразумеваю, могу ли я настроить Play так, чтобы запросы определенного идентификатора клиента обрабатывались одним и тем же потоком в течение всего жизненного цикла приложения?

1 Ответ

1 голос
/ 19 марта 2019

Пакет is

помещает несколько вызовов API в один HTTP-запрос.

Пакетный запрос - это набор команд в одном HTTP-запросе, как здесь https://developers.facebook.com/docs/graph-api/making-multiple-requests/

Вы описываете это как

Проблема в том, что иногда запросы выдаются партиями, последовательно, один за другим, для одного и того же идентификатора клиента. Когда это происходит, разные потоки обрабатывают эти запросы, и поэтому наш постоянный уровень (MySQL) переходит в несовместимое состояние из-за разницы в отметке времени обработки этих запросов.

Это набор одновременных запросов . Play Framework обычно работает как сервер без сохранения состояния. Я предполагаю, что вы также организуете его как лицо без гражданства. Ничто не связывает один запрос с другим, вы не можете контролировать порядок. Ну, вы можете, если вы создадите специальный протокол, такой как «открытие пакетного запроса», запрос № 1, № 2, ... «закрытие пакетного запроса». Вы должны проверить, был ли точно весь запрос верным. Вам также нужно запустить несколько потоков с состоянием и несколько очередей ... Думаю, что akka может помочь с этим, но я уверен, что вы этого не сделаете.

Эта проблема не зависит от "play-framework". Вы будете воспроизводить его на любом сервере. Например, общий случай: Можно ли получить не по порядку ответы с HTTP?

Вы можете пойти любым путем:

1. «Пакетная» команда в одном запросе

Вам нужно сменить клиента, чтобы он объединял «пакетные» запросы в один. Вам также нужно изменить сервер, чтобы он обрабатывал все команды из пакета одну за другой.

Пример запроса: https://developers.facebook.com/docs/graph-api/making-multiple-requests/

2. «Трубопровод» запросов

Вам нужно изменить клиента, чтобы он отправлял следующий запрос после получения ответа от предыдущего.

Пример: Можно ли получить не по порядку ответы по HTTP?

Решением этой проблемы является конвейерная обработка запросов Ajax и их последовательная передача. ... Следующий запрос отправлен только после успешного возврата предыдущего. "

...