1.Rocketmq的简单介绍
RocektMQ是阿里巴巴在2012年开源的一个纯java、分布式消息中间件。RocektMQ是一款低延迟、高可靠、可伸缩、易于使用的消息中间件。2016年阿里巴巴将RocketMQ捐赠给Apache,2017年9月RocketMQ正式从Apache社区正式毕业,成为Apache顶级项目。
2.Rocketmq的特点:
1)支持发布/订阅(Pub/Sub)和点对点(P2P)消息模型
2)在一个队列中可靠的先进先出(FIFO)和严格的顺序传递
3)支持拉(pull)和推(push)两种消息模式
4)单一队列百万消息的堆积能力
5)支持多种消息协议,如 JMS、MQTT 等
6)分布式高可用的部署架构,满足至少一次消息传递语义
7)提供 docker 镜像用于隔离测试和云集群部署
8)提供配置、指标和监控等功能丰富的 Dashboard
3.核心概念
1)NameServer:可以理解是一个注册中心,主要用来保存topic路由信息、管理Broker。在NameServer集群中,NameServer之间是没有任何通信的。
2)Broker 是 RocketMQ 系统的核心的一个角色,主要是用来保存topic信息,接受producter(生产者)产生的消息,持久化消息以及为Consume(消费者)拉取消息的请求做好准备。
在一个Broker集群中,相同的BrokerName可以成为一个Broker组,一个Broker组中BrokerId为0的为主节点,其他的为从节点。BrokerName和BrokerId是可以在Broker启动时通过配置文件配置的。每个Broker组中存放一部分消息。
3)Producer:生产消息的一方,生产者的作用就是将消息发送到 MQ,生产者本身既可以产生消息也可以对外提供接口,由外部应用来调用接口,再由生产者将收到的消息发送到 MQ。
4)Producer Group:生产者组,简单来说就是多个发送同一类消息的生产者称之为一个生产者组。
5)Consumer:用来消费生产者消息的
6)Consumer Group:消费者组,和生产者类似,消费同一类消息的多个 consumer 实例组成一个消费者组。
7)Topic:主题,消息的逻辑分类,比如mq中有订单类的消息,也有库存类的消息,那么就需要进行分类,一个是订单 Topic 存放订单相关的消息,一个是库存 Topic 存储库存相关的消息。
8)Tag:标签可以被认为是对 Topic 进一步细化。可以用于区分同一topic下的不同业务类型消息,发送消息时也需要指定。
9)Message:消息的载体。一个 Message 必须指定 topic。Message 还有一个可选的 tag 设置,以便消费端可以基于 tag 进行过滤消息。也可以添加额外的键值对
4、工作流程
Rocketmq的大致工作流程:
1)Broker启动的时候,会往每台NameServer(因为NameServer之间不通信,所以每台都得注册)注册自己的信息,这些信息包括自己的ip和端口号,自己这台Broker有哪些topic等信息。
2)Producer在启动之后会跟NameServer建立连接,定期从NameServer中获取Broker的信息,当发送消息的时候,会根据消息需要发送到哪个topic去找对应的Broker地址,如果有的话,就向这台Broker发送请求;没有找到的话,就看根据是否允许自动创建topic来决定是否发送消息。
3)Broker在接收到Producer的消息之后,会将消息存起来,持久化,如果有从节点的话,也会主动同步给从节点,实现数据的备份
4)Consumer启动之后也会跟会NameServer建立连接,定期从NameServer中获取Broker和对应topic的信息,然后根据自己需要订阅的topic信息找到对应的Broker的地址,然后跟Broker建立连接,获取消息,进行消费