代码之家  ›  专栏  ›  技术社区  ›  Alexander Petrov

如何存储变异状态、事件驱动编程?

  •  0
  • Alexander Petrov  · 技术社区  · 7 年前

    我有以下的情况,我抓我的头。我有个预约,我有个活动。某些事件将导致聚合的状态发生突变。这种状态的一部分是功能性的,它自然地属于类似于“计算税”的集合。我想说的一些状态是技术性的而不是功能性的,比如如果一条消息被发送到第三方系统,我们就称之为“isMessageSentToSystem”。在数据库中,我有两个表,一个用于聚合,一个用于事件。我认为有两种选择可以保护国家:

    2) 我会接受我的聚合是可变的,我会把所有重要的函数状态写进它,比如“calculatedTax”。但我的问题来了,我应该怎么处理像“isMessageSenttoSystemA”这样的技术状态呢?不知何故,我觉得这种状态不属于聚合本身,而是事件的副作用。

    我可以创建第三个表并将其绑定到可以编写技术状态的事件吗?我该如何命名这样的表?我真的很难找到一个正确的名字?

    最新消息:我不确定是否从照片上看清楚了有问题,但是我最感兴趣的是如何对数据库中的数据进行建模。我使用RDBMS。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Sylvain Lecoy    7 年前

    未突变状态和突变事件属于聚合。

    我强烈建议您下载沃恩弗农的代码,他是实现领域驱动设计(IDDD)一书的作者。

    以下是包含问题答案的课程:

    https://github.com/VaughnVernon/IDDD_Samples/blob/master/iddd_common/src/main/java/com/saasovation/common/domain/model/EventSourcedRootEntity.java

    注意这里的逻辑和与EventStore的关系,这里有一个突变事件列表,有效地改变实体的事件,以及一个指向未突变版本的指针。那些都是用在事件库的实现中,查看MySQL的实现就明白了。

    https://github.com/VaughnVernon/IDDD_Samples/blob/master/iddd_common/src/main/java/com/saasovation/common/port/adapter/persistence/eventsourcing/mysql/MySQLJDBCEventStore.java

    在加载端,事件存储区中的所有事件都被加载并应用于源于事件的根实体,但不存储在变异事件列表中。因此,实体的状态将还原为审核日志的最新版本,并且任何修改都将在该列表的内存中跟踪,保存时会刷新到数据库中。

    至于事件存储本身的结构,非常简单:

    CREATE TABLE `tbl_es_event_store` (
        `event_id` bigint(20) NOT NULL auto_increment,
        `event_body` varchar(65000) NOT NULL,
        `event_type` varchar(250) NOT NULL,
        `stream_name` varchar(250) NOT NULL,
        `stream_version` int(11) NOT NULL,
        KEY (`stream_name`),
        UNIQUE KEY (`stream_name`, `stream_version`),
        PRIMARY KEY (`event_id`)
    ) ENGINE=InnoDB;
    
        2
  •  0
  •   Morilog    7 年前

    isMessageSentToSystemA 是查询端服务,您可以在分派命令和更改聚合之前检查该约束。 您还可以使用SAGA执行分布式事务并管理用例的工作流

    推荐文章