基础知识点
MQ的常见协议
JMSJava Messaging ServiceActiveMQ是该协议的典型实现STOMPStreaming Text Orientated Message ProtocolRabbitMQ通过插件可以支持该协议AMQPAdvanced Message Queuing ProtocolRabbitMQ是该协议的典型实现MQTTMessage Queuing Telemetry TransportRabbitMQ通过插件可以支持该协议但是KafkaRocketMQ都不支持这些协议
MQ的主要功能
- 异步
- 削峰限流
- 解耦
MOM (Message Oriented Middleware) 面向消息的中间件
其他还有 PO(面向过程)OO(面向对象) AO(面向切面)
RocketMQ的基本成员
message
消息:本质上是数据,是生产和消费的最小单位,每个消息必须属于一个主题
producer
一个produer对应多个topic
生产者组,可以有多个生产者,且每个生产者可以生产多个topic
topic
主题:一个topic对应多个不同的consumer组
Queue
队列:一个topic可以有多个Queue,也被称为topic中消息的分区
注意:一个topic中的Queue,只能被一个消费者组中的一个消费者进行消费
tag
标签:topic是消息的一级分类,tag是消息的二级分类
topic=货物
tag=上海
tag=南京
tag=北京
consumer
一个consumer组对应一个topic,但一个consumer组不能消费同一个topic分区
消费者只能消费一种消息
Queue可以实现负载均衡,对于Queue来说是平均的 但是消费者不一定是平均的,比如4个Queue对应3个消费者
分片(与分区不同)
同一个topic在不同服务器上,称为分片
broker (指不同的服务器
多台服务器,对topic进行分片
broker做主从,搭集群
messageId, key
messageId:业务ID
key:
msgId 生产者send()自动生成
offsetMsgId 消息到达broker后,broker端生成
nameServer
- nameServer是无状态的
- 优点:集群搭建简单
- 缺点:broker必须注册到每一个nameServer上,因此并不能随便扩容,若broker不重新配置,新增的nameServer对于broker来说就是不可见的
- 路由的剔除:禁止读写权限,运维检测到broker中没有流量后,再把broker从nameServer中剔除
- rockermq的路由发现采用的是pull模型,即nameserver不会主动推送给客户端,而是客户端定时拉取,默认每30秒拉取最新的路由
- 模型扩展
- push模型的实时性较好,采用“发布 订阅”模型的方式,但需要与客户端维持长链接,这样会大量占用资
- pull模型的实时性较差
- long polling长轮询,是对push和pull模型的整合
- 策略
关系
topic:message 1:n message:topic 1:1 producer:topic 1:n consumer:topic 1:1