RocketMQ 消息中间件,原先是阿里内部使用,后来捐赠给Apache基金,成为顶级的开源项目之一。经历过多次的双十一洗礼和考验,性能可靠,最高单台7万TPS。用Java开发,相比较其他的消息中间件(RqbbitMQ 用Erlong语言、Kfka用Scala语言)更容易找到技术人员进行定制开发,也能更好的理解RocketMQ系统运行,毕竟源码看起来顺手一点。
理解RocketMQ可以类比为寄信:需要寄信人投递到邮箱,然后邮局送到另一个邮箱,收信的人在另一端取信,还有以一个全国的邮政系统,用来管理各地的邮箱。Rocket分为四大块:生产者Producer(寄信人)、消费者Consumer(收信人)、broker(邮箱)、NameServer(邮局系统)。寄信是按照地址和姓名传递,RockerMQ是按照主题Topic进行传递,寄信的时候可以选择接受与否,MQ也可以根据信息的Tag标签来过滤。
RocketMQ系统启动的时候,Broker先向所有的NameServer进行注册,NameServer保存Broker的信息。Procuder发消息前先向NameServer申请Broker的信息,得到Broker的信息后向具体的broker发送,broker将发送的信息保存,然后将等Consumer消费掉信息。NameServer、Broker都可以部署多台服务器来构成集群,提高系统的可用性。
RocketMQ是通过主题Topic来发送、订阅的,由NameServer保存Topic的信息,当Producer发送消息是,必须表明消息的Topic,Consumer按照对应的Topic来消费消息。
NameServer:是整个系统的大脑,存储Broker、Topic等信息。存放了5种信息:
topicQueueTable:Topic消息队列路由信息,消息发送时根据路由表进行负载均衡。
结构的Key是Topic的名称,Value是个QueueDate队列,长度是topic存储的所有的Master Broker数量,QueueDate存储Broker的名称,读写队列的数量,标志
brokerAddrTable:Broker基础信息,包括brokerName,所属集群、主备地址。相同名称的Broker可能有多个,通过BrokerId来区分,BrokerId为0表示为Master,不为0的为slave。brokerAddrTable存储一个brokerName的属性,包括所属cluster集群、Master的地址和各个Slave的地址。
clusterAddrTable:Broker集群信息,存储集群中所有的Broker名称
brokerLiveTable:Broker状态信息,NameServer每次收到心跳包时会替换该信息。这个的Key为broker的地址,value包括了最近更新心跳包的时间
filterServerTable:Broker上的FileteServer列表,用于类模式消息过滤。这个的key也是Broker的地址,Value是和这个Broker关联的多个FilterServer的地址。
Broker启动时向所有的NameServer发送心跳包,每隔30S向集群中的NameServer发送心跳包。NameServer接受到心跳包后,会保存在对应的brokerLiveTable里,记录这个Broker最新的更新心跳包的时间。NameServer每隔10S扫描一次brokerLiveTable,如果发现某个Broker超过120S还眉头更新心跳包,则移除该Broker的路由信息,并且关闭Socket连接。同时更新topicQueueTable、brokerAddrTable、filterServerTable。
NameServer的高可用可以通过部署多台服务器来构成集群,但他们彼此之间并不通信,只是Broker统一的向所有的NameServer服务器注册。