V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lanlanye
V2EX  ›  程序员

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

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

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

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

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

    @lmshl 直接写入 Kafka 的话重放时调整 offset 来实现吗?请问还有什么需要注意的地方吗?
    lmshl
        9
    lmshl  
       2022-04-15 16:48:11 +08:00
    @lanlanye CQRS 里有全量的 Event ,特殊情况,如 kafka 崩溃也可以从 CQRS 的事件存储重放
    zh6335901
        10
    zh6335901  
       2022-04-18 10:19:39 +08:00
    @lanlanye EventSourcing 基本上是一个 Aggregate 对应一个 Event Stream , 用 kafka 来实现的话需要处理这个 Event Stream 和 topic/partition 的对应关系, 还是比较复杂的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4349 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 10:10 · PVG 18:10 · LAX 02:10 · JFK 05:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.