我想使用kafka作为事件存储来实现事件源模式。 我想让它尽可能简单。
想法:
我的应用包含客户列表。创建和删除客户。很简单的。 收到创建客户的请求时,我正在创建事件CUSTOMER_CREATED,其中包括客户数据,并使用KafkaProducer将其存储在kafka主题中。使用事件CUSTOMER_DELETED删除客户时也是如此。
现在,当我要列出所有客户时,我必须重播到目前为止发生的所有事件,然后获取当前状态,即所有客户的列表。
我将创建一个临时客户列表,然后一个个处理所有事件(创建客户,创建客户,删除客户,创建客户等)。 (使用KafkaConsumer消耗这些事件)。最后,我返回了临时列表。
我想使其尽可能简单,这只是让我了解事件源在实践中如何工作。这是事件来源吗?还有:以这种方式实现快照时如何创建快照?
答案 0 :(得分:1)
当我要列出所有客户时,我必须重播到目前为止发生的所有事件
您实际上并没有,或者至少在您的应用程序重新启动并积极收集/删除数据之后才这样做。我鼓励您查找“流表对偶”,该流对偶基本上说明您的表是系统中当前的状态,并且是到目前为止所有流事件的时间快照,该快照为(({{1 }} + customers added
)-customers modified
)。
在Kafka中实现此方法的方式是为客户使用紧凑的Kafka主题,该主题可以读入Kafka Streams KTable,并持久存储在内存中或溢出到磁盘(由RocksDB支持)。消息密钥可以是客户的一些UUID,也可以是其他无法更改的可识别记录(例如,姓名,电子邮件,电话等,因为所有这些都可以更改)
这样,您可以在其上实施Interactive Queries来扫描或查找特定客户的详细信息。