使用CQRS和Serverless构建事件驱动微服务

翻译自
Building Event-driven Microservices Using CQRS and Serverless-January 31, 2017

什么是事件驱动架构[

事件驱动架构将领域事件看作为顶级元素,这其实并不是什么新鲜概念,自有软件起就已经存在了。现在,随着微服务的流行,人们对事件驱动在分布式系统中的应用越来越感兴趣。

CQRS

CQRS是Command Query Responsibility Segregation的缩写,是事件驱动架构领域中一个应用比较广泛的概念。是一种关注读写分享的架构方式。

此处输入图片的描述

CQRS中,作为输入的领域事件与领域模型在结构上是不同的。
Example 1. Account aggregate

{
  "createdAt": 1481351048967,
  "lastModified": 1481351049385,
  "userId": 1,
  "accountNumber": "123456",
  "defaultAccount": true,
  "status": "ACCOUNT_ACTIVE"
}

如果我们要想改变account的状态,一般我们是直接修改对象的status字段,但在CQRS中我们可以发送如下的一个事件
Example 2. Account event

{
  "createdAt": 1481353397395,
  "lastModified": 1481353397395,
  "type": "ACCOUNT_SUSPENDED",
  "accountNumber": "123456"
}

修改完成后,可以将这种变更反应到查询模型上


此处输入图片的描述

以上是对CQRS的一个简单说明

CQRS和微服务

CQRS和微服务结合后会变得复杂,下图是一个实现系统。

此处输入图片的描述

上图中,将一个微服务分成了command-side query-side event-processor三部分,每个部分都可以独立部署。

command-side

command-side开放rest api给用户,用户请求触发command, command触发action,action触发domain event; domain event存储在event store中。Event store是一个结合数据库和消息网关的概念(典型的实现如Eventuate)。领域事件保存事件的时间序列,通过历史事件重放能够重建系统的当前状态。

此处输入图片的描述

event-processor

事件处理器是无状态的,监听来自event store的事件,并处理。

此处输入图片的描述

query-side

此处输入图片的描述

分布式的单体应用还是微服务

两者最大的区别是微服务中的单个服务是能够独立进化的。

Serverless

无服务,一般是指FaaS(Function as a Service),直接将逻辑部署为函数,不需要安全与管理专门的服务器或容器。使用无服务函数的一个好处是其将事件作为顶级元素的概念。

微服务与Serverless

微服务可以由一组Serverless来构建。

此处输入图片的描述

Cloud-native CQRS

我们来构建一个云原生CQRS应用,包括事件驱动微服务和无服务函数。

此处输入图片的描述

你可能感兴趣的:(使用CQRS和Serverless构建事件驱动微服务)