Я уже некоторое время работаю с приложением Akka. 95% кода написано чистыми акторами. Теперь я собираюсь перенести некоторые части приложения в Akka Streams. Дайте мне представление о том, как следующая логика может выглядеть с точки зрения Akka Streams:
+------------+
| CreateUser |
+------------+
|
|
+------------+ +-------------------+
| CheckEmail |-----|EmailIsAlreadyInUse|
+------------+ +-------------------+
|
|
+------------+ +-------------------+
|3rdPartyCall|-----|NoUserInInternalDB |
+------------+ +-------------------+
|
|
+------------+ +-------------------+
| SaveUser |-----| UserDBError |
+------------+ +-------------------+
|
|
+------------+
| UserSaved |
+------------+
В текущей реализации все блоки представляют собой сообщения, которые я отправляю соответствующему действующему лицу. Если поток сообщений проходит успешно, я отправляю обратно отправителю сообщение UserSaved
. В противном случае я отправляю обратно отправителю одно из сообщений проверки: EmailIsAlreadyInUse
или NoUserInInternalDB
или UserDBError
.
Вот набор сообщений:
case class CreateUser(email: String)
case class CheckEmailUniqueness(email: String)
case class ExternalServiceValidation(email: String)
case class SaveUser(email: String)
sealed trait CreateUserResult
sealed trait CreateUserError
case class UserCreated(email: String) extends CreateUserResult
case class EmailIsAlreadyInUse(email: String) extends CreateUserResult with CreateUserError
case class NoUserInExternalDB(email: String) extends CreateUserResult with CreateUserError
case class UserDBError(email: String) extends CreateUserResult with CreateUserError
Как мне перенести эту логику в Akka Streams?
Рамон спасибо за такое подробное объяснение! В целом идея ясна. У меня есть только одно несущественное замечание: сначала нужно
CheckEmail
затем сделать3rdPartyCall
и только после этого, если нет ошибок, сделатьSaveUser
:)