MQ简介
MQ定义
MQ(Message Queue)消息队列的目的是为了实现各个APP之间的通讯,APP基于MQ实现消息的发送和接收应用程序之间的通讯,这样多个应用程序可以运行在不同的主机上,通过MQ实现跨网络通信、业务解耦、异步机制
MQ场景
消息队列最为高并发系统的核心组件之一,能够帮助业务系统结构提升开发效率和稳定性,主要特点:
- 削峰填谷(高峰异步处理解决瞬时写压力大于应用服务能力导致消息丢失、系统崩溃等问题)
- 系统解耦(解决不同重要程度、不同能力级别系统之间依赖导致一崩全宕)
- 提升性能(当存在一朵调用时,可以发一条消息给消息系统,让消息系统通知相关系统)
- 蓄流压测(线上有些链路不好压测,可以通过堆积一定量消息再放开压测)
MQ分类
RabbitMQ、kafka、ActiveMQ、RocketMQ
RabbitMQ原理
处理流程
- broker:接收和分发消息的应用,RabbitMQ server就是Message Broker
- virtual host:处于多租户和安全因素设计,把AMQP的基本组件划分到一个虚拟的分组中类似namespace
- connection:publisher /consumer和broker之间的TCP连接
- channel:逻辑连接节约消息量大的时候建立TCP的开销,如果应用支持多线程,每个tread创建单独channel进行通讯
- exchange:message到达broker的第一站,根据分发规则,匹配查询表中的routing key,分发到queue中
- queue:消息最终再这里等待cousumer取走
- binding:exchange和queue之间的虚拟连接,binding信息保存在exchange表中,用于messge的分发依据
queue特性
- 消息基于先进先出原则进行顺序消费
- 消息可以持久化到磁盘节点服务器
- 消息可以缓存到内存节点服务器提高性能
生产者消费示例
RabbitMQ集群
集群释义原文链接:https://blog.csdn.net/const_/article/details/124109688
普通模式:默认模式
将 RabbitMQ 部署到多台服务器上,每个服务器启动一个 RabbitMQ 实例,多个实例之间进行消息通信。 此时我们创建的队列 Queue,它的元数据(主要就是 Queue 的一些配置信息)会在所有的 RabbitMQ 实例中进行同步,但是队列中的消息只会存在于一个 RabbitMQ 实例上,而不会同步到其他队列。
当我们消费消息的时候,如果连接到了另外一个实例,那么那个实例会通过元数据定位到 Queue 所在的位置,然后访问 Queue 所在的实例,拉取数据过来发送给消费者。
这种集群可以提高 RabbitMQ 的消息吞吐能力,但是无法保证高可用,因为一旦一个 RabbitMQ 实例挂了,消息就没法访问了,如果消息队列做了持久化,那么等 RabbitMQ 实例恢复后,就可以继续访问了;如果消息队列没做持久化,那么消息就丢了。
镜像模式:把需要的队列做出镜像队列
和普通集群最大的区别在于 Queue 数据和原数据不再是单独存储在一台机器上,而是同时存储在多台机器上。也就是说每个 RabbitMQ 实例都有一份镜像数据(副本数据)。每次写入消息的时候都会自动把数据同步到多台实例上去,这样一旦其中一台机器发生故障,其他机器还有一份副本数据可以继续提供服务,也就实现了高可用。