基础编程学习快乐每一天
首页
留言
Siddim.com
当前位置:
首页
>
编程知识库
>
后端开发知识
>
面试官:谈谈RabbitMQ的几种工作模式和优化建议
面试官:谈谈RabbitMQ的几种工作模式和优化建议
阅读
3
2021-10-17
1.组件介绍
Broker
:它提供一种传输服务,它的角色就是维护一条从生产者到消费者的路线,保证数据能按照指定的方式进行传输,
Exchange
:消息交换机,它指定消息按什么规则,路由到哪个队列。
Queue
:消息的载体,每个消息都会被投到一个或多个队列。
Binding
:绑定,它的作用就是把
exchange
和
queue
按照路由规则绑定起来.
Routing
Key
:路由关键字,
exchange
根据这个关键字进行消息投递。
vhost
:虚拟主机,一个
broker
里可以有多个
vhost
,用作不同用户的权限分离。
Producer
:消息生产者,就是投递消息的程序.
Consumer
:消息消费者,就是接受消息的程序.
Channel
:消息通道,在客户端的每个连接里,可建立多个
channel
.
2.消息发布和接收流程
一.如何发送消息
生产者和
Broker
建立
TCP
连接
生产者和
Broker
建立通道
生产者通过通道消息发送给
Broker
,由
Exchange
将消息进行转发
Exchange
将消息转发到止跌那个的
Queue
(队列)
二.如何接收消息
消费者和
Broker
建立
TCP
连接
消费者和
Broker
建立通道
消费者监听制定的
Queue
(队列)
当有消息到达
Queue
时
Broker
默认将消息推送给消费者
消费者接受到消息
3.工作模式
1. Direct 广播模式
是最简单的模式.即创建消息队列的时候,指定一个路由键(
RoutingKey
).当发送者发送消息的时候,指定对应的
Key
.当
Key
和消息队列的
RoutingKey
一致的时候,消息将会被发送到该消息队列中.
2.Topic 主题交换区模式
topic
转发信息主要是依据通配符,队列和交换机的绑定主要是依据一种模式(通配符 字符串),而当发送消息的时候,只有指定的
Key
和该模式相匹配的时候,消息才会被发送到该消息队列中.通配符:* 表示一个词,# 表示零个或多个词
3.fanout是路由广播的形式
fanout
是路由广播的形式,将会把消息发给绑定它的全部队列,即便设置了
key
,也会被忽略.因此我们发送到交换机的消息会使得绑定到该交换机的每一个
Queue
接收到消息,这个时候就算指定了路由键(
routingKey
),或者规则(即上文中
convertAndSend
方法的参数
2
),也会被忽略!
4.RabbitMQ优化建议
1、加大服务器带宽
访问量大时,较长的数据容易将带宽占满。如服务器上传带宽为
10M
,则实际上传带宽可认为
1M
,每秒上传量为
1M
/
1K
=
1K
。如果把带宽加到
100M
,则每秒上传量为
10K
。一般情况下,
RabbitMq
服务器能够接受的每秒写入量为
20K
-
50K
(
8G
内存),因此在带宽在不足
200M
的时候,加大带宽会产生很明显的提升作用,再往上效果就可能不那么明显了。
2、加大内存
RabbitMq
的机制是先将消息放在内存中,然后分批写入硬盘。小批量数据的写入基本上都放在内存中,内存数据量过大时会一边把客户端的数据往内存里写,一边将内存里的陈旧数据往硬盘里写,这样会对速度造成较严重的损耗。适度的增加内存,队列将会更多的消息放在内存中,增加系统的处理速度。
3、使用固态硬盘
机械硬盘的写入速度较慢,处理大量数据时机械硬盘对性能的损耗十分严重。如果要存放
1
亿条数据,所需要的硬盘大小为
100G
,建议采用
100
-
500G
固态硬盘。再加上消费端在不断的处理数据,一般待处理的消息能够达到千万级别已经相当不容易了
4、增加生产者
服务器可以建立多个连接,单个生产者往往不能充分利用服务器的潜能,建立多个生产者之后,服务器处理能力将会得到充分利用。一般情况下,一个生产者每秒可以传入
1000
-
5000
条消息,在
1
-
10
这个范围内,每增加一个生产者,处理速度就会相对单生产者增加一倍
5、增加消费者
消费者增多时,出队速度有明显改善。该方案对于出队速度的影响有限,
1
-
10
个进程范围内,相对于单进程只有一倍左右的提升,建议线程开
2
-
5
个即可,再多可能影响不大。出现该现象的原因可能是服务器带宽或硬件处理能力有限,消费者增加了也没什么用处。因为没有实际环境测试,此条只列为建议,采用前可以多做实验
6、改网络访问为本地访问
该方案在消费端/生产端与
RabbitMq
服务器部署在同一台电脑时有用,因为省略了网络传输,大大节省了处理时间。如果消费端/生产端与
RabbitMq
服务器分开部署,该方案就不能使用了。在代码中将
IP
地址
127
.
0
.
0
.
1
改为
localhost
即可
感谢阅读,希望对你有所帮助 :)
来源:
blog
.
csdn
.
net
/
smartsteps
/
article
/
details
/
107002567
以上数据来源于网络,如有侵权,请联系删除。
上一篇:
面试官:MySQL和Hbase的区别是什么?各自适用什么场景。
下一篇:
面试官:select......for update会锁表还是锁行
评论
(0)
提交
类别
基础编程学习
HTML
PHP
Python
编程知识库
后端开发知识
热门文章
Java并发中的同步容器与并发容器,你了解多少?
Innodb中的事务隔离级别和锁的关系,难倒一半面试者!
SpringBoot + minio实现分片上传、秒传、续传
面试官:你知道消息队列如何保证数据不丢失吗?
JAVA知识 Java8新特性
面试官:谈谈为什么要限流,有哪些限流方案?
说说动态代理与静态代理区别
面试官:思考Tomcat 类加载器为什么要违背双亲委派模型?
boot-admin 基于SpringBoot的后台权限管理系统,可作为脚手架,用于快速搭建项目
SpringBoot+Vue+App+硬件实现智能家居系统项目