在实际项目开发中,有时候需要与其他系统进行集成完成相关业务功能,这种情况最原始的做法是程序内部相互调用,除此之外,还可以使用消息服务中间件进行业务处理,使用消息服务中间件处理业务能够提升系统的异步通信和扩展解耦能力。Spring Boot对消息服务管理提供了非常好的支持。
- 了解为什么要使用消息中间件
使用消息服务的好处
在多数应用尤其是分布式系统中,消息服务是不可或缺的重要部分,它使用起来比较简单,同时解决了不少难题,例如异步处理、应用解耦、流量削锋、分布式事务管理等,使用消息服务可以实现一个高性能、高可用、高扩展的系统。
异步处理:耗时,用户体验不好
应用解耦:库存系统出现异常,订单服务会失败导致订单丢失
流量削峰:服务器处理资源能力有限,出现峰值时很容易造成服务器宕机、用户无法访问的情况
- 分布式事务管理:订单支付成功后,写入消息表
- 定时扫描消息表消息写入到消息队列中
- 库存系统会立即读取到消息队列中的消息进行库存更新,同时添加消息处理状态
- 库存系统向消息队列中写入库存处理结果
- 订单系统会立即读取到消息队列中的库存处理状态。直接删除消息表数据,并写入到历史消息表
- RabbitMQ 消息中间件
概念:
RabbitMQ是基于AMQP协议的轻量级、可靠、可伸缩和可移植的消息代理,Spring使用RabbitMQ通过AMQP协议进行通信,在Spirng Boot中对RabbitMQ进行了集成管理。
工作模式介绍:
- Work queues(工作队列模式)
- Publish/Subscribe(发布订阅模式)
- Routing(路由模式)
- Topics(通配符模式)
- RPC
- Headers(使用较少,不进行详细介绍)
- Work queues (工作队列模式)介绍:
- 需要指定唯一的消息队列进行消息传递,并且可以有多个消息消费者。在这种模式下,多个消息消费者通过轮询的方式依次接收消息队列中存储的消息,一旦消息被某一个消费者接收,消息队列会将消息移除,而接收并处理消息的消费者必须在消费完一条消息后再准备接收下一条消息。
- 适用于那些较为繁重,并且可以进行拆分处理的业务,这种情况下可以分派给多个消费者轮流处理业务。
- Publish/Subscribe(发布订阅模式)介绍:
- 在Publish/Subscribe工作模式中,必须先配置一个fanout类型的交换器,不需要指定对应的路由键(Routing key),同时会将消息路由到每一个消息队列上,然后每个消息队列都可以对相同的消息进行接收存储,进而由各自消息队列关联的消费者进行消费。
- 适用于进行相同业务功能处理的场合
- Routing(路由模式)介绍:
- 在Routing工作模式中,必须先配置一个direct类型的交换器,并指定不同的路由键值(Routing key)将对应的消息从交换器路由到不同的消息队列进行存储,由消费者进行各自消费。
- 适用于进行不同类型消息分类处理的场合
- Topics(通配符模式)介绍:
- 在Topics工作模式中,必须先配置一个topic类型的交换器,并指定不同的路由键值(Routing key)将对应的消息从交换器路由到不同的消息队列进行存储,然后由消费者进行各自消费
- 适用于根据不同需求动态传递处理业务的场合
- RPC 介绍:
- RPC模式是一个回环结构,主要针对分布式架构的消息传递业务,客户端Client先发送消息到消息队列,远程服务端Server获取消息,然后再写入另一个消息队列,向原始客户端Client响应消息处理结果。
- 适用于远程服务调用的业务处理场合