Я создаю Scala REST API для обработки заказов, и я следую https://github.com/alexandru/scala-best-practices, чтобы быть уверенным в том, что я следую передовым методикам, так как я давно писал код Scala.
Пока что весь мой код является поточно-ориентированным и неблокирующим, с использованием Futures, где это применимо, и неизменяемостью во всем. Теперь, когда я интегрировал хранилище данных, которое обрабатывает создание заказов, моя проблема заключается в том, как мне поступить с транзакциями (такими как два заказа, которые создаются в одно и то же время одновременно)?
Существуют ли какие-либо шаблоны или примеры, которые я могу использовать для обработки транзакций, сохраняя при этом безопасность потоков и избегая неблокирующего кода? Я родом из Java и обычно использую синхронизированные блоки, но это не соответствует:
4.8. https://github.com/alexandru/scala-best-practices/blob/master/sections/4-concurrency-parallelism.md
Соответствует закону Амдала,Синхронизация с блокировками резко ограничивает возможное распараллеливание и, следовательно, вертикальную масштабируемость. Чтения приводят к смущающему паралеллизу, поэтому всегда избегайте этого:
def fetch = synchronized { someValue }
Придумайте лучшие схемы синхронизации, которые не включают синхронизацию чтений, например атомарные ссылки или STM. Если вы не можете этого сделать, то избегайте всего этого, используя правильные абстракции.
Буду признателен за руководство и / или примеры того, как этого можно достичь.