Как сделать обратный просмотр БД с помощью Akka Persistence в Lagom? - PullRequest
0 голосов
/ 27 марта 2019

Я создаю микросервис аутентификации токена, используя Lagom, и столкнулся с проблемой. Моя модель данных в настоящее время

table Token (
  groupName varchar(255) PK,
  token varchar(255) (logical UUID type)
)

У меня есть три метода: createToken, getToken и validateToken. Первые два берут имя группы, которое хорошо соответствует идентификатору сущности, как указано в https://www.lagomframework.com/documentation/current/scala/PersistentEntity.html#Persistent-Entity.
Третий принимает токен в теле запроса, а затем возвращает полезную нагрузку json с groupName и token, если это удается.

Lagom абстрагирует реальный SQL, и вы получаете доступ к постоянному слою, выполняя что-то вроде этого: val ref = persistentEntityRegistry.refFor[DptokenEntity](groupName). Фактический код персистентности здесь:

class DptokenEntity extends PersistentEntity {

  override type Command = DptokenCommand[_]
  override type Event = DptokenEvent
  override type State = DptokenState

  override def initialState: DptokenState = DptokenState(None)

  override def behavior: Behavior = {
    case DptokenState(_) => Actions()
      .onCommand[PersistToken, TokenResponse] {
      case (PersistToken(token), ctx, state) =>
        ctx.thenPersist(TokenPersisted(token)) { _ =>
          ctx.reply(token)
        }
    }.onReadOnlyCommand[GetToken, TokenResponse] {
      case (GetToken(groupName), ctx, state) =>
        state.token match {
          case Some(token) => ctx.reply(token)
          case None => ctx.invalidCommand(s"No token exists for $groupName")
        }
    }.onEvent {
      case (TokenPersisted(token), _) => DptokenState(Some(token))
    }
  }
}

case class DptokenState(token: Option[TokenResponse])

Я изо всех сил пытаюсь понять, как выполнить обратный поиск в вышеупомянутой модели, из-за того факта, что, если я найду entity по токену, якобы получу новую строку в базе данных, где отношение token -> groupName, что создает серьезные проблемы с обновлениями и т. Д. *

Я хотел бы посоветоваться с хорошими ребятами из SO, прежде чем я просто разберу материал Event Sourcing и использую raw Slick.

1 Ответ

1 голос
/ 04 апреля 2019

Вы уверены, что вам нужны CQRS и Lagom Persistent Entity? Если вам нужно реализовать случай для нахождения вашей сущности по token, вам нужно использовать Read-Side для этого. Но я не уверен, что Lagom PE - правильный выбор для вас. Попробуйте использовать базовый PersistentActor вместо Lagom PE.

...