关于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磁盘写满重启后数据丢失问题
表现:磁盘写满后发送、读取程序均不能连接服务。
解决方法:将Queue、Exchange设置为Durable即不会发生数据丢失问题。
通过a.关闭服务;b.删除占位文件、erl_crash.dump;c.重启服务 三步操作后,磁盘会清理出10M左右空间,此时读取数据程序便可正常工作。
正确设计的架构,应确保RabbitMQ不会发生磁盘写满崩溃的情况。
1.4 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要求低些。
N台RabbitMQ的集群,每台的平均吞吐率为:(2N-1)d/(N*N) 条/s;N=3时,平均吞吐率为5d/9条/s;N=4时,平均吞吐率为7d/16条/s。
解决方法:多台RabbitMQ服务器提供服务,在客户端以轮循方式访问服务,若1台down掉则不使用此台的队列服务,服务器之间没有联系,这样N台RabbitMQ的平均吞吐率为: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/。
我认为MQ丢数据的问题,主要是同步还是异步刷盘、断电是否导致的。只要send反馈正确,确保发送被接收,receive时有反馈后才会删除数据;同步刷盘,或异步刷盘不断电的,就不会丢失消息,
程序对于发送反馈异常的,要记录;MQ对于receive无反馈的,有重发机制,可能会有一条数据发送多次的情况,要在程序中剔除。
http://weibo.com/aitanjupt
关于RabbitMQ关键性问题的总结的更多相关文章
- RabbitMQ六种队列模式-工作队列模式
前言 RabbitMQ六种队列模式-简单队列RabbitMQ六种队列模式-工作队列 [本文]RabbitMQ六种队列模式-发布订阅RabbitMQ六种队列模式-路由模式RabbitMQ六种队列模式-主 ...
- 消息队列——RabbitMQ学习笔记
消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...
- RabbitMq应用二
在应用一中,基本的消息队列使用已经完成了,在实际项目中,一定会出现各种各样的需求和问题,rabbitmq内置的很多强大机制和功能会帮助我们解决很多的问题,下面就一个一个的一起学习一下. 消息响应机制 ...
- 如何优雅的使用RabbitMQ
RabbitMQ无疑是目前最流行的消息队列之一,对各种语言环境的支持也很丰富,作为一个.NET developer有必要学习和了解这一工具.消息队列的使用场景大概有3种: 1.系统集成,分布式系统的设 ...
- RabbitMq应用一的补充(RabbitMQ的应用场景)
直接进入正题. 一.异步处理 场景:发送手机验证码,邮件 传统古老处理方式如下图 这个流程,全部在主线程完成,注册->入库->发送邮件->发送短信,由于都在主线程,所以要等待每一步完 ...
- RabbitMq应用一
RabbitMq应用一 RabbitMQ的具体概念,百度百科一下,我这里说一下我的理解,如果有少或者不对的地方,欢迎纠正和补充. 一个项目架构,小的时候,一般都是传统的单一网站系统,或者项目,三层架构 ...
- 缓存、队列(Memcached、redis、RabbitMQ)
本章内容: Memcached 简介.安装.使用 Python 操作 Memcached 天生支持集群 redis 简介.安装.使用.实例 Python 操作 Redis String.Hash.Li ...
- 消息队列性能对比——ActiveMQ、RabbitMQ与ZeroMQ(译文)
Dissecting Message Queues 概述: 我花了一些时间解剖各种库执行分布式消息.在这个分析中,我看了几个不同的方面,包括API特性,易于部署和维护,以及性能质量..消息队列已经被分 ...
- windows下 安装 rabbitMQ 及操作常用命令
rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.它遵循Mozilla Public License开源协议,采用 Erlang 实现的工业级的消息队列(MQ)服务器,Rab ...
随机推荐
- IDEA运行TestNG报错rg.testng.TestNGException: org.xml.sax.SAXParseException;
从eclipse复制的依赖注解,一运行测试脚本发现报错如下: "F:\Program Files\Java\jdk1.7.0_17\bin\java" -ea -Didea.lau ...
- Win7 x64 svn 服务器搭建
SVN服务器搭建和使用 Subversion是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说. 首先来下载和搭建SVN服务器. 现在Subversion已经迁移到apache网站上了 ...
- Laravel Form 表单的数据校验
例如,要使用手机号加验证码的方式提供登录网站的功能,那么在处理前端提交的 form 表单时,就不得不对提交的手机号及验证码做基本的数据校验. 手写规则,非常浪费时间.使用 laravel 内置的 va ...
- bootstrap----几个插件网址
1.SweetAlert (弹出框):https://github.com/t4t5/sweetalert 2.SweetAlert2 (弹出框):https://github.com/limonte ...
- pytest七:assert
断言是写自动化测试基本最重要的一步,一个用例没有断言,就失去了自动化测试的意义了.什么是断言呢?简单来讲就是实际结果和期望结果去对比,符合预期那就测试 pass,不符合预期那就测试 failed py ...
- Ubuntu 里面 apt-get 三个有关更新的命令的区别
apt-get update 更新软件源中的所有软件列表. apt-get upgrade 更新软件. apt-get dist-upgrade 更新系统版本. 作者:耑新新,发布于 博客园 转载请 ...
- jxl的使用总结(java操作excel)
jxl.jar是通过java操作excel表格的工具类库: jxl.jar包:链接:http://pan.baidu.com/s/1o8qFJHw 密码:5jyq 1:通过模拟实现创建一个表格,然后模 ...
- 【BZOJ3307】雨天的尾巴
题解: win下的10mb和linux下的好像不是很一样 明天再看看 求lca用的离线求,注意bz数组开2*n 这道题的线段树合并还是很好想的 我们只要把操作差分一下就好了 时间复杂度nlogn的 写 ...
- sed & awk之sed
sed处理文本的方法 sed在处理文本时,会先读取第一个输入行,将编辑命令应用于输入行,然后读取下一个输入行,并应用编辑命令.sed总是处理最新版本的行,因此sed中有多个编辑命令时,编辑命令的顺序对 ...
- Django2.0 path与Django1.x版本url正则匹配问题
2.0内的path匹配正则时候无效, 导入re_path即可匹配正则