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

Understanding Persistent Entities with streams of data

我想用Lagom搭建一个数据处理流水线。此管道中的第一步是使用 Twitter 客户端订阅 Twitter 消息流的服务。对于每条新消息,我都想在 Cassandra 中保留该消息。

我不明白的是,我将我的聚合根建模为 TwitterMessages 列表,例如,在 运行 一段时间后,这个聚合根的大小将达到几千兆字节。无需将所有 TwitterMessages 存储在内存中,因为该服务的目标只是保存每个传入消息,然后将消息发布到 Kafka 以供下一个服务处理。

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

事件溯源是一个很好的默认选择,但不是适合所有情况的正确解决方案。在您的情况下,这可能不是正确的方法。首先,你需要持久化推文,还是可以直接发布到 Kafka?

假设您需要它们持久化,聚合应该在内存中存储它们验证传入命令和生成新事件所需的任何内容。根据您的描述,您的聚合不需要任何数据来执行此操作,因此您的聚合不会是 Twitter 消息列表,而可能只是 NotUsed。每次收到命令时,它都会为该推文发出一个新事件。这里的问题是,它并不是真正的聚合,因为您没有聚合任何状态,您只是发出事件以响应没有不变量或任何东西的命令。因此,您并没有真正将 Lagom 持久实体 API 用于它的用途。尽管如此,无论如何以这种方式使用它可能是有意义的,它是一个高级 API,带有一些有用的东西,包括流式传输功能。但是也有一些您应该注意的陷阱,您将所有推文放在一个实体中,您将吞吐量限制为一个节点上的一个核心一次可以按顺序执行的操作。所以也许你可能期望每秒处理 20 条推文,如果你期望它永远比这更多,那么你使用了错误的方法,你至少需要在多个实体之间分发你的推文。

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