Lagom persistentEntityRegistry.register 不工作
Lagom persistentEntityRegistry.register doesn't work
我正在尝试使用 Cassandra 和 Lagom 配置我的第一个实体。
我问的是 Lagom 如何在 Cassandra 中保存实体?
例如,这是我的 UserServiceImpl class:
public class UserServiceImpl implements UserService {
private final PersistentEntityRegistry persistentEntityRegistry;
@Inject
public UserServiceImpl(PersistentEntityRegistry persistentEntityRegistry) {
this.persistentEntityRegistry = persistentEntityRegistry;
persistentEntityRegistry.register(UserEntity.class);
}
@Override
public ServiceCall<NotUsed, String> getUserInfo(String id) {
return (request) -> {
// Look up the user entity for the given ID.
PersistentEntityRef<UserCommand> ref = persistentEntityRegistry.refFor(UserEntity.class, id);
// Ask the entity the Hello command.
return ref.ask(new UserCommand.Hello(id, Optional.empty()));
};
}
}
所以通过执行:
persistentEntityRegistry.register(UserEntity.class);
我应该让用户 table 进入 Cassandra 吗?因为我只有:
我不明白我应该在开始我的 Lagom 项目之前创建 table 用户还是我们只保存事件?
任何帮助,请
Lagom 不需要实体 table,因为它不是基于对象关系映射或类似的东西。它的持久层基于事件溯源的原则。
消息 table 将包含您的实体发出的事件,并且每次您将其带回内存时都会恢复其状态。
基本上,事件以 json 格式保存在消息 table 中。
我们也有快照的概念。实体状态可以保存为快照(也使用 json)。这发生在每 100 个事件之后,这是一个小的优化,以避免每次都从头开始重播事件。
我会尽快解释整个机制。
一个命令被发送到一个实体并且事件被持久化(发生在命令处理程序中)。事件持久化后,它们将应用于实体以改变它(发生在事件处理程序上)。
您重新启动服务并向同一实体发送新命令。此时该实体不在内存中,因此 Lagom 会将其存入内存,但在处理该新命令之前,它将重放该实体的事件历史记录,以便将其恢复到系统崩溃时的状态。
之后,将应用命令并保留新事件。
在 100 个事件之后,实体的快照将被保存,下次需要重播同一实体时,我们首先加载快照,然后应用快照之后发生的事件。所以,在那种情况下,我们不需要重播整个事件历史。
我正在尝试使用 Cassandra 和 Lagom 配置我的第一个实体。
我问的是 Lagom 如何在 Cassandra 中保存实体?
例如,这是我的 UserServiceImpl class:
public class UserServiceImpl implements UserService {
private final PersistentEntityRegistry persistentEntityRegistry;
@Inject
public UserServiceImpl(PersistentEntityRegistry persistentEntityRegistry) {
this.persistentEntityRegistry = persistentEntityRegistry;
persistentEntityRegistry.register(UserEntity.class);
}
@Override
public ServiceCall<NotUsed, String> getUserInfo(String id) {
return (request) -> {
// Look up the user entity for the given ID.
PersistentEntityRef<UserCommand> ref = persistentEntityRegistry.refFor(UserEntity.class, id);
// Ask the entity the Hello command.
return ref.ask(new UserCommand.Hello(id, Optional.empty()));
};
}
}
所以通过执行:
persistentEntityRegistry.register(UserEntity.class);
我应该让用户 table 进入 Cassandra 吗?因为我只有:
我不明白我应该在开始我的 Lagom 项目之前创建 table 用户还是我们只保存事件?
任何帮助,请
Lagom 不需要实体 table,因为它不是基于对象关系映射或类似的东西。它的持久层基于事件溯源的原则。
消息 table 将包含您的实体发出的事件,并且每次您将其带回内存时都会恢复其状态。
基本上,事件以 json 格式保存在消息 table 中。
我们也有快照的概念。实体状态可以保存为快照(也使用 json)。这发生在每 100 个事件之后,这是一个小的优化,以避免每次都从头开始重播事件。
我会尽快解释整个机制。
一个命令被发送到一个实体并且事件被持久化(发生在命令处理程序中)。事件持久化后,它们将应用于实体以改变它(发生在事件处理程序上)。
您重新启动服务并向同一实体发送新命令。此时该实体不在内存中,因此 Lagom 会将其存入内存,但在处理该新命令之前,它将重放该实体的事件历史记录,以便将其恢复到系统崩溃时的状态。
之后,将应用命令并保留新事件。
在 100 个事件之后,实体的快照将被保存,下次需要重播同一实体时,我们首先加载快照,然后应用快照之后发生的事件。所以,在那种情况下,我们不需要重播整个事件历史。