0
点赞
收藏
分享

微信扫一扫

RabbitMQ工作模式和优化


文章目录

  • ​​1.组件介绍​​
  • ​​2.消息发布和接收流程​​
  • ​​3.工作模式​​
  • ​​3.1 基本消息模型​​
  • ​​3.2 work消息模型​​
  • ​​3.3 Publish/subscribe 交换机类型: Fanout​​
  • ​​3.4 Routing 路由模型 交换机类型: direct​​
  • ​​3.5 Topics 通配符模式 交换机类型: topics​​
  • ​​3.6 RPC​​
  • ​​4.RabbitMQ优化建议​​
  • ​​4.1 加大服务器带宽​​
  • ​​4.2 加大内存​​
  • ​​4.3 使用固态硬盘​​
  • ​​4.4 增加生产者​​
  • ​​4.5 增加消费者​​
  • ​​4.6 改网络访问为本地访问​​

1.组件介绍

  1. Broker:它提供一种传输服务,它的角色就是维护一条从生产者到消费者的路线,保证数据能按照指定的方式进行传输,
  2. Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
  3. Queue:消息的载体,每个消息都会被投到一个或多个队列。
  4. Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来.
  5. Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
  6. vhost:虚拟主机,一个broker里可以有多个vhost,用作不同用户的权限分离。
  7. Producer:消息生产者,就是投递消息的程序.
  8. Consumer:消息消费者,就是接受消息的程序.
  9. Channel:消息通道,在客户端的每个连接里,可建立多个channel.

RabbitMQ工作模式和优化_服务器

2.消息发布和接收流程

RabbitMQ工作模式和优化_服务器_02

一.如何发送消息

  1. 生产者和Broker建立TCP连接
  2. 生产者和Broker建立通道
  3. 生产者通过通道消息发送给Broker,由Exchange将消息进行转发
  4. Exchange将消息转发到止跌那个的Queue(队列)

二.如何接收消息

  1. 消费者和Broker建立TCP连接
  2. 消费者和Broker建立通道
  3. 消费者监听制定的Queue(队列)
  4. 当有消息到达Queue时Broker默认将消息推送给消费者
  5. 消费者接受到消息

3.工作模式

3.1 基本消息模型

RabbitMQ工作模式和优化_java-rabbitmq_03

3.2 work消息模型

工作队列或者竞争消费者模式

RabbitMQ工作模式和优化_服务器_04

3.3 Publish/subscribe 交换机类型: Fanout

RabbitMQ工作模式和优化_服务器_05


1) 声明Exchange,不再声明Queue

2) 发送消息到Exchange,不再发送到Queue

3.4 Routing 路由模型 交换机类型: direct

RabbitMQ工作模式和优化_java_06

P:生产者,向Exchange发送消息,发送消息时,会指定一个routing key。

X:Exchange(交换机),接收生产者的消息,然后把消息递交给 与routing key完全匹配的队列

C1:消费者,其所在队列指定了需要routing key 为 error 的消息

C2:消费者,其所在队列指定了需要routing key 为 info、error、warning 的消息

3.5 Topics 通配符模式 交换机类型: topics

RabbitMQ工作模式和优化_服务器_07


Routingkey一般都是有一个或者多个单词组成,多个单词之间以“.”分割,例如:inform.sms

#:匹配一个或多个词

*:匹配不多不少恰好1个词

3.6 RPC

RabbitMQ工作模式和优化_客户端_08

Callback queue 回调队列,客户端向服务器发送请求,服务器端处理请求后,将其处理结果保存在一个存储体中。而客户端为了获得处理结果,那么客户在向服务器发送请求时,同时发送一个回调队列地址reply_to。

Correlation id 关联标识,客户端可能会发送多个请求给服务器,当服务器处理完后,客户端无法辨别在回调队列中的响应具体和那个请求时对应的。为了处理这种情况,客户端在发送每个请求时,同时会附带一个独有correlation_id属性,这样客户端在回调队列中根据correlation_id字段的值就可以分辨此响应属于哪个请求。

  1. 当客户端启动的时候,它创建一个匿名独享的回调队列。
  2. 在 RPC 请求中,客户端发送带有两个属性的消息:一个是设置回调队列的 reply_to 属性,另一个是设置唯一值的 correlation_id 属性。
  3. 将请求发送到一个 rpc_queue 队列中。
  4. 服务器等待请求发送到这个队列中来。当请求出现的时候,它执行他的工作并且将带有执行结果的消息发送给 reply_to 字段指定的队列。
  5. 客户端等待回调队列里的数据。当有消息出现的时候,它会检查 correlation_id 属性。如果此属性的值与请求匹配,将它返回给应用

4.RabbitMQ优化建议

4.1 加大服务器带宽

访问量大时,较长的数据容易将带宽占满。如服务器上传带宽为10M,则实际上传带宽可认为1M,每秒上传量为1M/1K=1K。如果把带宽加到100M,则每秒上传量为10K。一般情况下,RabbitMq服务器能够接受的每秒写入量为20K-50K(8G内存),因此在带宽在不足200M的时候,加大带宽会产生很明显的提升作用,再往上效果就可能不那么明显了。

4.2 加大内存

RabbitMq的机制是先将消息放在内存中,然后分批写入硬盘。小批量数据的写入基本上都放在内存中,内存数据量过大时会一边把客户端的数据往内存里写,一边将内存里的陈旧数据往硬盘里写,这样会对速度造成较严重的损耗。适度的增加内存,队列将会更多的消息放在内存中,增加系统的处理速度。

4.3 使用固态硬盘

机械硬盘的写入速度较慢,处理大量数据时机械硬盘对性能的损耗十分严重。如果要存放1亿条数据,所需要的硬盘大小为100G,建议采用100-500G固态硬盘。再加上消费端在不断的处理数据,一般待处理的消息能够达到千万级别已经相当不容易了

4.4 增加生产者

服务器可以建立多个连接,单个生产者往往不能充分利用服务器的潜能,建立多个生产者之后,服务器处理能力将会得到充分利用。一般情况下,一个生产者每秒可以传入1000-5000条消息,在1-10这个范围内,每增加一个生产者,处理速度就会相对单生产者增加一倍

4.5 增加消费者

消费者增多时,出队速度有明显改善。该方案对于出队速度的影响有限,1-10个进程范围内,相对于单进程只有一倍左右的提升,建议线程开2-5个即可,再多可能影响不大。出现该现象的原因可能是服务器带宽或硬件处理能力有限,消费者增加了也没什么用处。因为没有实际环境测试,此条只列为建议,采用前可以多做实验

4.6 改网络访问为本地访问

该方案在消费端/生产端与RabbitMq服务器部署在同一台电脑时有用,因为省略了网络传输,大大节省了处理时间。如果消费端/生产端与RabbitMq服务器分开部署,该方案就不能使用了。在代码中将IP地址127.0.0.1改为localhost即可


举报

相关推荐

0 条评论