RabbitMQ关键性问题调研

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。

如需具体代码可以联系本人。

RabbitMQ关键性问题调研,布布扣,bubuko.com

时间: 2024-10-13 11:36:09

RabbitMQ关键性问题调研的相关文章

rabbitmq逻辑与开发

MQ逻辑 0.dubbo重试机制,导致消息重发 1.消息区别,多写个类 2.消息入库并分类(存入一张表中) 3.分布式事物,用消息队列来保证,不回滚 4.顺序性 5.失败,怎么办 6.消息是事务 7.代码中启动消费者消息 8.远程调用,实现rpc功能 9.池,以及每次只发送1条给服务器,负载均衡 10.消息的顺序性 逻辑是最重要的,技术始终是有缺陷的. 代码实现 http://favccxx.blog.51cto.com/2890523/1703031 表结构 CREATE TABLE `rab

windows server 2003 64bit SP2下安装RabbitMQ

一.背景 近期做一个小的基础组件,主要作用是异步消息通知.缓存维护.以及耗时任务处理. 当中消息通知和耗时任务处理要用到开源的RabbitMQ作为消息中心server. 可是有一点比較恶心,我这个组件是要执行在现有的系统中,即要给现有的系统升级,将我这个组件用进去,并且,除了除数据库server之外,全部server都是windows server 2003 enterprise edition sp2 64bit的.你没看错,就是这么古老的机器... 二.面临的问题 之前在windows se

RabbitMQ的几种应用场景

RabbitMQ是一个消息代理,从“生产者”接收消息并传递消息至“消费者”,期间可根据规则路由.缓存.持久化消息.“生产者”也即message发送者以下简称P,相对应的“消费者”乃message接收者以下简称C,message通过queue由P到C,queue存在于RabbitMQ,可存储尽可能多的message,多个P可向同一queue发送message,多个C可从同一个queue接收message. 应用场景1-“Hello Word” 一个P向queue发送一个message,一个C从该q

Kafka、ActiveMQ、RabbitMQ、RocketMQ 有什么优缺点?

面试题 1.为什么使用消息队列? 2.消息队列有什么优点和缺点? 3.Kafka.ActiveMQ.RabbitMQ.RocketMQ 都有什么区别,以及适合哪些场景? 面试官心理分析 其实面试官主要是想看看: 第一,你知不知道你们系统里为什么要用消息队列这个东西?不少候选人,说自己项目里用了 Redis.MQ,但是其实他并不知道自己为什么要用这个东西.其实说白了,就是为了用而用,或者是别人设计的架构,他从头到尾都没思考过.没有对自己的架构问过为什么的人,一定是平时没有思考的人,面试官对这类候选

消息队列原理及ActiveMQ、RocketMQ、RabbitMQ、Kafka区别总结

消息队列 为什么写这篇文章? 博主有两位朋友分别是小A和小B: 小A,工作于传统软件行业(某社保局的软件外包公司),每天工作内容就是和产品聊聊需求,改改业务逻辑.再不然就是和运营聊聊天,写几个SQL,生成下报表.又或者接到客服的通知,某某功能故障了,改改数据,然后下班部署上线.每天过的都是这种生活,技术零成长. 小B,工作于某国企,虽然能接触到一些中间件技术.然而,他只会订阅/发布消息.通俗点说,就是调调API.对为什么使用这些中间件啊?如何保证高可用啊?没有充分的认识. 庆幸的是两位朋友都很有

windows上部署rabbitmq遇到的一些问题及解决方法

在目前这家公司,刚进公司的时候接手了一个服务,算是个比较完备的服务,其中几台电脑之间通信用到了rabbitmq,一开始没出什么问题,然后后来勒索病毒wanner cry来的时候,系服把所有服务器装了一个什么杀毒软件,重启之后rabibtmq集群就出现了一些问题,经过一番学习,把这些问题都搞定了,现在做一个总结. 一开始,我按照官网的描述,把四台服务器加入了一个集群,但是不知道为什么,除了主节点外,另外三台都看不了集群状态,由于并不影响什么,就先放在那没管,其实想起来,是因为之前集群的配置文件没删

Spring rabbitMq 中 correlationId或CorrelationIdString 消费者获取为null的问题

问题 在用Spring boot 的 spring-boot-starter-amqp   快速启动 rabbitMq 是遇到了个坑 消费者端获取不到:correlationId或CorrelationIdString 问题产生的原因 correlationId 的在 spring rabbitmq 2.0 以后 byte方式会被放弃,所以 目前 代码中有些地方没有改过来,应该算一个BUG @SuppressWarnings("deprecation") public class De

在Node.js中使用RabbitMQ系列二 任务队列

在上一篇文章在Node.js中使用RabbitMQ系列一 Hello world我有使用一个任务队列,不过当时的场景是将消息发送给一个消费者,本篇文章我将讨论有多个消费者的场景. 其实,任务队列最核心解决的问题是避免立即处理那些耗时的任务,也就是避免请求-响应的这种同步模式.取而代之的是我们通过调度算法,让这些耗时的任务之后再执行,也就是采用异步的模式.我们需要将一条消息封装成一个任务,并且将它添加到任务队列里面.后台会运行多个工作进程(worker process),通过调度算法,将队列里的任

RabbitMQ 很成熟 不是阿里的

简介 官网 http://www.rabbitmq.com RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现 RabbitMQ实现了AMQP标准 安装 参考 http://www.cnblogs.com/LipeiNet/p/5973061.html 安装 erlang 有安装C运行库,给 Erlang 用的  配置环境变量 ERLANG_HOME C:\Program Files\erl8.3 安装 MQ服务器软件 3.6.9  配