0
点赞
收藏
分享

微信扫一扫

MQ消息队列RabbitMQ

MQ简介

MQ定义

MQ(Message Queue)消息队列的目的是为了实现各个APP之间的通讯,APP基于MQ实现消息的发送和接收应用程序之间的通讯,这样多个应用程序可以运行在不同的主机上,通过MQ实现跨网络通信、业务解耦、异步机制

MQ消息队列RabbitMQ_MQ消息队列RabbitMQ

MQ场景

消息队列最为高并发系统的核心组件之一,能够帮助业务系统结构提升开发效率和稳定性,主要特点:

  1. 削峰填谷(高峰异步处理解决瞬时写压力大于应用服务能力导致消息丢失、系统崩溃等问题)
  2. 系统解耦(解决不同重要程度、不同能力级别系统之间依赖导致一崩全宕)
  3. 提升性能(当存在一朵调用时,可以发一条消息给消息系统,让消息系统通知相关系统)
  4. 蓄流压测(线上有些链路不好压测,可以通过堆积一定量消息再放开压测)

MQ消息队列RabbitMQ_MQ消息队列RabbitMQ_02

MQ分类

RabbitMQ、kafka、ActiveMQ、RocketMQ

RabbitMQ原理

处理流程

MQ消息队列RabbitMQ_MQ消息队列RabbitMQ_03

  • 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特性

  1. 消息基于先进先出原则进行顺序消费
  2. 消息可以持久化到磁盘节点服务器
  3. 消息可以缓存到内存节点服务器提高性能

生产者消费示例

MQ消息队列RabbitMQ_MQ消息队列RabbitMQ_04

MQ消息队列RabbitMQ_MQ消息队列RabbitMQ_05

RabbitMQ集群

集群释义原文链接:https://blog.csdn.net/const_/article/details/124109688

普通模式:默认模式

将 RabbitMQ 部署到多台服务器上,每个服务器启动一个 RabbitMQ 实例,多个实例之间进行消息通信。 此时我们创建的队列 Queue,它的元数据(主要就是 Queue 的一些配置信息)会在所有的 RabbitMQ 实例中进行同步,但是队列中的消息只会存在于一个 RabbitMQ 实例上,而不会同步到其他队列。

当我们消费消息的时候,如果连接到了另外一个实例,那么那个实例会通过元数据定位到 Queue 所在的位置,然后访问 Queue 所在的实例,拉取数据过来发送给消费者。

这种集群可以提高 RabbitMQ 的消息吞吐能力,但是无法保证高可用,因为一旦一个 RabbitMQ 实例挂了,消息就没法访问了,如果消息队列做了持久化,那么等 RabbitMQ 实例恢复后,就可以继续访问了;如果消息队列没做持久化,那么消息就丢了。

MQ消息队列RabbitMQ_MQ消息队列RabbitMQ_06

镜像模式:把需要的队列做出镜像队列

和普通集群最大的区别在于 Queue 数据和原数据不再是单独存储在一台机器上,而是同时存储在多台机器上。也就是说每个 RabbitMQ 实例都有一份镜像数据(副本数据)。每次写入消息的时候都会自动把数据同步到多台实例上去,这样一旦其中一台机器发生故障,其他机器还有一份副本数据可以继续提供服务,也就实现了高可用。

MQ消息队列RabbitMQ_MQ消息队列RabbitMQ_07


举报

相关推荐

0 条评论