1. 神奇的现象
今天发布版本时,重启了整个rabbitmq集群,发现有的模块和rabbitmq中的exchange解绑了。而且启动时并没有自动绑定。有个同事有十几个queue,全部手动绑定了一下。导致上线时间多花了10多分钟。现象描述:
- queue和exchange自动解绑
- 启动时没有自动绑定queue
2. 背后的故事
rabbitmq我们采用的是fanout exchange模式,这样一个应用发消息,其他模块感兴趣的可以自己创建queue去绑定监听。现在用户产生一条数据,后面的很多服务比如说Feed,搜索,计数,行为记录,系统通知等都采用了异步处理的方式。也说明了我们整个架构依赖于Rabbitmq。
- rabbitmq的exchange,queue有durable,非durable两种。我们自动解绑的原因就是因为exchange设置的是非durable的,导致每次重启后,绑定都失效了。但是发送方又自动创建了exchange,而queue是durable的,现象就是她们之间失去了绑定。
- 用rabbitmq开发时,java端用了spring amqp,ruby端用了bunny。我们就说spring的amqp吧,在rabbitmq使用中有以下几点需要注意:
- 刚才也说到,有的项目没有自动绑定queue,原因有两个(1)没有配置amqpadmin,(2)lazy-init设置的是true。spring的amqpadmin在系统启动时会自动get出exchange,queue的bean,将她们在rabbitmq中注册。
<rabbit:admin id="amqpAdmin" connection-factory="connectionFactory" />
2. Spring在这里也使用了它那万能的template模式,connectionfactory用的是CachingConnectionFactory,cachingconnectionfactory的cachingsize要注意他不是连接数的大小,是channel的个数,channel相当于session的概念,一个connection可以创建多个channel。cachingconnectionfactory用aop的方式用一个双向链表pool了cachesize的channel。我们在它的基础上用commons-pool开发了一个连接池。不过cachingconnectionfactory性能已经够好了。
3. 对于监听方Spring又使用了他那万能的simplelistenercontainer,估计还是轮询不断receive消息。concurrentconsumer可以配多个线程并发收消息,假设是收到消息的处理逻辑时间较长。可以多线程并发的处理,提高处理效率。
3. 真实的世界
- 真实使用时,rabbitmq如果出问题了,那我们整个系统的数据就不同步了。甚至一些主要功能都会无法正常试用。所以queue要处理好单点失败的问题。
(1)rabbitmq我们采用的是active/active的模式,一些重要的queue可以采用mirror的方式复制。保证高可用。如果不是mirror queue的方式,就有可能会丢失数据。如果用了mirror queue,即使是ram node也会在磁盘里写入数据。
(2)接收方负载均衡,接收方我们可以监听集群中任意rabbitmq,写入的服务器会平均的把消息deliver给其他node。两个node测试下来,各处理了50%。其他node其实也相当于一个listener。这个逻辑还需要多测试,比如一台多配一些listener,处理的快一点,试试是否还是绝对平均。
(3)我们会发现在配置写入的client端时,我们还是指定的其中的某台rabbitmq服务器用于写入,就像主库一样。但是它有可能会是单点失败的。这时我们往往是在前面加个HAProxy或者LVS来解决问题。这样写入就做了负载均衡,也解决了failover的问题。HAProxy通过keeplive的方式保持高可用。
- 很多人喜欢用代码来自动创建exchange,queue,binding,我其实不太喜欢这样,我觉得这些就像契约一样,应该预先商定好,创建好。(1)大家配的不是相同的,(2)可能会乱配,要求durable的,有的人配的不是durable,(3)应该是exchange,有的人用在了queue上。还是线下陪比较稳妥。
分享到:
相关推荐
### RabbitMQ 使用总结 #### 一、安装与配置 **1. 安装顺序** - **ERLANG安装**: 首先确保安装了Erlang环境。安装时注意选择带有`windowdll`选项的版本,这有助于后续RabbitMQ的稳定运行。 - **RabbitMQ安装**: ...
总结起来,这个C# Demo项目旨在教会我们如何在.NET环境中使用RabbitMQ进行消息传递,通过封装RabbitMQ.Client库,我们可以更高效地利用交换机功能,实现不同场景下的消息路由。通过学习这个项目,开发者能够更好地...
Windows RabbitMQ 安装总结 本文总结了 Windows 平台下 RabbitMQ 的安装过程,从下载 Erlang 到安装 RabbitMQ 服务器,并提供了 Java 代码示例,展示了生产者和...通过本文,读者可以快速掌握 RabbitMQ 的安装和使用。
总结来说,使用RabbitMQ在Android上进行网络发送涉及服务器安装、客户端集成、消息队列的声明和使用,以及AMQP协议的交互。对于初学者来说,理解这些基本概念和操作是至关重要的,可以帮助构建可靠和可扩展的跨平台...
**RabbitMQ整合使用详解** RabbitMQ是一个开源的消息队列系统,基于AMQP(Advanced Message Queuing Protocol)协议,广泛应用于分布式系统中,用于处理异步任务、解耦组件以及实现流量控制。在Spring Boot框架中...
**正文** ...总结,`rabbitmq-c-master`的编译过程主要涉及CMake的使用,以及对RabbitMQ和AMQP协议的理解。通过这个过程,开发者可以将RabbitMQ的功能集成到C语言的应用中,实现可靠的消息传递和异步处理。
RabbitMQ是一款开源的...总结,安装RabbitMQ 3.7.8 on Windows涉及Erlang环境的准备、RabbitMQ服务的安装与配置,以及基本的管理和使用知识。正确配置和使用RabbitMQ,能有效提升分布式系统中的消息通信效率和可靠性。
总结来说,Linux上的RabbitMQ安装需要先安装Erlang环境,然后安装RabbitMQ服务器,并进行必要的配置和安全管理。RabbitMQ作为一个强大的消息中间件,能够有效地帮助你在分布式系统中实现异步处理和解耦。在实际应用...
首先使用xz命令去除文件的xz压缩,然后使用tar命令解压安装包。 ##### 5. 禁用SELinux ```bash vim /etc/selinux/config SELINUX=disabled ``` 编辑selinux配置文件,将SELINUX设置为disabled状态,以避免SELinux对...
总结一下,这个“RabbitMQ Java测试客户端”项目是一个实践示例,展示了如何在Java应用程序中使用RabbitMQ进行消息传递。它涵盖了连接管理、消息发送与接收的基本流程,对于学习和理解RabbitMQ在Java环境下的应用...
总结来说,RabbitMQ在Windows 2008上的安装和使用涉及下载安装、配置环境变量、启动服务、配置管理、创建用户和虚拟主机、设置安全策略、使用消息队列和交换器等步骤。理解并熟练掌握这些知识,将有助于你在实际项目...
总结来说,RabbitMQ与SpringMVC的集成可以极大地增强Web应用的异步处理能力,提高系统的可扩展性。在实际应用中,需要正确安装和配置Erlang及RabbitMQ,然后利用Spring的AMQP支持将消息队列功能融入到Web应用中,...
总结来说,`rabbitmq.config`和`advanced.config`是RabbitMQ服务器的核心配置文件,它们定义了RabbitMQ的行为和性能特性。理解并正确配置这些文件对于优化RabbitMQ的性能和稳定性至关重要,特别是在分布式环境中。...
2. 启动 RabbitMQ 容器:使用 Docker 的 run 命令启动 RabbitMQ 容器,例如:`docker run -d -p 5672:5672 -p 15672:15672 --name myrabbitmq docker.io/rabbitmq:3.9.8-management`。 - `-p 5672:5672` 标识 Linux...
RabbitMQ 和消息传递系统通常会使用特定的术语来描述其中的关键组件。 - **生产者(Producer)**:生产者是指发送消息的程序或应用。在RabbitMQ 的图形表示中,我们通常用 "P" 来标记它。 - **队列(Queue)**:队列是...
总结来说,这个压缩包提供了一个完整的RabbitMQ和Erlang的安装流程,以及一个Java Maven项目的示例,帮助开发者快速入门并实践RabbitMQ的消息队列功能。通过阅读和执行这些步骤,你可以深入了解RabbitMQ和Erlang在...
总结来说,RabbitMQ是一个强大的消息中间件,它的安装通常涉及下载安装包、解压、安装和启动服务。了解RabbitMQ的基本概念和使用方式对于构建高效、可靠的分布式系统至关重要。通过熟练掌握RabbitMQ,开发者可以构建...
### 两种简单RabbitMQ使用方案及其测试 #### 方案一:简单负载均衡方案 **问题分析** 在RabbitMQ集群环境中,虽然客户端能够通过任意节点访问消息队列,但消息队列本身只驻留在一个特定的物理节点上。这意味着...
总结,RabbitMQ作为消息中间件,为Java开发者提供了强大的工具,帮助构建高可用、可扩展的系统。"rabbitMQ-demo.zip"中的"rabbitMQ-demo-main"项目是学习和实践RabbitMQ的宝贵资源,通过它,我们可以更深入地理解...
总结来说,RabbitMQ自动安装脚本是高效部署RabbitMQ的关键工具,它涵盖了从环境准备、依赖安装到服务启动的全过程。理解这一过程有助于我们更好地管理和维护RabbitMQ服务器,特别是在离线环境中,确保服务的稳定性和...