【发布时间】:2021-02-23 09:01:57
【问题描述】:
考虑一个简单的用例,我想将产品评分作为事件存储在事件存储中。
我可以使用两种不同的方法:
- 使用 Axon:Rating 聚合负责处理 CreateRatingCommand 并发送 RatingCreatedEvent。发送事件将使评级存储在事件存储中。其他事件处理程序有可能在连接到 Axon 服务器实例时重播事件流并对评级进行任何需要的操作。在这种情况下,事件处理程序将用作流处理器。
- 使用 Kafka:KafkaProducer 将用于在 Kafka 主题中存储 Rating POJO(经过适当的序列化)。将主题的保留时间设置为无限期不会导致任何事件及时丢失。在这种情况下,Kafka Streams 将用于执行实际的评级处理逻辑。
我认为这两种方法都有一些架构问题:
使用轴突时:
- 如果聚合体中没有需要维护或更改的真实状态,使用 Axon(或类似解决方案)是否有任何附加价值?聚合只是充当数据的“哑”占位符,但不提供任何状态更改逻辑。
- Axon 如何处理同一事件类型的多个事件处理程序?它们会全部并行处理相同的事件(相同的聚合 id),还是同一事件仅由其中一个处理程序处理一次?
- 存储在 Axon 事件存储中的事件是否会保留到时间结束?
使用 Kafka 时:
- Kafka 将具有相同键的事件/消息存储在同一分区中。在用户产品评级的用例中,如何为键选择最佳值? UserId、ProductId 或两者的单独主题,并在两个主题中发布每个事件。
- 为每个用户和每个产品使用单独的主题是否会导致集群上出现大量主题? (大约 10k 用户)。
我不知道 SO 是否是此类问题的首选论坛...我只是想知道您(会)在这个特定用例中推荐什么作为最佳实践。期待您的反馈,并随时指出我在之前的问题中遗漏的其他想法。
EDIT@12/11/2020:我刚刚找到了一个related discussion,其中包含与我的问题相关的有用信息。
【问题讨论】:
-
SO 确实可能不是讨论这个问题的最佳平台,它很容易被“基于意见”或“过于广泛”而关闭……这是 axon 论坛discuss.axoniq.io。我会在那里尝试,他们不只是在那里销售他们的产品。
-
我同意!感谢您将我指向适当的论坛。我应该删除这篇文章吗?
-
无需删除。尤其是现在它有一个包含有价值信息的答案。很有可能它会因“基于意见”而关闭,所以我建议在discuss.axoniq.io/t/axon-or-kafka-to-support-cqrs-es/2889 继续任何进一步的讨论@似乎到目前为止参与的每个人都在那里。
标签: apache-kafka architecture cqrs event-sourcing axon