项目实践·Docker RocketMQ
Docker RocketMQ
RocketMQ 简介
Message Queue(MQ,消息队列中间件)作为高并发系统的核心组件之一,能够帮助业务系统解构提升开发效率和系统稳定性。主要具有以下优势:
- 削峰填谷:主要解决瞬时写压力大于应用服务能力导致消息丢失、系统奔溃等问题
- 系统解耦:解决不同重要程度、不同能力级别系统之间依赖导致一死全死
- 提升性能:当存在一对多调用时,可以发一条消息给消息系统,让消息系统通知相关系统
- 蓄流压测:线上有些链路不好压测,可以通过堆积一定量消息再放开来压测
消息中间件中有两个角色:消息生产者和消息消费者。RocketMQ 里同样有这两个概念,消息生产者负责创建消息并发送到 RocketMQ 服务器,RocketMQ 服务器会将消息持久化到磁盘,消息消费者从 RocketMQ 服务器拉取消息并提交给应用消费。
RocketMQ 是一款分布式、队列模型的消息中间件,具有以下特点:
- 支持严格的消息顺序
- 支持 Topic 与 Queue 两种模式
- 亿级消息堆积能力
- 比较友好的分布式特性
- 同时支持 Push 与 Pull 方式消费消息
RocketMQ 优势:
- 支持事务型消息(消息发送和 DB 操作保持两方的最终一致性,RabbitMQ 和 Kafka 不支持)
- 支持结合 RocketMQ 的多个系统之间数据最终一致性(多方事务,二方事务是前提)
- 支持 18 个级别的延迟消息(RabbitMQ 和 Kafka 不支持)
- 支持指定次数和时间间隔的失败消息重发(Kafka 不支持,RabbitMQ 需要手动确认)
- 支持 Consumer 端 Tag 过滤,减少不必要的网络传输(RabbitMQ 和 Kafka 不支持)
- 支持重复消费(RabbitMQ 不支持,Kafka 支持)
RocketMQ 有 namesrv 和 broker 组成。
namesrv 的功能如下:
- 接收 broker 的请求注册 broker 路由信息(master 和 slave)
- 接收 client 的请求根据某个 topic 获取所有到 broker 的路由信息
broker 则是 RocketMQ 真正存储消息的地方,broker 消息存储主要包括 3 个部分,分别 commitLog 的存储、consumeQueue 的存储、index 的存储。
Producer 和 Consumer 都是通过 namesrv 获取 broker 路由信息,连接到 broker 生产消费消息,namesrv 和 broker 可以分别集群部署,生产者消费者同样可以分别集群部署,物理部署架构图如下:
Docker 安装 RocketMQ
docker-compose.yml
需要注意 rocketmq-broker 与 rokcetmq-console 都需要与 rokcetmq-nameserver 连接,需要知道 nameserver ip。使用 docker-compose 之后,上面三个 docker 容器将会一起编排,可以直接使用容器名代替容器 ip,如这里 nameserver 容器名 rmqnamesrv。
broker.conf
RocketMQ Broker 需要一个配置文件,按照上面的 Compose 配置,在 ./data/brokerconf/
目录下创建一个名为 broker.conf
的配置文件,内容如下:
精简配置文件:
配置完成,启动:
访问 http://rmqIP:8080
进入控制台。
Spring Cloud Stream
Spring Cloud Stream 是一个用于构建基于消息的微服务应用框架。它基于 SpringBoot 来创建具有生产级别的单机 Spring 应用,并且使用 Spring Integration
与 Broker 进行连接。
Spring Cloud Stream 提供了消息中间件配置的统一抽象,推出了 publish-subscribe、consumer groups、partition 这些统一的概念(Kafka、RabbitMQ、RocketMQ 都是消息中间件)。
Spring Cloud Stream 内部有两个概念:Binder
和 Binding
。
Binder: 跟外部消息中间件集成的组件,用来创建 Binding,各消息中间件都有自己的 Binder 实现。
比如 Kafka 的实现 KafkaMessageChannelBinder,RabbitMQ 的实现 RabbitMessageChannelBinder 以及 RocketMQ 的实现 RocketMQMessageChannelBinder。
Binding: 包括 Input Binding 和 Output Binding。
Binding 在消息中间件与应用程序提供的 Provider 和 Consumer 之间提供了一个桥梁,实现了开发者只需使用应用程序的 Provider 或 Consumer 生产或消费数据即可,屏蔽了开发者与底层消息中间件的接触。
使用
这里只展示最简单 Demo,更多栗子可以参考 spring cloud alibaba rocketmq
接入
- 首先,修改 pom.xml 文件,引入 RocketMQ Stream Starter。
- 配置 Input 和 Output 的 Binding 信息并配合
@EnableBinding
注解使其生效
消息生产者
消息发送服务 SenderService:
发送消息:
消息消费者
消息接收服务 ReceiveService:
参考文章:
基于 Docker 安装 RocketMQ
rocketmq 部署启动指南-Docker 版
Spring Alibaba RocketMQ
金点网络-全网资源,一网打尽 » 项目实践·Docker RocketMQ
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。
- 是否提供免费更新服务?
- 持续更新,永久免费
- 是否经过安全检测?
- 安全无毒,放心食用