RabbitMQ面试主题:常见问题

一、RabbitMQ最大连接数

rabbitmqctl status

Status of node 'rabbit@10-101-17-13' ... 
[{pid,23658}, ...... 
{file_descriptors, 
    [{total_limit,924}, 
    {total_used,10}, 
    {sockets_limit,829}, 
    {sockets_used,10}]},
 ...... ] 
...done.

sockets_used就是已经连接的数量,如果这个数量和sockets_limit数量一致的话,就需要修改最大连接数量了,具体修改方法参考http://blog.51cto.com/3646344/2162940,虽然调整的是打开文件最大数,但是sockets_limit也相应增大了,查询文档得知sockets_limit通常是total_limit的0.8到0.9。

当服务器建立的socket连接已经达到限制(sockets_limit)时,服务器不再接受新连接。这里要区分清楚,RabbitMQ不再接收的是AMQP连接,而不是传输层的TCP连接。

如何增加RabbitMQ的能够同时打开的连接数。通过前文可知,最大并发连接数由此进程可打开的最大文件描述符数量(乘以一个比例系数)决定,因此只要增加单个进程可打开的文件描述符数量即可。有几个常规方法,按作用范围可以归纳为以下几类:

1. 进程级别。在启动脚本rabbitmq-server中加入ulimit -n 10240命令(假设将最大文件描述符数量设置为10240,下同),相当于在shell中执行,由此shell进程fork出来的进程都能继承这个配置。

2. 用户级别。修改/etc/security/limits.conf文件,添加以下配置,重新登录生效:

1 2user soft nofile 10240 user hard nofile 10240

3. 系统级别。

1# echo 10240 > /proc/sys/fs/file-max

上述设置只是针对proc文件系统,相当于修改了操作系统的运行时参数,重启后失效。要想永久生效,需要修改/etc/sysctl.conf文件,加入配置项fs.file-max=10240。

一个进程能打开的最大文件描述符数量受限于上述三个级别配置中的最小值。

二、如何实现延迟队列

延迟任务通过消息的TTL和Dead Letter Exchange来实现。我们需要建立2个队列,一个用于发送消息,一个用于消息过期后的转发目标队列。

1、设置消息的TTL,可以通过设置消息的expiration字段或者x-message-ttl属性来设置时间

2、某一个设置Dead Letter Exchange的队列中有消息过期了,会自动触发消息的转发,发送到Dead Letter Exchange中去。设置生产者队列的Dead letter exchange和Dead letter routing key

3、设置消费者队列,需要绑定生产者设置的死信路由

三、如何保证消息的准确性

使用事务虽然可以保证消息的准确达到,但是它极大地牺牲了性能,因此我们为了性能上的要求,可以采用另一种高效的解决方案——通过使用Confirm模式来保证消息的准确性。

一是消息的生产者(Producer)的Confirm模式,另一个是消息的消费者(Consumer)的Confirm模式。

You May Also Like

About the Author: daidai5771

发表评论

电子邮件地址不会被公开。 必填项已用*标注