`
ldd600
  • 浏览: 103789 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
47bb354f-8b5f-3ea6-a206-c7ead38c741c
Hyperic插件开发不完...
浏览量:11273
社区版块
存档分类
最新评论
阅读更多

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使用中有以下几点需要注意:
  1. 刚才也说到,有的项目没有自动绑定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上。还是线下陪比较稳妥。
分享到:
评论
1 楼 mengrufeng007 2013-03-01  
请问配置文件中exchange和queue是如何绑定的呢,我用的也是fanout exchange模式

相关推荐

    RabbitMQ使用总结

    ### RabbitMQ 使用总结 #### 一、安装与配置 **1. 安装顺序** - **ERLANG安装**: 首先确保安装了Erlang环境。安装时注意选择带有`windowdll`选项的版本,这有助于后续RabbitMQ的稳定运行。 - **RabbitMQ安装**: ...

    C#的Demo项目:RabbitMQ封装和使用

    总结起来,这个C# Demo项目旨在教会我们如何在.NET环境中使用RabbitMQ进行消息传递,通过封装RabbitMQ.Client库,我们可以更高效地利用交换机功能,实现不同场景下的消息路由。通过学习这个项目,开发者能够更好地...

    windows RabbitMQ安装总结.docx

    Windows RabbitMQ 安装总结 本文总结了 Windows 平台下 RabbitMQ 的安装过程,从下载 Erlang 到安装 RabbitMQ 服务器,并提供了 Java 代码示例,展示了生产者和...通过本文,读者可以快速掌握 RabbitMQ 的安装和使用。

    android上RabbitMQ发送简单例子

    总结来说,使用RabbitMQ在Android上进行网络发送涉及服务器安装、客户端集成、消息队列的声明和使用,以及AMQP协议的交互。对于初学者来说,理解这些基本概念和操作是至关重要的,可以帮助构建可靠和可扩展的跨平台...

    rabbitmq-c-master.rar_RabbitMQ c lib_cmake编译_rabbitmq_rabbitmq-c

    **正文** ...总结,`rabbitmq-c-master`的编译过程主要涉及CMake的使用,以及对RabbitMQ和AMQP协议的理解。通过这个过程,开发者可以将RabbitMQ的功能集成到C语言的应用中,实现可靠的消息传递和异步处理。

    RabbitMq整合使用

    **RabbitMQ整合使用详解** RabbitMQ是一个开源的消息队列系统,基于AMQP(Advanced Message Queuing Protocol)协议,广泛应用于分布式系统中,用于处理异步任务、解耦组件以及实现流量控制。在Spring Boot框架中...

    rabbitMQ3.7.8windows安装软件包

    RabbitMQ是一款开源的...总结,安装RabbitMQ 3.7.8 on Windows涉及Erlang环境的准备、RabbitMQ服务的安装与配置,以及基本的管理和使用知识。正确配置和使用RabbitMQ,能有效提升分布式系统中的消息通信效率和可靠性。

    安装rabbitmq步骤文档

    首先使用xz命令去除文件的xz压缩,然后使用tar命令解压安装包。 ##### 5. 禁用SELinux ```bash vim /etc/selinux/config SELINUX=disabled ``` 编辑selinux配置文件,将SELINUX设置为disabled状态,以避免SELinux对...

    RabbitMQ Java测试客户端

    总结一下,这个“RabbitMQ Java测试客户端”项目是一个实践示例,展示了如何在Java应用程序中使用RabbitMQ进行消息传递。它涵盖了连接管理、消息发送与接收的基本流程,对于学习和理解RabbitMQ在Java环境下的应用...

    rabbitmq window2008安装和使用说明配置说明

    总结来说,RabbitMQ在Windows 2008上的安装和使用涉及下载安装、配置环境变量、启动服务、配置管理、创建用户和虚拟主机、设置安全策略、使用消息队列和交换器等步骤。理解并熟练掌握这些知识,将有助于你在实际项目...

    Rabbitmq 默认配置文件模板

    总结来说,`rabbitmq.config`和`advanced.config`是RabbitMQ服务器的核心配置文件,它们定义了RabbitMQ的行为和性能特性。理解并正确配置这些文件对于优化RabbitMQ的性能和稳定性至关重要,特别是在分布式环境中。...

    RabbitMQ与SpringMVC集成

    总结来说,RabbitMQ与SpringMVC的集成可以极大地增强Web应用的异步处理能力,提高系统的可扩展性。在实际应用中,需要正确安装和配置Erlang及RabbitMQ,然后利用Spring的AMQP支持将消息队列功能融入到Web应用中,...

    docker安装rabbitmq并整合springboot

    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 入门教程(JAVA)

    RabbitMQ 和消息传递系统通常会使用特定的术语来描述其中的关键组件。 - **生产者(Producer)**:生产者是指发送消息的程序或应用。在RabbitMQ 的图形表示中,我们通常用 "P" 来标记它。 - **队列(Queue)**:队列是...

    RabbitMQ Erlang 安装包与使用说明

    总结来说,这个压缩包提供了一个完整的RabbitMQ和Erlang的安装流程,以及一个Java Maven项目的示例,帮助开发者快速入门并实践RabbitMQ的消息队列功能。通过阅读和执行这些步骤,你可以深入了解RabbitMQ和Erlang在...

    两种简单Rabbitmq使用方案及其测试

    ### 两种简单RabbitMQ使用方案及其测试 #### 方案一:简单负载均衡方案 **问题分析** 在RabbitMQ集群环境中,虽然客户端能够通过任意节点访问消息队列,但消息队列本身只驻留在一个特定的物理节点上。这意味着...

    linux中rabbitmq安装包

    总结来说,Linux上的RabbitMQ安装需要先安装Erlang环境,然后安装RabbitMQ服务器,并进行必要的配置和安全管理。RabbitMQ作为一个强大的消息中间件,能够有效地帮助你在分布式系统中实现异步处理和解耦。在实际应用...

    rabbitMQ安装包.zip

    总结来说,RabbitMQ是一个强大的消息中间件,它的安装通常涉及下载安装包、解压、安装和启动服务。了解RabbitMQ的基本概念和使用方式对于构建高效、可靠的分布式系统至关重要。通过熟练掌握RabbitMQ,开发者可以构建...

    rabbitMQ实战java版-rabbitMQ-demo.zip

    总结,RabbitMQ作为消息中间件,为Java开发者提供了强大的工具,帮助构建高可用、可扩展的系统。"rabbitMQ-demo.zip"中的"rabbitMQ-demo-main"项目是学习和实践RabbitMQ的宝贵资源,通过它,我们可以更深入地理解...

    RabbitMQ自动安装脚本

    总结来说,RabbitMQ自动安装脚本是高效部署RabbitMQ的关键工具,它涵盖了从环境准备、依赖安装到服务启动的全过程。理解这一过程有助于我们更好地管理和维护RabbitMQ服务器,特别是在离线环境中,确保服务的稳定性和...

Global site tag (gtag.js) - Google Analytics