请教两个问题,关于 Event Sourcing 和 CQRS

2022-04-13 22:30:05 +08:00
 lanlanye
  1. CQRS 中,如果需要创建一个新的对象,按照原则命令型接口不应该返回数据,那么接口调用方要怎么才能知道新增这个对象的标识符是什么呢?重新查询列表页吗?
  2. Event Sourcing 的事件中心用什么来实现会比较好?关系库虽然容易实现事务一致性,但生成和消费事件似乎比较不自然,Kafka 适合作为事件中心吗?希望有相关经验的大佬可以分享一下。
1892 次点击
所在节点    程序员
10 条回复
staticage
2022-04-13 23:22:31 +08:00
1. Guid/Uuid
2. 第二个问题不是特别明白你这个事件中心是什么概念,Event 都是由 Domain 发出的。你要说事件存储关系数据库或者别的数据库都可以,Kafka 或者其他消息队列一般用来分发事件
lanlanye
2022-04-14 00:08:25 +08:00
@staticage
1. 我的第一个问题在于这个创建对象的接口是不是不应该返回值,如果是这样的话,后端生成的 uid 前端是获取不到的。
2. 第二个问题的主要疑惑在一致性问题上,举例来说,假如我使用关系库存储事件,用任意 MQ 分发,那就会在一个操作中涉及到两个组件(关系库和 MQ ),我要如何保证这个操作的原子性(即避免出现消息发送成功但事件存储失败之类的情况)?
zartouch
2022-04-14 00:47:29 +08:00
1. 先说下业务场景而不是实现,否则很难给出建议。创建某样东西然后获取这件东西一般是异步的,发创建命令。 创建的处理单元创建了是会发领域事件的,订阅就好了。

2. 没懂事件中心是什么意思。event store 么?一致性的话,关系型数据库和 MQ 一致性这类一般都是通过把发消息的这件事写到 DB ,然后又单独线程去读那张写发事件的表,再来发送 event 。这样保证至少发成功一次。
lmshl
2022-04-14 11:17:03 +08:00
刚做过两个 CQRS 项目的来回答一下

1. 建议同楼上 UUID ,我自己用的框架是创建 Entity 的时候就要指定 ID 了
2. 目前我直接把 Event 写入到 Kafka ,但你想拿 PostgreSQL / MySQL 做第一个读取端也没问题,有 debezium 这一类工具可以实现生成事件
zh6335901
2022-04-14 12:16:20 +08:00
1. 其实没必要那么严格,折衷一下,返回 Id 这种情况是可以的。
2. 推荐 EventStore ,https://github.com/EventStore/EventStore, 专门针对 EventSourcing 设计的数据库。
jiayouniu
2022-04-14 15:21:24 +08:00
@lmshl 麻烦问下,CQRS 落地的项目大概是哪种类型的项目?基于什么考虑使用 cqrs 模型的?项目是否是基于 DDD 的模型
lmshl
2022-04-14 16:27:56 +08:00
@jiayouniu 两个项目
一个记录变动历史的 kv 存储中间件
另一个资源管理服务,限制客户请求量,套餐等等

这俩项目都对高可用 /故障自动迁移有一定需求,所以直接用了 Cluster Sharding 架构实现
说实话我没了解过 DDD ,只是按照 Akka Projection 官方例子边学边做
lanlanye
2022-04-15 11:39:44 +08:00
@zh6335901 感谢回答,我也觉得确实应该考虑一下返回 Id

@lmshl 直接写入 Kafka 的话重放时调整 offset 来实现吗?请问还有什么需要注意的地方吗?
lmshl
2022-04-15 16:48:11 +08:00
@lanlanye CQRS 里有全量的 Event ,特殊情况,如 kafka 崩溃也可以从 CQRS 的事件存储重放
zh6335901
2022-04-18 10:19:39 +08:00
@lanlanye EventSourcing 基本上是一个 Aggregate 对应一个 Event Stream , 用 kafka 来实现的话需要处理这个 Event Stream 和 topic/partition 的对应关系, 还是比较复杂的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/846827

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX