整体架构
最近看到了我在Github上写的rabbitmq-examples陆续被人star了,就想着写个rocketmq-examples。对rabbitmq感兴趣的小伙伴可以看我之前的文章。下面把RocketMQ的各个特性简单介绍一下,这样在用的时候心里也更有把握
RocketMQ是阿里自研的消息中间件,RocketMQ的整体架构如下
主要有4个角色
Producer:消息生产者。类似,发信者 Consumer:消息消费者。类似,收信者 BrokerServer:消息的存储,投递,查询。类似,邮局 NameServer:注册中心,支持Broker的动态注册与发现。类似,邮局的管理结构
再介绍几个基本概念
Topic(主题):一类消息的集合,Topic和消息是一对多的关系。每个Broker可以存储多个Topic的消息,每个Topic也可以分片存储于不同的Broker
Tag(标签):在Topic类别下的二级子类别。如财务系统的所有消息的Topic为Finance_Topic,创建订单消息的Tag为Create_Tag,关闭订单消息的Tag为Close_Tag。这样就能根据Tag消费不同的消息,当然你也可以为创建订单和关闭订单的消息各自创建一个Topic
Message Queue(消息队列):相当于Topic的分区,用于并行发送和消费消息。Message Queue在Broker上,一个Topic默认的Message Queue的数量为4
Producer Group(生产者组):同一类Producer的集合。如果发送的是事务消息且原始生产者在发送之后崩溃,Broker会联系统一生产者组内的其他生产者实例以提交或回溯消费
Consumer Group(消费者组):同一类Consumer的集合。消费者组内的实例必须订阅完全相同的Topic
Clustering(集群消费):相同Consumer Group下的每个Consumer实例平均分摊消息
Broadcasting(广播消费):相同Consumer Group的每个Consumer实例都接收全量的消息
用图演示一下Clustering和Broadcasting的区别
如果我有一条订单程成交的消息,财务系统和物流系统都要同时订阅消费这条消息,该怎么办呢?定义2个Consumer Group即可
Consumer1和Consumer2属于一个Consumer Group,Consumer3和Consumer4属于一个Consumer Group,消息会全量发送到这2个Consuemr Group,至于这2个Consumer Group是集群消费还是广播消费,自己定义即可
工作流程在官方文档写的很详细,不再深入了
https://github.com/apache/rocketmq/tree/master/docs/cn
Message
消息的各种处理方式涉及到的内容较多,所以我就不在文章中放代码了,直接放GitHub了,目前还在不断完善中
地址为:https://github.com/erlieStar/rocketmq-examples,
和之前的RabbitMQ一个风格,基本上所有知识点都涉及到了
地址为:https://github.com/erlieStar/rabbitmq-example
每个消息必须属于一个Topic。RocketMQ中每个消息具有唯一的Message Id,且可以携带具有业务标识的Key,我们可以通过Topic,Message Id或Key来查询消息
消息消费的方式
- Pull(拉取式消费),Consumer主动从B