使用聚合、事件溯源和CQRS开发事务型微服务(第一部分)

  网店在创建一个订单时,采用如下步骤去验证一个客户的信用额度:

  以“NEW”状态创建的Order聚合,并发布一个OrderCreated事件;

  Customer聚合消费OrderCreated事件,为订单保存信用值,并发布CreditReserved事件;

  Order聚合消费CreditReserved事件,并将自身状态更改为“APPROVED”。

  在因资金不足而导致信用额度检查失败时,Customer聚合就会发布一个CreditLimitExceeded事件。该事件并不对应于一个状态改变,而是表示了违反业务规则的失败尝试。Order聚合消费该事件,并将自身状态更改为“CANCELLED”。

  以微服务架构作为事件驱动聚合的网络

  在这种架构中,每个服务的业务逻辑中包含了一个或多个聚合。每个事务通过一个服务创建或更新一个聚合来执行。服务使用事件维持聚合间的数据一致性。

物联网

  该方法的一个特有优点是将聚合作为松耦合的构件。聚合被部署到一个整体或是一组服务中。在一个项目的开始阶段,开发人员可以使用整体架构。此后,随着应用及开发团队规模的增加,开发人员可轻易地迁移到微服务架构上。

  总结

  微服务架构将应用功能分解为服务,每个服务对应于一种业务能力。事务、领域模型和查询对分解的抵制,是开发基于微服务的业务应用时的一个挑战。可以通过使用DDD聚合的理念对领域模型进行分解。每个服务的业务逻辑构成一个领域模型,每个领域模型由一个或更多的DDD聚合组成。

  在每个服务中,一个事务建立或更新一个聚合。因为对当代应用而言,两阶段提交并非是一种可行的技术,我们使用事件维持聚合间(和服务间)的一致性。在本文随后的第二部分中,我们将描述如何使用“ 时间溯源 ”实现一个可靠的事件驱动架构。我们还会展示如何在微服务架构中使用 命令查询职责分离 实现查询。

  关于本文作者

Chris Richardson 是一位程序开发人员和架构师。他还是一名Java冠军程序员(Java Champion),同时也是《 用轻量级框架开发企业应用 》一书的作者。这本书的内容是关于如何使用Spring和Hibernate等架构去构建企业Java应用的。Chris也是CloudFoundry.com的创始人。他还担任了一些企业的顾问,指导企业如何去改进应用的开发和部署过程。他目前正致力于发展他的第三个初创企业。读者可以通过Twitter账号 @crichardson 和 Eventuate 网站联系到Chris。

  查看英文原文: Developing Transactional Microservices Using Aggregates, Event Sourcing and CQRS - Part 1

 

  感谢夏雪对本文的审校。