首页 > 其他分享 >RabbitMQ的详细介绍

RabbitMQ的详细介绍

时间:2023-04-18 15:22:07浏览次数:50  
标签:详细 队列 介绍 交换机 RabbitMQ letter dead 消息

RabbitMQ的详细介绍

1.概述

RabbitMQ是一个消息中间件:它接受并转发消息。你可以把它当做一个快递站点,当你要发送一个包裹时,你把你的包裹放到快递站,快递员最终会把你的快递送到收件人那里,按照这种逻辑RabbitMQ是一个快递站,一个快递员帮你传递快件。RabbitMQ与快递站的主要区别在于,它不处理快件而是接收,存储和转发消息数据。

2.下载

rabbitMQ下载详情可见
https://blog.csdn.net/wang20010104/article/details/123986230

3.工作原理

4.名词介绍

Broker:接收和分发消息的应用,RabbitMQ Server就是Message Broker

Connection: publisher / consumer和 broker之间的TCP连接

Channel: 如果每一次访问RabbitMQ都建立一个Connection,在消息量大的时候建立TCP
Connection的开销将是巨大的,效率也较低。Channel是在connection 内部建立的逻辑连接,如果应用程序支持多线程,通常每个thread创建单独的channel进行通讯,AMQP method包含了channel id 帮助客户端和message broker识别 channel,所以channel 之间是完全隔离的。Channel作为轻量级的Connection极大减少了操作系统建TCP connection的开销

Exchange: message 到达 broker 的第一站,根据分发规则,匹配查询表中的 routing key,分发消息到queue 中去。常用的类型有: direct (point-to-point), topic(publish-subscribe) and fanout
(multicast)

Routing Key:生产者将消息发送到交换机时会携带一个key,来指定路由规则

binding Key:在绑定Exchange和Queue时,会指定一个BindingKey,生产者发送消息携带的RoutingKey会和bindingKey对比,若一致就将消息分发至这个队列

vHost 虚拟主机:每一个RabbitMQ服务器可以开设多个虚拟主机每一个vhost本质上是一个mini版的RabbitMQ服务器,拥有自己的 "交换机exchange、绑定Binding、队列Queue",更重要的是每一个vhost拥有独立的权限机制,这样就能安全地使用一个RabbitMQ服务器来服务多个应用程序,其中每个vhost服务一个应用程序。

5.交换机类型

1.direct Exchange(直接交换机)

匹配路由键,只有完全匹配消息才会被转发

2.Fanout Excange(扇出交换机)

将消息发送至所有的队列

3.Topic Exchange(主题交换机)

将路由按模式匹配,此时队列需要绑定要一个模式上。符号“#”匹配一个或多个词,符号“匹配不多不少一个词。因此“abc.#”能够匹配到“abc.def.ghi”,但是“abc.” 只会匹配到“abc.def”。

4.Header Exchange(请求头交换机)

在绑定Exchange和Queue的时候指定一组键值对,header为键,根据请求消息中携带的header进行路由

6.工作模式

1.simple (简单模式)


一个消费者消费一个生产者生产的信息

2.Work queues(工作模式)


一个生产者生产信息,多个消费者进行消费,但是一条消息只能消费一次

3.Publish/Subscribe(发布订阅模式)


生产者首先投递消息到交换机,订阅了这个交换机的队列就会收到生产者投递的消息

4.Routing(路由模式)


生产者生产消息投递到direct交换机中,扇出交换机会根据消息携带的routing Key匹配相应的队列

5.Topics(主题模式)


生产者生产消息投递到topic交换机中,上面是完全匹配路由键,而主题模式是模糊匹配,只要有合适规则的路由就会投递给消费者

7.保证消息的稳定性

1. 消息持久化

RabbitMQ的消息默认存在内存中的,一旦服务器意外挂掉,消息就会丢失
消息持久化需做到三点:

  • Exchange设置持久化
  • Queue设置持久化
  • Message持久化发送:发送消息设置发送模式deliveryMode=2,代表持久化消息

2. ACK确认机制

多个消费者同时收取消息,收取消息到一半,突然某个消费者挂掉,要保证此条消息不丢失,就需要acknowledgement机制,就是消费者消费完要通知服务端,服务端才将数据删除
这样就解决了,及时一个消费者出了问题,没有同步消息给服务端,还有其他的消费端去消费,保证了消息不丢的case。

3. 设置集群镜像模式

我们先来介绍下RabbitMQ三种部署模式:
1)单节点模式:最简单的情况,非集群模式,节点挂了,消息就不能用了。业务可能瘫痪,只能等待。
2)普通模式:默认的集群模式,某个节点挂了,该节点上的消息不能用,有影响的业务瘫痪,只能等待节点恢复重启可用(必须持久化消息情况下)。
3)镜像模式:把需要的队列做成镜像队列,存在于多个节点,属于RabbitMQ的HA方案

为什么设置镜像模式集群,因为队列的内容仅仅存在某一个节点上面,不会存在所有节点上面,所有节点仅仅存放消息结构和元数据。下面自己画了一张图介绍普通集群丢失消息情况

4. 消息补偿机制

持久化的消息,保存到硬盘过程中,当前队列节点挂了,存储节点硬盘又坏了,消息丢了,怎么办?
产线网络环境太复杂,所以不知数太多,消息补偿机制需要建立在消息要写入DB日志,发送日志,接受日志,两者的状态必须记录。
然后根据DB日志记录check 消息发送消费是否成功,不成功,进行消息补偿措施,重新发送消息处理。

8.如何实现延迟队列

RabbitMQ本身没有延迟队列,需要靠TTL和DLX模拟出延迟的效果

TTL(Time To Live)

RabbitMQ可以针对Queue和Message设置 x-message-tt,来控制消息的生存时间,如果超时,则消息变为dead letter
RabbitMQ针对队列中的消息过期时间有两种方法可以设置。
A: 通过队列属性设置,队列中所有消息都有相同的过期时间。
B: 对消息进行单独设置,每条消息TTL可以不同。
如果同时使用,则消息的过期时间以两者之间TTL较小的那个数值为准。消息在队列的生存时间一旦超过设置的TTL值,就成为dead letter

DLX (Dead-Letter-Exchange)

RabbitMQ的Queue可以配置x-dead-letter-exchange 和x-dead-letter-routing-key(可选)两个参数,如果队列内出现了dead letter,则按照这两个参数重新路由。
x-dead-letter-exchange:出现dead letter之后将dead letter重新发送到指定exchange
x-dead-letter-routing-key:指定routing-key发送

队列出现dead letter的情况有:

  • 消息或者队列的TTL过期
  • 队列达到最大长度
  • 消息被消费端拒绝(basic.reject or basic.nack)并且requeue=false

利用DLX,当消息在一个队列中变成死信后,它能被重新publish到另一个Exchange。这时候消息就可以重新被消费。

ref:
https://blog.csdn.net/wang20010104/article/details/124011952

标签:详细,队列,介绍,交换机,RabbitMQ,letter,dead,消息
From: https://www.cnblogs.com/eddyz/p/17329717.html

相关文章

  • jmeter的界面介绍
    前言jmeter是一款进行接口自动化,性能测试的开源的工具界面jmeter菜单里面有个文件--模板,这个主要是一些请求不知道怎么设置时可以选择预制的一些模板选择对应的模板点击创建,就可以生成一个对应的记录,我们选择jdbc,创建后,就会生成jdbc,填写一些提示的信息运行菜单配置分布式,......
  • mac-m1安装jmeter详细步骤
    mac-m1安装jmeter详细步骤查看jdk安装路径:/usr/libexec/java_home-V修改jmeter的java路径vim/opt/homebrew/Cellar/jmeter/5.4.1/bin/jmeter修改java环境变量,jmeter需要给赋值写的权限,chmod+wjmeter修改成当前java的执行路径安装后的路径是:/opt/homebrew/Cellar/jmeter......
  • 体验Rabbitmq强大的【优先级队列】之轻松面对现实业务场景
         说到队列的话,大家一定不会陌生,但是扯到优先级队列的话,还是有一部分同学是不清楚的,可能是不知道怎么去实现吧,其实呢,,,这东西已经烂大街了。。。很简单,用“堆”去实现的,在我们系统中有一个订单催付的场景,我们客户的客户在tmall,taobao下的订单,t......
  • 搭建高可用的rabbitmq集群 + Mirror Queue + 使用C#驱动连接
    我们知道rabbitmq是一个专业的MQ产品,而且它也是一个严格遵守AMQP协议的玩意,但是要想骚,一定需要拿出高可用的东西出来,这不本篇就跟大家说一下cluster的概念,rabbitmq是erlang写的一个成品,所以知道如何构建erlang的node集群就ok了,他需要一个统一的cookie机制......
  • 从容器镜像构建虚拟机镜像——d2vm工具介绍
    从容器镜像构建虚拟机镜像——d2vm工具介绍简介容器镜像是容器技术的核心组成部分之一,得益于基于UnionFS的多层次容器镜像,开发者在构建镜像时能够做到对已有镜像层的高度复用,而在使用镜像时也能够较大程度上节约磁盘空间和网络带宽,从而为容器技术的广泛流行奠定了基础。虚拟机......
  • Spring Boot - Spring Boot 数据库连接池 Hikari 介绍
    SpringBoot数据库连接池Hikari介绍介绍TheHikariCPdesignaestheticisMinimalism.Inkeepingwiththesimpleisbetterorlessismoredesignphilosophy,someconfigurationaxisareintentionallyleftout.HikariCP奉行极简主义的设计美学。为了保持“越......
  • 54 openEuler搭建Mariadb数据库服务器-Mariadb介绍
    54openEuler搭建Mariadb数据库服务器-Mariadb介绍MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可。MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品,MariaDB还提供了许多更好的新特性。54.1MariaDB的架构MariaDB的架构......
  • redis介绍,redis linux安装,redis启动,redis经典场景,redis通用命令,数据结构和内部编码,red
    目录redis介绍,redislinux安装,redis启动,redis经典场景,redis通用命令,数据结构和内部编码,redis字符串类型昨日内容回顾今日内容1redis介绍2redislinux下安装3redis启动方式3.1最简启动3.2动态参数启动3.3配置文件启动3.4客户端连接命令4redis经典场景5redis通用命令6数据......
  • (微服务)服务治理:熔断器介绍以及hystrix-go的使用
    一、什么是熔断器要理解熔断器,可以先看看电路中使用的保险丝。保险丝(fuse)也被称为电流保险丝,IEC127标准将它定义为“熔断体(fuse-link)”。保险丝是一种保证电路安全运行的电子元器件,作用就是在电流异常升高到一定的高度和热度的时候,自身熔断切断电流,这样可以保护电路安全运行。......
  • centos7安装RabbitMQ教程
    转载自:https://www.cnblogs.com/qiansm/p/15241295.html==================== centos7安装RabbitMQ教程erlang版本:22.2.1RabbitMQ版本:3.8.21、安装Erlang1.1安装依赖yuminstallepel-releaseyuminstallgccgcc-c++unixODBCunixODBC-develwxBasewxGTKSDLwxGTK-g......