【问题标题】:How do I implement Event Sourcing using Kafka?如何使用 Kafka 实现事件溯源?
【发布时间】:2019-06-13 13:09:21
【问题描述】:

我想使用 kafka 作为事件存储来实现事件溯源模式。 我想让它尽可能简单。

想法:

我的应用包含客户列表。可以创建和删除客户。很简单。 当创建客户的请求进来时,我正在创建事件 CUSTOMER_CREATED,包括客户数据,并使用 KafkaProducer 将其存储在 kafka 主题中。使用事件 CUSTOMER_DELETED 删除客户时也是如此。

现在,当我想列出所有客户时,我必须重播到目前为止发生的所有事件,然后获取当前状态,即所有客户的列表。

我会创建一个临时客户列表,然后一一处理所有事件(创建客户、创建客户、删除客户、创建客户等)。 (使用 KafkaConsumer 消费这些事件)。最后我返回了临时列表。

我想让它尽可能简单,这只是为了让我了解事件溯源在实践中的工作原理。这是事件溯源吗?还有:以这种方式实现时如何创建快照?

【问题讨论】:

  • 我在这里看到的一个很大的代码异味是您希望将数据保存在队列管理器中。队列并不意味着持久化数据。
  • 是的,它们不是,但有可能,我想试试 :) 只是不确定我是否走在正确的轨道上。
  • @ItayMoav-Malimovka 但 Kafka 旨在将数据持久化一段可配置的时间(包括永远),所以......?
  • 和mysql可以做队列,我可以用C写网页。

标签: apache-kafka event-sourcing


【解决方案1】:

当我想列出所有客户时,我必须重播到目前为止发生的所有事件

您实际上没有,或者至少在您的应用重新启动并积极收集/墓碑数据之后不会。我鼓励您查找“流表对偶性”,它基本上表明您的表是系统中世界的当前状态,以及迄今为止所有流事件的时间快照,这将是((customers added + customers modified) - customers deleted)。

您在 Kafka 中实现此功能的方式是为您的客户使用压缩的 Kafka 主题,该主题可以读入 Kafka Streams KTable,并保存在内存中或溢出到磁盘(由 RocksDB 支持)。消息密钥可以是客户的某个 UUID,或其他一些无法更改的可识别记录(例如,不是姓名、电子邮件、电话等,因为所有这些都可以更改)

这样,您可以在其上实现Interactive Queries 以扫描或查找某个客户的详细信息。

【讨论】:

  • 设计事件驱动系统 - confluent.io/designing-event-driven-systems
  • 对于我的实现,我不想使用 kafka 流,即使它们更合适。我可以将事件存储在 kafka 分区中,当偏移量达到 50 时,我将当前状态存储在 rdbms 中,下次检查是否有可用快照时,获取客户列表并从偏移量 50 开始读取?跨度>
  • 嗯,将数据存储在像 RDBMS 这样的“共享数据库”中,适用于所有消费者应用程序,这在某种程度上违背了拥有微服务的建议。没有什么能阻止你这样做,但我不会写一个消费者来做这件事,而是使用 Kafka Connect。除非您不使用 Java,否则几乎没有理由不使用 Kafka Streams
  • 如果您将所有内容存储在 Kafka 中并且如果您想保留历史记录可能永远不会删除它们,那么这种方法的可扩展性如何?在某种程度上,Kafka 有点成为单体数据库,不是吗?
  • @KhaledOsman 有几家公司在做这件事。例如。 confluent.io/blog/okay-store-data-apache-kafka 但是对于压缩主题,它们的大小受到唯一记录键的数量的限制
猜你喜欢
  • 2022-08-19
  • 2016-06-02
  • 2018-08-31
  • 2014-04-23
  • 2019-02-01
  • 2018-08-17
  • 1970-01-01
  • 2017-12-22
  • 2023-04-06
相关资源
最近更新 更多