
【RabbitMQ系列】
文章平均质量分 79
消息中间件RabbitMQ学习及痛点分享
立小言先森
这个作者很懒,什么都没留下…
展开
-
springboot RabbitMQ客户端连接故障恢复
最近做RabbitMQ故障演练发现RabbitMQ服务器停止后,基于springboot的消费端不可以自动的恢复,队列的消费者消失,消息一直积压到队列中,这种情况肯定是不可接收的;通过研究源代码找到了解决方案。原创 2023-08-26 00:30:00 · 4008 阅读 · 0 评论 -
RabbitMQ Node rabbit@emily1 thinks its clustered with node rabbit@emily2, but rabbit disagrees
warning: the VM is running with native name encoding of latin1 which may cause Elixir to malfunction as it expects utf8. Please ensure your locale is set to UTF-8 (which can be verified by running "locale" in your shell)Error: unable to perform an operati原创 2022-02-17 13:51:13 · 1504 阅读 · 1 评论 -
springboot rabbitmq属性配置spring.rabbitmq.publisher-confirm和spring.rabbitmq.publisher-confirm-type详解
在springboot2.2.0.RELEASE版本之前是amqp正式支持的属性,用来配置消息发送到交换器之后是否触发回调方法,在2.2.0及之后该属性过期使用spring.rabbitmq.publisher-confirm-type属性配置代替,用来配置更多的确认类型;1.spring.rabbitmq.publisher-confirm发布确认属性配置如果该属性为true,则会触发以下方法: /** * 设置生产者消息publish-confirm回调函数 .原创 2020-09-04 19:57:43 · 19105 阅读 · 3 评论 -
RabbitMQ学习笔记:集群和网络分区(Network Partitions)
集群成员之间的网络连接故障会影响客户机操作的数据一致性和可用性(如CAP定理)。由于不同的应用程序对一致性有不同的要求,并且对不可用性的容忍程度不同,所以可以使用不同的的分区处理策略。1.检测网络分区如果一个节点在一段时间内(默认是60秒)无法与对等端节点联系,则节点将认为其对等节点是否已关闭。如果两个节点重新接触,都认为另一个已关闭,则这些节点将确定已发生分区。将以如下形式记录到RabbitMQ日志:2020-05-18 06:55:37.324 [error] <0.341.0> .原创 2020-07-13 15:13:41 · 3796 阅读 · 1 评论 -
RabbitMQ学习笔记:mandatory、publisher-confirms、publisher-return属性区别
rabbitmq客户端发送消息首先发送的交换器exchange,然后通过路由键routingKey和bindingKey比较判定需要将消息发送到那个队列queue上;在这个过程有两个地方消息可能丢失,第一消息发送到交换器exchange的过程,第二消息从交换器exchange发送到队列queue的过程;1.publiser-confirm模式可以确保生产者到交换器exchange消息有没有发送成功#设置此属性配置可以确保消息成功发送到交换器spring.rabbitmq.publisher-con.原创 2020-06-19 15:22:16 · 11750 阅读 · 14 评论 -
RabbitMQ学习笔记:内置Prometheus支持rabbit_prometheus插件
从3.8.0开始,RabbitMQ提供内置的Prometheus和Grafana支持。rabbitmq_prometheus插件中提供了对Prometheus指标收集的支持。该插件以Prometheus文本格式在专用的TCP端口(默认端口15692)上公开所有RabbitMQ指标。rabbitmq_prometheus插件是RabbitMQ指标的核心导出器,由RabbitMQ核心团队开发。这是...原创 2020-01-19 10:11:43 · 11269 阅读 · 5 评论 -
RabbitMQ学习笔记:惰性队列(Lazy Queues)
理论说明RabbitMQ从3.6.0开始引入了惰性队列(Lazy Queue)的概念。惰性队列会尽可能的将消息存入磁盘中,而在消费者消费到相应的消息时才会被加载到内存中,它的一个重要设计目标是能够支持更长的队列,即支持更多的消息存储。当消费者由于各种各样的原因(比如消费者下线、跌机、或者由于维护而关闭等)致使长时间不能消费消息而造成堆积时,惰性队列就很必要了。默认情况下,当生产者将消息发送到R...原创 2020-01-19 10:09:32 · 4964 阅读 · 0 评论 -
RabbitMQ学习笔记:Monitoring(监控)
本文概述了与RabbitMQ相关的主题。监控RabbitMQ和使用它的应用程序非常重要。监控有助于在问题影响到环境的其它部分以及最终影响最终用户之前检测到问题。系统的许多方面都可以被监控,本文档将它们分为几个类别:什么是监控,有什么共同的方法存在,为什么它是重要的。内置和外部监视选项。哪些基础设施和内核指标是重要的监视对象。有哪些RabbitMQ指标可用: 节点指标 队列指标...原创 2020-01-14 19:09:55 · 6709 阅读 · 0 评论 -
RabbitMQ学习笔记:Event Exchange Plugin(事件交换器插件)rabbitmq-event-exchange
客户端connection、channels、queues、consumers和系统其它部分自动生成的事件。例如,当一个connection被接受,虚拟主机通过了验证授权,将会发送一个connection_created事件,当一个connection关闭或者由于其它原因失败,将会发送一个connection_closed事件。RabbitMQ提供了一个最小的事件通知机制向RabbitMQ客户端...原创 2020-01-07 19:01:15 · 2769 阅读 · 0 评论 -
RabbitMQ学习笔记:RabbitMQ延迟队列(DLX、TTL及rabbitmq_delayed_message_exchange插件)
延迟队列存储的对象是对应的延迟消息,所谓的延迟消息是指当消息被发送以后,并不想让消费者立刻拿到消息,而是等待特定时间后,消费者才能拿到这个消息进行消费。延迟消息使用的场景有很多,比如:在订单系统中,一个用户下单之后通常有30分钟的时间进行支付,如果30分钟之内没有支付成功,那么这个订单将进行异常处理,这时候就可以使用延迟队列来处理这些订单了。用户希望通过手机远程遥控家里的智能设备在指定...原创 2020-01-03 13:51:01 · 15717 阅读 · 10 评论 -
RabbitMQ学习笔记:Springboot amqp之 spring_listener_return_correlation、 spring_returned_message_correlati
1.引入springboot amqp依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> &...原创 2019-12-28 10:53:07 · 4814 阅读 · 0 评论 -
RabbitMQ学习笔记:springboot2 amqp集成生产者消费者
1.引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency&...原创 2019-12-28 10:50:27 · 1589 阅读 · 0 评论 -
RabbitMQ学习笔记:消息追踪rabbitmq_tracing插件
rabbitmq_tracing插件相当于Firehose的GUI版本,它同样能跟踪RabbitMQ中消息的流入流出情况。rabbitmq_tracing插件同样会对流入流出的消息进行封装,然后将封装后的日志存入相应的trace文件中。启动rabbitmq_tracing插件:[root@rabbit1 /]# rabbitmq-plugins enable rabbitmq_tracin...原创 2019-12-22 12:02:01 · 1793 阅读 · 0 评论 -
RabbitMQ学习笔记:消息追踪Firehose功能详解
在使用任何消息中间件的过程中,难免会出现消息异常丢失的情况。对于RabbitMQ而言,可能是生产者与Broker断开了连接并且没有任何重试机制;也可能是消费者在处理消息时发生了异常,不过却提前进行了ack;甚至是交换器没有与任何队列绑定,生产者感知不到或者没有采取相应的措施;另外RabbitMQ本身的集群策略也可能导致消息的丢失,这个时候就需要有一个良好的机制来跟踪记录消息的投递过程,以此来协助...原创 2019-12-22 12:00:34 · 2711 阅读 · 0 评论 -
RabbitMQ学习笔记:RabbitMQ能打开最大连接数
1.通过rabbitmqctl命令查看[root@rabbit1 /]# rabbitmqctl status...File DescriptorsTotal: 2, limit: 1048469Sockets: 0, limit: 943620...2.通过Management UI查看Socket descriptors说明:The network sockets...原创 2019-12-22 11:57:59 · 4263 阅读 · 0 评论 -
RabbitMQ学习笔记:调整吞吐量TCP Buffer Size
调整吞吐量是一个共同的目标,可以通过增加TCP缓冲区大小,确保Nagle算法被禁用,启用可选的TCP功能和扩展来实现改进。对于后两种情况,可以参考操作系统级优化部分。请注意,吞吐量的调整将涉及权衡。例如,增加TCP缓冲区大小将增加每个连接使用的RAM大小,这可能使服务器RAM使用总量显著的增加。TCP缓冲区大小这是一个关键的可调参数。每个TCP连接都为其分配了缓冲区。一般来说,这些缓冲...原创 2019-12-22 11:56:46 · 3112 阅读 · 0 评论 -
RabbitMQ学习笔记:节点间通信缓冲区大小限制(Buffer Size Limit)
节点间连接对待发送的数据使用缓冲区,当缓冲区达到最大允许容量时,对节点间通信量应用临时限制。该限制是通过环境变量RABBITMQ_DISTRIBUTION_BUFFER_SIZE来设置,单位是kilobytes,默认值是128MB(128000KB)。在具有大量节点间通信量的集群中,增加此值可能会对吞吐量产生积极影响。不建议小于64MB的值。环境变量配置方式,在/etc/rabbitmq/ra...原创 2019-12-22 11:53:55 · 2225 阅读 · 0 评论 -
RabbitMQ学习笔记:centos7中操作rabbitmqctl指令the VM is running with native name encoding of latin1 which may
CentOS7中安装了rabbitmq,操作CLI工具时报如下错误:warning: the VM is running with native name encoding of latin1 which may cause Elixir to malfunction as it expects utf8. Please ensure your locale is set to UTF-8 (w...原创 2019-12-17 17:53:25 · 2754 阅读 · 0 评论 -
RabbitMQ学习笔记:4369、5672、15672、25672默认端口号修改
1.默认5672端口号修改第一种方法:在/etc/rabbitmq/rabbitmq.conf配置文件中加上如下配置:listeners.tcp.default = 5673或者[ {rabbit, [ {tcp_listeners, [5673]} ] }]上面的示例将更改RabbitMQ监听AMQP0-9-1和AMQP 1.0协议客户端的连接端口从...原创 2019-12-17 16:34:09 · 48921 阅读 · 5 评论 -
RabbitMQ学习笔记:节点名称详解、rabbitmq-server、及rabbitmq-env.conf
rabbitmq-serverrabbitmq-server 启动一个RabbitMQ节点1.rabbitmq-server在前端启动一个RabbitMQ节点,示例如下:[root@rabbit3 rabbitmq]# rabbitmq-server ## ## RabbitMQ 3.8.1 ## ## ########## Copyright (c) 20...原创 2019-12-16 19:19:32 · 8691 阅读 · 1 评论 -
RabbitMQ学习笔记:rabbitmq-server -detached Warning: PID file not written; -detached was passed
1.停止Erlang节点及节点上的RabbitMQ应用[root@rabbit3 /]# rabbitmqctl stopwarning: the VM is running with native name encoding of latin1 which may cause Elixir to malfunction as it expects utf8. Please ensure yo...原创 2019-12-11 19:09:54 · 12437 阅读 · 2 评论 -
RabbitMQ学习笔记:消息服务器进程详解
查看后台rabbitmq服务进程可以看到一共有五个进程,其中PID为155(/usr/lib64/erlang/erts-10.5.6/bin/epmd -daemon)的进程是Erlang虚拟机的一个守护进程,与RabbitMQ节点一起运行,运行时使用它来发现特定节点监听端口;其它四个节点属于父子节点的关系;停止Erlang虚拟机和RabbitMQ应用服务#停止erlang虚拟机和R...原创 2019-12-11 19:01:17 · 2625 阅读 · 0 评论 -
RabbitMQ学习笔记:端口号解析(Port Access)
1.端口4369:epmd,RabbitMQ节点和CLI工具使用的对等发现服务端口EPMD与节点间相互通信epmd(Erlang Port Mapping Daemon)是一个小的附加守护进程,与每个RabbitMQ节点一起运行,运行时使用它来发现特定节点监听端口。然后,对等节点和CLI工具使用该端口。当一个节点或CLI工具需要连接节点rabbit@hostname2时,它将执行以下操作:...原创 2019-12-10 18:50:24 · 4613 阅读 · 0 评论 -
RabbitMQ学习笔记:CentOS7中安装RabbitMQ集群
安装rabbitmq的前提是 在CentOS7中,如果是在docker中安装,需要先创建镜像docker pull centos:7创建CentOS7服务器centos7docker run -itd --hostname rabbit1 --name centos7 -p 15672:15672 -p 5672:5672 -p 4369:4369 -p 25672:25672 cen......原创 2019-11-28 19:28:02 · 4805 阅读 · 0 评论 -
RabbitMQ学习笔记:docker-compose文件创建rabbitmq集群
docker-compose.yml文件version: '3.3'services: #rabbitmq container rabbit1: #use docker images image: rabbitmq:3.8.0-management #container name container_name: rabbitmq1 #set...原创 2019-11-25 19:15:28 · 850 阅读 · 0 评论 -
RabbitMQ学习笔记:高可用性(镜像)队列
什么是镜像队列默认情况 下,RabbitMQ集群中队列的内容位于单个节点(声明该队列的节点)上。这与交换器和绑定相反,交换器和绑定始终可以被视为在所有节点上。可以选择使队列跨多个节点进行镜像。每个镜像队列由一个主服务器和一个或多个镜像组成。主节点托管在一个通常称为主节点的节点上。每个队列都有其自己的主节点。给定队列的所有操作都首先应用于队列的主节点,然后传播到镜像。这涉及排队发布,向消费者传递...原创 2019-11-05 19:19:55 · 2372 阅读 · 2 评论 -
RabbitMQ学习笔记:使用Docker部署RabbitMQ集群
RabbitMQ本身是基于Erlang编写,Erlang语言天生具备分布式、高并发的特性(通过同步Erlang集群各节点的magic cookie来实现)。因此,RabbitMQ天生支持Clustering。这使得RabbitMQ本身不需要像ActiveMQ、Kafka那样通过Zookeeper分别来实现HA方案和保存集群的元数据。集群是保证可靠性的一种方式,同时可以通过水平扩展以达到增加消息吞...原创 2019-11-05 19:18:58 · 9529 阅读 · 0 评论 -
RabbitMQ学习笔记:流控(Per-connection flow control)
流控机制是用来避免消息发送速率过快而导致服务器难以支撑的情况。内存(memory)和磁盘(Disk space)达到阀值发出的警告相当于全局的流控,一旦触发会阻塞集群或者单机的所有连接(Connection),这一块我上一篇博文已经讲解过了,而本节的流控是针对单个连接(Connection)的。单个连接流控(Per-connection flow control)描述的是当发布服务(或发布服...原创 2019-10-29 19:33:59 · 1111 阅读 · 0 评论 -
RabbitMQ学习笔记:Connections、Channels、Queues之state状态
连接(Connections)、信道(Channels)、队列(queues)状态如下:Namerunning(运行中)flow(流控)idle(空闲)ConnectionstruetruetrueChannelstruetruetrueQueuetruetruetrue...原创 2019-10-26 09:29:17 · 9017 阅读 · 0 评论 -
RabbitMQ学习笔记:流控(Per-connection flow control)
流控机制是用来避免消息发送速率过快而导致服务器难以支撑的情况。内存(memory)和磁盘(Disk space)达到阀值发出的警告相当于全局的流控,一旦触发会阻塞集群或者单机的所有连接(Connection),这一块我上一篇博文已经讲解过了,而本节的流控是针对单个连接(Connection)的。单个连接流控(Per-connection flow control)描述的是当发布服务(或发布服...原创 2019-10-26 09:27:45 · 1197 阅读 · 1 评论 -
RabbitMQ学习笔记:内存(Memory)|磁盘空间(Disk space)阀值
相关文档指南: https://rabbitmq.com/memory.html支持的单位符号## k, kiB: kibibytes (2^10 - 1,024 bytes)## M, MiB: mebibytes (2^20 - 1,048,576 bytes)## G, GiB: gibibytes (2^30 - 1,073,741,824 bytes)## kB: kilo...原创 2019-10-26 09:26:41 · 12459 阅读 · 1 评论 -
RabbitMQ学习笔记:死信交换机DLX
DLX,即Dead Letter Exchange死信交换机概述队列中的消息可能会变成死信消息(dead-lettered),当发生如下事件时会导致消息变为死信:rejected: the message was rejected with requeue parameter set to false (消息被消费者使用basic.reject或basic.nack方法,并且reque...原创 2019-10-26 09:25:24 · 2315 阅读 · 0 评论 -
RabbitMQ学习笔记:高级特性TTL(过期时间)
TTL,Time To Live的简称,即消息过期时间,可以对消息和队列设置TTL。目前有两种方式可以设置消息的TTL。第一种是通过队列的属性设置,队列中的所有消息都有相同的过期时间。第二种方法是对消息本身进行单独设置,每条消息的TTL可以不同。如果两种方法同时设置,则TTL以两者之间较小的那个数值为准。消息在队列中的生存时间一旦超过设置的TTL值时,就会变成“死信”(Dead Messag...原创 2019-10-26 09:23:29 · 1768 阅读 · 0 评论 -
RabbitMQ学习笔记:队列容量设置(x-max-length、x-max-length-bytes、x-overflow)
rabbitmq可以设置队列的最大长度、队列最大容量及溢出后的处理逻辑Max lengthHow many (ready) messages a queue can contain before it starts to drop them from its head.(Sets the "x-max-length" argument.)即:设置队列中可以存储处于ready状态消息的...原创 2019-10-26 09:22:14 · 10713 阅读 · 0 评论 -
RabbitMQ学习笔记:虚拟主机(Virtual Hosts)
简介RabbitMQ是一个多租户系统,connetions、exchange、queues、bindings、user permissions、policies和其它一些属于虚拟主机的东西;Virtual vhost虚拟主机(vhost)提供逻辑分组和资源分离。每一个vhost本质上是一个mini版的RabbitMQ服务器,拥有自己的connection、exchange、queue、bin...原创 2019-10-26 09:20:54 · 11480 阅读 · 0 评论 -
RabbitMQ学习笔记:获取消息(Ack Mode)
在服务器端的客户端页面从队列中获取消息是一个危险的动作,生产环境一定要了解业务之后再做操作Act ModeNack message requeue true获取消息,但是不做ack应答确认,消息重新入队Ack message requeue false获取消息,应答确认,消息不重新入队,将会从队列中删除reject requeue true拒绝获取消息,消息...原创 2019-10-26 09:20:04 · 9906 阅读 · 4 评论 -
RabbitMQ学习笔记:消费者预取消息(basic.qos)
消费者预取是信道预取机制的扩展AMQP 0-9-1协议指定basic.qos方法,以便在使用时限制channel(connection)上未确认的消息数(也称之为“prefetch count”)。不幸的是,信道不是这方面的理想范围,因为一个信道可能消费来自多个队列的信息,信道和队列需要为发送的每个消息互相协助,以确保他们不会超过限制。这在单台机器上会很慢,在集群中使用会更慢。此外,对于...原创 2019-10-26 09:17:39 · 3969 阅读 · 0 评论 -
RabbitMQ学习笔记:消费者优先级(priority)
概述消费者优先级允许你确保高优先级消费者活动(非阻塞)的时候接收消息,低优先消费者只有在高优先级消费者阻塞的时候接收消息。通常,连接到队列上的活动消费者以循环的方式从队列接收消息。当消费者使用优先级,如果多个活动消费者存在,且具有相同的优先级,则消息轮流传递。活动消费者定义上述段落指的是消费者处于活动状态或受阻状态。在任何时候,给定的消费者不是活动状态就是阻塞状态,一个活动的消费者是可以不...原创 2019-10-26 09:16:12 · 2959 阅读 · 1 评论 -
RabbitMQ学习笔记:消息优先级(priority)
概括RabbitMQ在版本3.5.0中有优先级队列的实现,任何队列可以通过设置可选参数x-max-priority转换为优先级队列;这个参数应该是1到255之间的正整数,推荐设置1到10之间的数值,表示队列应该支持的最大优先级;声明优先级队列Channel ch = ...;Map<String, Object> args = new HashMap<String, ...原创 2019-10-26 09:14:50 · 6189 阅读 · 0 评论 -
RabbitMQ学习笔记:addReturnListener监听回退消息
发布消息示例channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, true, false, properties.build(), message.getBytes());参数:mandatory:如果为true, 消息不能路由到指定的队列时,则会调用basic.return方法将消息返回给生产者,会触发addReturnListener注册的...原创 2019-10-26 09:12:50 · 2564 阅读 · 1 评论