`
aitanjupt
  • 浏览: 2419 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
xsz
社区版块
存档分类
最新评论

RabbitMQ关键性问题调研

阅读更多

摘要:本篇是本人对RabbitMQ使用的关键性问题进行的调研,如性能上限、数据存储、集群等,

            具体的RabbitMQ概念、使用方法、SpringAMQP配置,假设读者已有了基础。

1.      RabbitMQ

1.1  RabbitMQ数据速率问题

在边读边写的情况下:速率只与网络带宽正相关,网络使用率最高能达到接近100%,并且数据使用率很高(90%以上)。

        在千兆网下,以500KB一条数据为例,读写速率均能达到200/s,约为100MB/s

在只写不读的情况下:写入速率瓶颈在于硬盘写入速度。

 

1.2  RabbitMQ数据存储路径变更到D盘方法

Windows环境下,在安装前设置环境变量:RABBITMQ_BASE=D:\RabbitMQ_Data

 

1.3  RabbitMQ磁盘写满重启后数据丢失问题

表现:磁盘写满后发送、读取程序均不能连接服务。

解决方法:将QueueExchange设置为Durable即不会发生数据丢失问题。

通过a.关闭服务;b.删除占位文件、erl_crash.dump;c.重启服务 三步操作后,磁盘会清理出10M左右空间,此时读取数据程序便可正常工作。

正确设计的架构,应确保RabbitMQ不会发生磁盘写满崩溃的情况。

 

1.4  RabbitMQ集群

在网络带宽占满的情况下,通过集群的方式解决吞吐量不足的问题需要多台效果才明显。

rabbitmq集群

假设外设吞吐率为d条/s,外设向RabbitMQ1发送的概率为r1,向RabbitMQ2发送的概率为r2,RabbitMQ1需要向RabbitMQ2转发的概率为r3,RabbitMQ2需要向RabbitMQ1转发的概率为r3。那么RabbitMQ1进入的吞吐率为:(r1*d + r4*r2*d) 条/s ≈ 3d/4条/s,RabbitMQ2进入的吞吐率为:(r2*d + r3*r1*d) 条/s ≈ 3d/4条/s;这样的确比只使用一台RabbitMQ的吞吐率d/s要求低些。

NRabbitMQ的集群,每台的平均吞吐率为:(2N-1)d/(N*N) 条/sN=3时,平均吞吐率为5d/9/sN=4时,平均吞吐率为7d/16/s

解决方法:多台RabbitMQ服务器提供服务,在客户端以轮循方式访问服务,若1down掉则不使用此台的队列服务,服务器之间没有联系,这样NRabbitMQ的平均吞吐率为:1d/N /s。具体实现可以,专写一个用户收发RabbitMQ消息的jar/dll,在配置文件里填写RabbitMQ机器地址,使用轮循询问、收发的方式,提供给应用程序以黑盒方式调用。下面提供了java版本的收发实现。

发送端sender.xml配置:

 

<!-- 处理器相关 -->
    <bean id="sender" class="demo.Sender">
        <property name="templates">
            <list>
                <ref bean="template1" />
            <!--     <ref bean="template2" /> -->
            </list>
        </property>
    </bean>
 
    <bean id="timeFlicker" class="demo.TimeFlicker">
        <property name="handlers">
            <list>
                <ref bean="sender" />
            </list>
        </property>
    </bean>
    <!-- 处理器相关 -->
 
    <!-- amqp配置 相关 -->
    <rabbit:connection-factory id="connectionFactory1"
        host="192.1.11.108" username="guest" password="guest" virtual-host="/" />
    <rabbit:connection-factory id="connectionFactory2"
        host="192.1.11.172" username="guest" password="guest" virtual-host="/" />
    <!-- amqp配置 相关 -->
 
    <!-- 发送相关 -->
    <rabbit:template id="template1" connection-factory="connectionFactory1"
        exchange="exchange" />
 
    <rabbit:template id="template2" connection-factory="connectionFactory2"
        exchange="exchange" />
    <!-- 发送相关 -->

 

                  说明:这里配置了两个RabbitMQ服务器,timeFlicker的目的是过一段时间把不能服务的RabbitMQ服务器重新添加到列表中,重试发送。

                  接收端receiver.xml配置:

 

<!-- amqp配置 相关 -->
    <rabbit:connection-factory id="connectionFactory1"
        host="192.1.11.108" username="guest" password="guest" virtual-host="/" />
    <rabbit:connection-factory id="connectionFactory2"
        host="192.1.11.172" username="guest" password="guest" virtual-host="/" />
    <!-- amqp配置 相关 -->
 
    <!-- 监听相关 -->
    <bean id="Recv1" class="demo.Recv1" />
    <rabbit:listener-container id="Listener1"
        connection-factory="connectionFactory1" prefetch="1" acknowledge="auto">
        <rabbit:listener ref="Recv1" method="listen"
            queue-names="queue1" />
    </rabbit:listener-container>
    <bean id="Recv2" class="demo.Recv2" />
    <rabbit:listener-container id="Listener"
        connection-factory="connectionFactory1" prefetch="1" acknowledge="auto">
        <rabbit:listener ref="Recv2" method="listen"
            queue-names="queue2" />
    </rabbit:listener-container>
    <!-- 监听相关 -->

 

                 说明:这里监听了两个RabbitMQ服务器,此处不需要timeFlicker。

                 如需具体代码可以联系本人 http://www.cnblogs.com/wgp13x/

分享到:
评论
1 楼 leiyu007 2015-01-09  
非常受用,谢谢分享,能否发一份源码给我,我的邮箱40716577@qq.com

相关推荐

    RabbitMQ调研文档

    ### RabbitMQ核心概念与原理 #### 一、消息队列(Message Queue,MQ)概述 消息队列(MQ)作为一种应用程序间的通信方式,允许不同应用通过读写队列中的消息...这些知识对于理解并利用RabbitMQ解决实际问题非常关键。

    史上最全 Java面试集锦 知识扫盲 面试题分析

    - 引入复杂性:需要考虑消息丢失、重复消费、顺序性等问题 - 延迟:消息的异步处理可能导致一定的延迟 - 数据一致性问题:可能需要额外机制保证数据的一致性 3. **常见的消息队列对比** - **Kafka**:适合大...

    3.1)如何保障消息的可靠性投递1

    生产端的可靠性投递涉及以下几个关键点: 1. 保障消息成功发送:确保消息从应用服务器正确发送到消息中间件。 2. 确保MQ节点接收:消息中间件如RabbitMQ或Kafka应成功接收到消息,避免在网络传输中丢失。 3. 收到MQ...

    个人用了8年的Java工程师简历

    - **RabbitMQ**: 熟练使用RabbitMQ进行消息传递,解决消息丢失、重复消费等问题。 ### JVM与性能调优 - **JVM原理**: 深入理解JVM内存模型、类加载机制,熟悉常见的垃圾回收算法及垃圾收集器。 - **性能调优**: ...

    java张国浩.pdf

    8. 项目管理与团队领导:在担任武汉佰钧成技术有限责任公司java开发小组长期间,他负责了项目的需求调研、技术方案制定、开发计划制定、项目进度和质量的把控。此外,他还负责了组员代码的定期审查,保证了代码质量...

    企业办公管理系统的设计与实现.rar

    3. 数据库设计:系统中的数据管理是关键,因此需要设计合理的数据库模型,如ER图(实体关系图),确保数据的一致性、完整性和安全性。常用的关系型数据库有MySQL、Oracle等,非关系型数据库如MongoDB则适用于处理...

    PPMessage在线客服平台 v1.0.zip

    3. **消息队列**:为了处理高并发和消息延迟问题,平台可能使用消息队列服务,如RabbitMQ或Kafka。消息队列可以缓存大量请求,确保系统的稳定性和可扩展性。 4. **多渠道集成**:现代在线客服平台通常支持多种沟通...

    MF00876-SCRM管理系统源码.zip

    - **服务管理**:提供客户服务支持,包括问题追踪、工单处理、满意度调查等。 2. **技术架构**: - **前端技术**:可能采用HTML5、CSS3、JavaScript等构建用户界面,同时使用React、Vue或Angular等现代前端框架...

    5.爬虫系统架构设计方案1内部逻辑.zip

    爬虫系统架构设计方案是构建大规模数据抓取和处理的关键步骤,其内部逻辑涉及多个核心组件和流程。在设计这样的系统时,我们首先需要理解爬虫的基本工作原理:它通过模拟浏览器行为,自动请求网页,解析HTML或其他...

    卓越亚马逊软件开发类笔试题

    【卓越亚马逊软件开发类笔试题】是针对应聘者在软件开发领域的专业知识和能力进行测试的一系列问题,旨在评估应聘者的编程能力、面向对象设计思想以及数据库管理知识。下面将对两个具体题目进行详细解答。 **题目一...

    java系统架构师的简历 (2).pdf

    5. **系统设计与架构**:掌握系统设计原则,如高可用性、可扩展性和容错性,能设计分层和模块化的系统架构。 6. **性能优化**:具备性能调优经验,理解JVM原理,能进行内存分析和性能瓶颈排查。 7. **持续集成与...

    Cometica:护理伦理委员会(投诉模块)

    安全性是Cometica必须考虑的关键点。Java中的Spring Security可以用来实现用户认证和授权,确保只有授权人员能够访问特定的投诉信息。同时,系统应遵循最佳实践,如使用HTTPS协议加密通信,防止数据在传输过程中被...

    客户服务

    3. 降低流失率:通过及时解决问题,可以减少用户因不满意而流失的可能性。 4. 收集反馈:客户服务是收集用户需求和反馈的重要渠道,有助于产品迭代和改进。 二、Java在客户服务中的应用 1. 开发客服系统:Java以其...

    大并发架构设计

    - **实现**: 实现高可靠性的关键在于冗余设计、容错机制以及监控与恢复策略的实施。 #### 二、应对大数据架构设计 - **云计算简介**: 云计算是一种通过网络提供按需计算资源和服务的模型。它允许用户根据需求动态...

    风控现有技术框架

    8. **消息队列**:为了提高系统的异步处理能力和解耦程度,消息队列(如RabbitMQ、Kafka等)被广泛应用。特别是在高并发场景下,消息队列能够确保消息的可靠传递。 #### 三、具体应用场景 风控技术框架在实际应用中...

    streamrpolls-api

    在IT行业中,这样的API通常用于构建能够处理大量实时数据的系统,比如社交媒体的实时投票、数据分析平台或者在线调查应用。下面我们将详细探讨这个API可能涵盖的关键技术点。 1. **实时数据流处理**:Streamrpolls-...

Global site tag (gtag.js) - Google Analytics