最近做RabbitMQ故障演练发现RabbitMQ服务器停止后,基于springboot的消费端不可以自动的恢复,队列的消费者消失,消息一直积压到队列中,这种情况肯定是不可接收的;通过研究源代码找到了解决方案。一、添加自动恢复配置automaticRecoveryCachingConnectionFactoryfactory=newCachingConnectionFactory(connectionFactory);cachingConnectionFactoryConfigurer.configure(factory);//设置TCP连接超时时间,默认:60000msfactory.get
集群成员之间的网络连接故障会影响客户机操作的数据一致性和可用性(如CAP定理)。由于不同的应用程序对一致性有不同的要求,并且对不可用性的容忍程度不同,所以可以使用不同的的分区处理策略。1.检测网络分区如果一个节点在一段时间内(默认是60秒)无法与对等端节点联系,则节点将认为其对等节点是否已关闭。如果两个节点重新接触,都认为另一个已关闭,则这些节点将确定已发生分区。将以如下形式记录到RabbitMQ日志:2020-05-1806:55:37.324[error]<0.341.0>Mnesia(rabbit@warp10):**ERROR**mnesia_eventgot{incons
rabbitmq客户端发送消息首先发送的交换器exchange,然后通过路由键routingKey和bindingKey比较判定需要将消息发送到那个队列queue上;在这个过程有两个地方消息可能丢失,第一消息发送到交换器exchange的过程,第二消息从交换器exchange发送到队列queue的过程;1.publiser-confirm模式可以确保生产者到交换器exchange消息有没有发送成功#设置此属性配置可以确保消息成功发送到交换器spring.rabbitmq.publisher-confirms=true2.publisher-return模式可以在消息没有被路由到指定的queue
从3.8.0开始,RabbitMQ提供内置的Prometheus和Grafana支持。rabbitmq_prometheus插件中提供了对Prometheus指标收集的支持。该插件以Prometheus文本格式在专用的TCP端口(默认端口15692)上公开所有RabbitMQ指标。rabbitmq_prometheus插件是RabbitMQ指标的核心导出器,由RabbitMQ核心团队开发。这是一个干净的设计,用于替换kbudde/rabbitmq_exporter,kbudde/rabbitmq_exporter由Prometheus开发用于RabbitMQ指标收集。这些指标提供了对Rabbi
理论说明RabbitMQ从3.6.0开始引入了惰性队列(LazyQueue)的概念。惰性队列会尽可能的将消息存入磁盘中,而在消费者消费到相应的消息时才会被加载到内存中,它的一个重要设计目标是能够支持更长的队列,即支持更多的消息存储。当消费者由于各种各样的原因(比如消费者下线、跌机、或者由于维护而关闭等)致使长时间不能消费消息而造成堆积时,惰性队列就很必要了。默认情况下,当生产者将消息发送到RabbitMQ的时候,队列中的消息会尽可能地存储在内存之中,这样可以更加快速地将消息发送给消费者。即使是持久化的消息,在被写入磁盘的同时也会在内存中驻留一份备份。当RabbitMQ需要释放内存的时候,会将内
本文概述了与RabbitMQ相关的主题。监控RabbitMQ和使用它的应用程序非常重要。监控有助于在问题影响到环境的其它部分以及最终影响最终用户之前检测到问题。系统的许多方面都可以被监控,本文档将它们分为几个类别:什么是监控,有什么共同的方法存在,为什么它是重要的。内置和外部监视选项。哪些基础设施和内核指标是重要的监视对象。有哪些RabbitMQ指标可用:节点指标队列指标集群范围指标应多久执行一次监控检查?应用程序级指标如何处理节点运行状态检查,以及为什么它比单个CLI命令更复杂。日志聚合基于命令行的observer工具跨所有节点和应用程序的日志聚合与监控密切相关,本文档中也提到了这一点。许多
客户端connection、channels、queues、consumers和系统其它部分自动生成的事件。例如,当一个connection被接受,虚拟主机通过了验证授权,将会发送一个connection_created事件,当一个connection关闭或者由于其它原因失败,将会发送一个connection_closed事件。RabbitMQ提供了一个最小的事件通知机制向RabbitMQ客户端公开。rabbitmq-event-exchange插件rabbitmq-event-exchange是一个消费内部事件并且重新发送到一个topicexchange的插件,因此可以展示事件给客户端应用程
延迟队列存储的对象是对应的延迟消息,所谓的延迟消息是指当消息被发送以后,并不想让消费者立刻拿到消息,而是等待特定时间后,消费者才能拿到这个消息进行消费。延迟消息使用的场景有很多,比如:在订单系统中,一个用户下单之后通常有30分钟的时间进行支付,如果30分钟之内没有支付成功,那么这个订单将进行异常处理,这时候就可以使用延迟队列来处理这些订单了。用户希望通过手机远程遥控家里的智能设备在指定的时间进行工作,这时候就可以将用户指令发送到延迟队列,当指令设定的时间到了再将指令推送到只能设备。在AMQP协议中,或RabbitMQ本身没有直接支持延迟队列的功能,但是可以通过TTL和DLX模拟出延迟队列的功能
1.引入springbootamqp依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>启用消息未成功发送到队列时强制退回及开启回调功能:spring.rabbitmq.publisher-returns=truespring.rabbitmq.template.mandatory=true2.发送消息到RabbitMQ消息服务器我们可以看
1.引入依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>配置application.properties文件:spring.rabbitmq.virtual-host=/#spring.rabbitmq.host=localhostspring.rabbitmq.addresses=172.30.67.122:5672,172.30.6
rabbitmq_tracing插件相当于Firehose的GUI版本,它同样能跟踪RabbitMQ中消息的流入流出情况。rabbitmq_tracing插件同样会对流入流出的消息进行封装,然后将封装后的日志存入相应的trace文件中。启动rabbitmq_tracing插件:[root@rabbit1/]#rabbitmq-pluginsenablerabbitmq_tracingEnablingpluginsonnoderabbit@rabbit1:rabbitmq_tracingThefollowingpluginshavebeenconfigured:rabbitmq_manageme
在使用任何消息中间件的过程中,难免会出现消息异常丢失的情况。对于RabbitMQ而言,可能是生产者与Broker断开了连接并且没有任何重试机制;也可能是消费者在处理消息时发生了异常,不过却提前进行了ack;甚至是交换器没有与任何队列绑定,生产者感知不到或者没有采取相应的措施;另外RabbitMQ本身的集群策略也可能导致消息的丢失,这个时候就需要有一个良好的机制来跟踪记录消息的投递过程,以此来协助开发或者运维人员快速的定位问题。Firehose在RabbitMQ中可以使用Firehose功能来实现消息追踪,Firehose可以记录每一次发送或者消费消息的记录,方便RabbitMQ的使用者进行调试
1.通过rabbitmqctl命令查看[root@rabbit1/]#rabbitmqctlstatus...FileDescriptorsTotal:2,limit:1048469Sockets:0,limit:943620...2.通过ManagementUI查看Socketdescriptors说明:ThenetworksocketscountandlimitmanagedbyRabbitMQ.WhenthelimitisexhaustedRabbitMQwillstopacceptingnewnetworkconnections.Filedescriptors说明:Filedescri
调整吞吐量是一个共同的目标,可以通过增加TCP缓冲区大小,确保Nagle算法被禁用,启用可选的TCP功能和扩展来实现改进。对于后两种情况,可以参考操作系统级优化部分。请注意,吞吐量的调整将涉及权衡。例如,增加TCP缓冲区大小将增加每个连接使用的RAM大小,这可能使服务器RAM使用总量显著的增加。TCP缓冲区大小这是一个关键的可调参数。每个TCP连接都为其分配了缓冲区。一般来说,这些缓冲区越大,每个连接使用的RAM就越多,吞吐量也就越好。在linux上,操作系统默认情况下会自动调整TCP缓冲区大小,通常设置在80到120KB之间。对于最大吞吐量,可以使用一组配置选项来增加缓冲区大小:AMQP0-
节点间连接对待发送的数据使用缓冲区,当缓冲区达到最大允许容量时,对节点间通信量应用临时限制。该限制是通过环境变量RABBITMQ_DISTRIBUTION_BUFFER_SIZE来设置,单位是kilobytes,默认值是128MB(128000KB)。在具有大量节点间通信量的集群中,增加此值可能会对吞吐量产生积极影响。不建议小于64MB的值。环境变量配置方式,在/etc/rabbitmq/rabbitmq-env.conf配置文件中加上如下配置:#单位KBDISTRIBUTION_BUFFER_SIZE=128000GitHub地址:https://github.com/mingyang66/
CentOS7中安装了rabbitmq,操作CLI工具时报如下错误:warning:theVMisrunningwithnativenameencodingoflatin1whichmaycauseElixirtomalfunctionasitexpectsutf8.PleaseensureyourlocaleissettoUTF-8(whichcanbeverifiedbyrunning"locale"inyourshell)解决方法是在/etc/profile环境变量配置文件末尾加上如下配置:exportLC_ALL=en_US.UTF-8然后执行:source/etc
1.默认5672端口号修改第一种方法:在/etc/rabbitmq/rabbitmq.conf配置文件中加上如下配置:listeners.tcp.default=5673或者[{rabbit,[{tcp_listeners,[5673]}]}]上面的示例将更改RabbitMQ监听AMQP0-9-1和AMQP1.0协议客户端的连接端口从5672到5673。https://www.rabbitmq.com/configure.htmlRabbitMQ服务器源存储库包含一个名为RabbitMQ.conf.example的配置文件示例,它包含你可能想要设置的大多数配置项的示例(省略了一些非常模糊的匹配
rabbitmq-serverrabbitmq-server启动一个RabbitMQ节点1.rabbitmq-server在前端启动一个RabbitMQ节点,示例如下:[root@rabbit3rabbitmq]#rabbitmq-server####RabbitMQ3.8.1##############Copyright(c)2007-2019PivotalSoftware,Inc.##################LicensedundertheMPL1.1.Website:https://rabbitmq.comDocguides:https://rabbitmq.com/docume
1.停止Erlang节点及节点上的RabbitMQ应用[root@rabbit3/]#rabbitmqctlstopwarning:theVMisrunningwithnativenameencodingoflatin1whichmaycauseElixirtomalfunctionasitexpectsutf8.PleaseensureyourlocaleissettoUTF-8(whichcanbeverifiedbyrunning"locale"inyourshell)Stoppingandhaltingnoderabbit@rabbit3...2.启动Erlang节
查看后台rabbitmq服务进程可以看到一共有五个进程,其中PID为155(/usr/lib64/erlang/erts-10.5.6/bin/epmd-daemon)的进程是Erlang虚拟机的一个守护进程,与RabbitMQ节点一起运行,运行时使用它来发现特定节点监听端口;其它四个节点属于父子节点的关系;停止Erlang虚拟机和RabbitMQ应用服务#停止erlang虚拟机和RabbitMQ应用服务器rabbitmqctlstop查看Erlang虚拟机和RabbitMQ应用服务停止后的进程情况[root@rabbit3/]#psauxUSERPID%CPU%MEMVSZRSSTTYSTA
1.端口4369:epmd,RabbitMQ节点和CLI工具使用的对等发现服务端口EPMD与节点间相互通信epmd(ErlangPortMappingDaemon)是一个小的附加守护进程,与每个RabbitMQ节点一起运行,运行时使用它来发现特定节点监听端口。然后,对等节点和CLI工具使用该端口。当一个节点或CLI工具需要连接节点rabbit@hostname2时,它将执行以下操作:使用标准操作系统解析器或inetrc文件中指定的自定义解析程序将hostname2解析为IP4或IPv6地址使用上述地址联系在hostname2上运行的epmd向epmd询问rabbit节点使用的端口号使用解析的I
安装rabbitmq的前提是在CentOS7中,如果是在docker中安装,需要先创建镜像dockerpullcentos:7创建CentOS7服务器mq2dockerrun-d--privileged=true--hostnamerabbit2--namemq2-p15672:15672-p5672:5672-p4362:4369-p25672:25672-p15692:15692-eTZ=Asia/Shanghaicentos:7/usr/sbin/init创建CentOS7服务器mq3dockerrun-d--privileged=true--hostnamerabbit3--namem
docker-compose.yml文件version:'3.3'services:#rabbitmqcontainerrabbit1:#usedockerimagesimage:rabbitmq:3.8.0-management#containernamecontainer_name:rabbitmq1#setuphostnamehostname:rabbit1##配置默认账号environment:-RABBITMQ_DEFAULT_VHOST=/-RABBITMQ_DEFAULT_USER=admin-RABBITMQ_DEFAULT_PASS=admin#-RABBITMQ_NODEN
什么是镜像队列默认情况下,RabbitMQ集群中队列的内容位于单个节点(声明该队列的节点)上。这与交换器和绑定相反,交换器和绑定始终可以被视为在所有节点上。可以选择使队列跨多个节点进行镜像。每个镜像队列由一个主服务器和一个或多个镜像组成。主节点托管在一个通常称为主节点的节点上。每个队列都有其自己的主节点。给定队列的所有操作都首先应用于队列的主节点,然后传播到镜像。这涉及排队发布,向消费者传递消息,跟踪来自消费者的确认等。队列镜像意味着节点的集群。因此,不建议在WAN中使用它(当然,客户端仍然可以根据需要进行远近连接)。发布到队列的消息将复制到所有镜像。消费者连接到主服务器,无论它们连接到那个节
RabbitMQ本身是基于Erlang编写,Erlang语言天生具备分布式、高并发的特性(通过同步Erlang集群各节点的magiccookie来实现)。因此,RabbitMQ天生支持Clustering。这使得RabbitMQ本身不需要像ActiveMQ、Kafka那样通过Zookeeper分别来实现HA方案和保存集群的元数据。集群是保证可靠性的一种方式,同时可以通过水平扩展以达到增加消息吞吐量的能力。HA是HighAvailable缩写,是双机集群系统简称,指高可用性集群,是保证业务连续性的有效解决方案,一般有两个或两个以上的节点,且分为活动节点及备用节点。上图中采用三个节点组成了一个Ra
流控机制是用来避免消息发送速率过快而导致服务器难以支撑的情况。内存(memory)和磁盘(Diskspace)达到阀值发出的警告相当于全局的流控,一旦触发会阻塞集群或者单机的所有连接(Connection),这一块我上一篇博文已经讲解过了,而本节的流控是针对单个连接(Connection)的。单个连接流控(Per-connectionflowcontrol)描述的是当发布服务(或发布服务组)向队列发送消息的速度快于队列处理速度时发生的情况,即:queue队列到达了性能瓶颈。一个连接触发流控时会处于flow的状态,也就意味着这个Connection的状态每秒在blocked和unblocked之
RabbitMQ学习笔记:Connections、Channels、Queues之state状态连接、信道、队列状态如下:Namerunning(运行中)flow(流控)idle(空闲)blocked(阻塞)unblocked(未阻塞)ConnectionstruetruetruetruetrueChannelstruetruetruetruetrueQueuetruetruetruetruetrueGitHub地址:https://github.com/mingyang66/spring-parent
流控机制是用来避免消息发送速率过快而导致服务器难以支撑的情况。内存(memory)和磁盘(Diskspace)达到阀值发出的警告相当于全局的流控,一旦触发会阻塞集群或者单机的所有连接(Connection),这一块我上一篇博文已经讲解过了,而本节的流控是针对单个连接(Connection)的。单个连接流控(Per-connectionflowcontrol)描述的是当发布服务(或发布服务组)向队列发送消息的速度快于队列处理速度时发生的情况,即:queue队列到达了性能瓶颈。一个连接触发流控时会处于flow的状态,也就意味着这个Connection的状态每秒在blocked和unblocked之
相关文档指南:https://rabbitmq.com/memory.html支持的单位符号##k,kiB:kibibytes(2^10-1,024bytes)##M,MiB:mebibytes(2^20-1,048,576bytes)##G,GiB:gibibytes(2^30-1,073,741,824bytes)##kB:kilobytes(10^3-1,000bytes)##MB:megabytes(10^6-1,000,000bytes)##GB:gigabytes(10^9-1,000,000,000bytes)内存警告RabbitMQ服务器在启动和执行rabbitmqctlset
DLX,即DeadLetterExchange死信交换机概述队列中的消息可能会变成死信消息(dead-lettered),当发生如下事件时会导致消息变为死信:rejected:themessagewasrejectedwithrequeueparametersettofalse(消息被消费者使用basic.reject或basic.nack方法,并且requeue参数设置为false,通过这种方式进行消息确认)expired:themessageTTLhasexpired(消息过期)maxlen:themaximumallowedqueuelengthwasexceeded(消息由于队列长度及