分布式消息(事件)驱动
1、简介
事件驱动架构(Event-driven 架构,简称 EDA)是软件设计领域内的一套程序设计模型。
这套模型的意义是所有的操作通过事件的发送/接收来完成。
传统软件设计
举个例子,比如一个订单的创建在传统软件设计中服务端通过接口暴露创建订单的动作,然后客户端访问创建订单。
事件驱动设计
在事件驱动设计里,订单的创建通过接收订单事件来完成,这个过程中有事件发送者和事件接受者这两个模块,事件发送者的作用是发送订单事件,事件接受者的作用的接收订单事件。
2、Spring 消息编程模型
不同的消息中间件发送消息的代码:
可以看出,每个消息中间件都有自己的消息模型编程。
统一模型
Spring 生态里有两个消息相关的模块和项目,分别是 spring-messaging 模块和 Spring Integration 项目,它们对消息的编程模型进行了统一,不论是 Apache RocketMQ 的 Message,或者是 Apache Kafka 的 ProducerRecord,都被统一称为 org.springframework.messaging.Message
接口。
Message 接口有两个方法,分别是 getPayload
以及 getHeaders
用于获取消息体以及消息头。这也意味着一个消息 Message 由 Header 和 Payload 组成。
Payload 是一个泛型,意味是消息体可以放任意数据类型。Header 是一个 MessageHeaders 类型的消息头。
有了消息之后,这个消息被发送到哪里呢?
Spring 提供了消息通道 MessageChannel 的概念。消息可以被发送到消息通道里,然后再通过消息处理器 MessageHandler 去处理消息通道里的消息。
如果消息通道里只有 1 个消息,但是消息处理器有 N 个,这个时候要被哪个消息处理器处理呢?
这里又涉及一个消息分发器的问题。
- UnicastingDispatcher 表示单播的处理方式,消息会通过负载均衡被分发到某一个消息处理器上(默认)
- BroadcastingDispatcher 表示广播的方式,消息会被所有的消息处理器处理。
3、Spring Cloud Stream
Spring Cloud Stream 是一套基于消息的事件驱动开发框架,它提供了一套全新的消息编程模型,此模型屏蔽了底层具体消息中间件的使用方式。开发者们使用这套模型可以完成基于消息的事件驱动应用开发。
Spring Cloud Stream 在上面说到的 spring-messaging 和 Spring Integration 项目的基础上再进行了一些封装,提出一些新的概念,让开发者能够更简单地使用这套消息编程模型。
最佳实践
参考笔者另一篇文章:https://cmty256.github.io/pages/d67430/#%E4%BB%80%E4%B9%88%E6%98%AF-spring-cloud-stream
参考书籍
重磅下载 | Java 开发者必备手册《Spring Cloud Alibaba 从入门到实战》,阿里双11同款!-阿里云开发者社区 (aliyun.com)