一、MQ解决的问题
1、异步:比同步处理要节省很多时间;
2、解耦:
用户下单后,订单系统需要通知库存系统,传统的做法就是订单系统调用库存系统的接口。这种做法有一个缺点:当库存系统出现故障时,订单就会失败。订单系统和库存系统高耦合。
引入消息队列后,用户下单,订单系统将消息写入消息队列,返回用户订单下单成功;库存系统获取下单消息,进行库操作。就算库存系统出现故障,消息队列也能保证消息的可靠投递,不会导致消息丢失。
3、流量削峰:
请求进入MQ,消费者根据自己能力进行消费;超过阈值的请求也可以直接丢弃。
二、术语
1、Topic
Topic是生产者在发送消息和消费者在拉取消息的类别。Topic与生产者和消费者之间的关系非常松散。具体来说,一个Topic可能有0个,一个或多个生产者向它发送消息;相反,一个生产者可以发送不同类型Topic的消息。类似的,消费者组可以订阅一个或多个主题,只要该组的实例保持其订阅一致即可。
Topic在Google翻译中解释为话题。我们可以理解为第一级消息类型,类比于书的标题。在应用系统中,一个Topic标识为一类消息类型,比如交易信息。
2、Tag
标签,换句话的意思就是子主题,为用户提供了额外的灵活性。有了标签,来自同一业务模块的具有不同目的的消息可以具有相同的主题和不同的标记。标签有助于保持代码的清晰和连贯,同时标签也方便RocketMQ提供的查询功能。
Tag在Google翻译中解释为标签。我们可以理解为第二级消息类型,类比于书的目录,方便检索使用消息。在应用系统中,一个Tag标识为一类消息中的二级分类,比如交易信息下的交易创建、交易完成。
3、GroupName
和现实世界中一样,RocketMQ中也有组的概念。代表具有相同角色的生产者组合或消费者组合,称为生产者组或消费者组。
作用是在集群HA的情况下,一个生产者down之后,本地事务回滚后,可以继续联系该组下的另外一个生产者实例,不至于导致业务走不下去。在消费者组中,可以实现消息消费的负载均衡和消息容错目标。
另外,有了GroupName,在集群下,动态扩展容量很方便。只需要在新加的机器中,配置相同的GroupName。启动后,就立即能加入到所在的群组中,参与消息生产或消费。
三、MQ逻辑模型
Producer向一些队列轮流发送消息,队列集合称为Topic,Consumer 如果做广播消费,则一个consumer实例消费这个Topic 对应的所有队列,如果做集群消费,则多个Consumer实例平均消费这个topic对应的队列集合。
顺序消费原理:
(其实就是把消息放在同一个队列中)
零拷贝的方式有mmap和sendfile,RocketMQ使用前者,更适合小文件传输。
主从拷贝方式:
异步复制:Master收到生产者消息,随机返回ACK,之后再向Slaver拷贝数据;
同步双写:Master收到生产者消息,先向Slaver拷贝数据,完成后返回ACK。
四、MQ物理模型
- NameServer是个注册中心,所有Broker在NameServer中注册,NameServer管理其路由。Producer和Consumer不直接同Broker连接,而是通过NameServer动态分配Broker的地址。
- Producer与Name Server 集群中的其中一个节点(随机选择)建立长连接,定期从Name Server 取Topic 路由信息,并向提供Topic 服务的Master 建立长连接,且定时向Master 发送心跳。
- Consumer 与Name Server 集群中的其中一个节点(随机选择)建立长连接,定期从Name Server 取Topic 路由信息,并向提供Topic 服务的Master、Slave 建立长连接,且定时向Master、Slave 发送心跳。