了解具有数据流的持久实体

时间:2017-10-02 15:56:09

标签: scala event-sourcing lagom

我想使用Lagom构建数据处理管道。此管道中的第一步是使用Twitter客户端来处理Twitter消息流的服务。对于每个新消息,我想在Cassandra中保留消息。

我不明白的是,我将我的Aggregare根作为TwitterMessages列表进行建模,例如,运行一段时间之后,这个聚合根将是几千兆字节。没有必要将所有TwitterMessages存储在内存中,因为这一项服务的目标只是持久保存每条消息,然后将消息发布到Kafka以供下一个要处理的服务。

如何在不消耗无限资源的情况下将聚合根建模为消息流的持久性权限?如果使用Lagom,是否有任何示例代码显示此用法?

1 个答案:

答案 0 :(得分:2)

事件采购是一个很好的默认设置,但不是适合所有事情的正确解决方案。在您的情况下,它可能不是正确的方法。首先,您是否需要保持推文,或者可以将它们直接发布到Kafka吗?

假设您需要持久保存,聚合应该在内存中存储任何验证传入命令和生成新事件所需的内容。根据您所描述的内容,您的聚合不需要任何数据来执行此操作,因此您的聚合不会是Twitter消息的列表,而是可能只是NotUsed。每次获取命令时,它都会为该推文发出新事件。这里的事情是,它并不是真正的聚合,因为你没有聚合任何状态,你只是发出事件来响应没有不变量或任何东西的命令。因此,您并没有真正使用Lagom持久性实体API来实现它的用途。然而,以这种方式使用它可能是有意义的,它是一个高级API,带有一些有用的东西,包括流功能。但是也有一些你应该知道的问题,你把所有的推文都放在一个实体中,你将吞吐量限制在一个节点上的一个核心可以一次顺序完成。所以也许你可以期望每秒处理20条推文,如果你预计它会超过这个推文,那么你就会使用错误的方法,并且你需要至少分发你的推文多个实体。

另一种方法是直接将消息直接存储在Cassandra中,然后在完成后直接发布到Kafka。这将更简单,涉及的机制更少,并且它应该非常好地扩展,只需确保您明智地选择Cassandra中的分区键列 - 我可能会按用户ID进行分区。