如何为同一服务的许多实例获取所有持久化实体

时间:2018-01-08 14:44:38

标签: java lagom

我仍然是Lagom框架的新手,我正在寻找获取分布式应用程序所有用户的最佳方法。

在我的应用程序中,我有一个使用Cassandra DB的用户服务。因此,要选择我在UserServiceImpl.java中使用Lagom在线拍卖示例应用程序的所有用户:

//...
@Override
public ServiceCall<NotUsed, PSequence<User>> getUsers() {
    // Note this should never make production....
    return req -> currentIdsQuery.currentPersistenceIds()
            .filter(id -> id.startsWith("UserEntity"))
            .mapAsync(4, id ->
                entityRef(id.substring(10))
                    .ask(UserCommand.GetUser.INSTANCE))
            .filter(Optional::isPresent)
            .map(Optional::get)
            .runWith(Sink.seq(), mat)
            .thenApply(TreePVector::from);
}
//...

我还在SO

上查看了此Question

很明显,读取方的想法适用于一个用户服务实例。但是,在生产环境中,我应该有多个相同服务的实例可以在多个节点上运行。在这种情况下,我认为每个服务都应该有自己的DB。

所以我的问题是:读取端逻辑是否只能覆盖每个服务实例的所有用户,还是应覆盖所有服务实例的所有用户?

此外,还有其他解决办法来获取所有服务实例的所有用户吗?

非常感谢。

1 个答案:

答案 0 :(得分:2)

如果您有多个相同服务的实例,他们应该共享一个数据库。

如果您有多个不同的服务,则每个服务都应拥有自己的数据库。

如果您拥有一项服务所拥有的数据,而另一项服务必须查询,您可以使用Lagom的Message Broker API将所有事件从拥有服务发布到Kafka。然后,其他服务可以订阅Kafka主题,将数据复制到自己的读取端数据库中。