RocketMQ的由来
消费者主要功能就是从消息队列拉取消息,或者说接收消息。
- Broker管理,NameServer接受Broker集群的注册信息并且保存下来作为路由信息的基本数据。然后提供⼼跳检测机制,检查Broker是否还存活。
- 路由信息管理,每个NameServer将保存关于Broker集群的整个路由信息和⽤于客户端查询的队列信息。然后Producer和Conumser通过NameServer就可以知道整个Broker集群的路由信息,从⽽进⾏消息的投递和消费。NameServer通常也是集群的⽅式部署,各实例间相互不进⾏信息通讯。Broker是向每⼀台NameServer注册⾃⼰的路由信息,所以每⼀个NameServer实例上⾯都保存⼀份完整的路由信息。当某个NameServer因某种原因下线了,Broker仍然可以向其它NameServer同步其路由信息,Producer,Consumer仍然可以动态感知Broker的路由的信息。
这里有很多broker,简单理解就是有很多rocketmq。 除了有好多台mq,还会发现有master和slave。两个broker之间构成了主从。
主从目的可以提升性能,读写可以在broker master,读可以在broke他slave。也就是两个broker都可以提供读的服务,这样性能会更加好。
当有一个master挂了,slave可以顶上,这样就形成了broker的高可用。两个broker都是主从关系,一个broker可以存放一部分数据,另外一个broker可以存放另外一部分数据。当然broker master1和broker master2的数据可以是相同的。
rockermq是重topic的mq,也就是它需要有topic才能整个工作机制可以顺利的运行。topic就是主题的意思。
对于生产者需要将消息发送到某一个topic上,但是实际的消息存储在broker上面,topic是用来区分消息的。
对于生产者producer来说要将消息发送给某个topic上, 比如消息发送到t1这个topic,t1的topic在broker master1上面,那么消息就会存储在这个topic上面。如果又发消息给t2这个topic,那么t2 topic是放在broker master2上面。很显然这个消息会存储在broker master2上面。
也就是生产者通过topic将消息进行区分,当然两个broker之间也可以保存相同的topic。
生产者是怎么将消息发送到broker上面的呢?它是怎么知道broker的地址呢?在broker集群里面会有很多的broker,这些broker要将自己的信息注册到nameserver上面。
在nameserver集群里面,多台nameserver节点之间是无状态的,他们相互之间不需要知道彼此的状态。nameserver启动了,它不需要知道集群中有几台nameserver。
启动了nameserver1,那么nameserver1就是独立的个体。即使集群当中可能有nameserver2,nameserver3,对于nameserver1来说是不知道其他人的存在。这样的话就能够保证他们的无状态。
broker会去将自己的信息同时注册到nameserver的每一台节点上面。比如broker master1里面存放了topic1这样一个topic。注册到nameserver里面就会有一条映射关系t1->broker1,或者t1->broker2,这样的映射关系就会存在于每一台nameserver。
对于producter来说需要去做broker的discover。就是去发现broker,要发到t1上面,这样producer就要去nameserver里面订阅。发送到t1上面到底需要哪个broker呢?nameserver cluster会告诉你。
生产者拿到broker的地址,那么就会将发送到topic1的消息发送到这个broker上面broker master1上面。
消息发过去对于broker集群来说,站在生产者角度来说是同一个broker,只不过在这个地方部署了主从。主负责写,从负责读,主也能实现部分读数据的功能。
消费者要消费某一个topic,它也要去nameserver订阅broker,消费者的topic t1在哪个broker上面。然后连接到该broker上面。