rabbitmq 是tcp 还是udp

rabbitmq 是tcp 还是udp,第1张

rabbitMQ的网络层用tcp协议,那么接下来我们分析一下是怎么实现的。
接src/rabbiterl中tcp listeners启动项:

我们进入src/rabbit_networkingerl中,start/0函数中启动了tcp_client_sup监控树,该监控树是simple_one_for_one,用于开启协议接收模块(rabbit_reader)。simple_one_for_one、one_for_one、one_for_all这几钟监控策略(还有一种rest_for_one),简单以项目实例来举例,每个client连接服务器时都会有一个socket进程,关闭连接后进程消亡,这种需要频繁地动态创建、销毁进程的时候,就用simple_one_for_one;tcp_accept、tcp_listener间相互合作、缺一不可时,使用one_for_all,只要其中一个进程挂掉,就会重启该监控树下的全部进程;其他一些模块如果是独自动作、互不干扰的情况,则使用one_for_one策略。关于erlang监控策略
ebin/rabbitapp中,{tcp_listeners, [{"0000", 5672}]的IP端口是一个list,可以开启多个端口监听socket连接。src/rabbit_networking:start_tcp_listener中,开启tcp_listener监听进程,图:

这里开启了多个acceptor进程(防止多个客户端同时连接时出现阻塞),当接收到socket连接请求时,src/tcp_acceptorerl模块就会生成一个新的client进程,并把socket控制权交出(下图,src/rabbit_networkingerl代码片段)。

socket连上后,协议交互的逻辑处理就根据自己定的规则在rabbit_tcp_client_sup模块中完善(该模块缺省)。
src/tcp_acceptorerl中用到了prim_inet:async_accept/2函数
以上全属个人意见。

一、消费端限流

1什么是消费端的限流

假设一个场景,首先,Rabbitmq服务器有上万条未处理的消息,我们随便打开一个消费者客户端,就会出现:巨大的消息瞬间全部推送过来,但是我们单个客户端无法同时处理这么多数据!

2RabbitMQ提供了一种Qos(服务质量控制)功能,即在非自动确认消息的前提下,如果一定数目的消息(通过基于consume或者channel设置Qos的值)未被确认前,不进行消费新的消息。

void BasicQos(uint prefetchSize,ushort prefetchCount,bool global);

prefetchCount:会告诉RabbitMQ不要同时给一个消费者推送多于N个消息,即一旦有N个消息还没有ACK,则该comsumer将block掉,直到有消息ack

global:true/false 是否将上面的设置应用于channel,就是限制是channel级别还是consumer级别

二、消费端的手动ACK和NACK

消费端进行消费的时候,如果由于业务异常我们可以进行日志的记录,然后进行补偿!

如果由于服务器宕机等严重问题,那我们就需要手动进行ACK保障消费端消费成功!

三、消费端的重回队列

1消费端重回队列是为了对没有处理成功的消息,把消息重新会递给Broker

2一般我们在实际应用中,都会关闭重回队列,也就是设置为false

四、TTL队列/消息

1TTL

TTL:time  to live 的缩写,也就是生存时间

RabbitMQ支持消息的过期时间,在消息发送时可以进行指定

RabbitMQ支持队列的过去时间,从消息入队列开始计算,只要超过了队列的超时时间配置,那么消息会自动删除

2DLX

DLX:Dead-Letter-Exchange,死信队列

利用DLX,当消息在一个队列中变成死信(dead message)之后,它能被重新publish到另一个Exchange,这个Exchange就是DLX

DLX也是一个正常的Exchange,和一般的Exchange没有区别,它能在任何的队列上被指定,实际上就是设置某个队列的属性

当一个队列中有死信时,RabbitMQ就会自动的将这个消息重新发布到设置的Exchange上去,进而被路由到另一个队列

可以监听DLX这个队列中的消息做相应的处理,这个特性可以弥补RabbitMQ30以前支持的immediate参数的功能

3消息变成死信的情况

消息被拒绝(basicreject/basicnack),并且requeue=false

消息TTL过期

队列达到最大长度

4DLX死信队列设置

首先需要设置死信队列的exchange(dlxexchange)、queue(dlxqueue)和路由规则(RoutingKey:#),然后进行绑定

然后进行正常交换机、队列、绑定,只不过我们需要在队列上加上一个参数即可:argumentsput("x-dead-letter-exchange","dlxexchange");

RabbitMQ 消息挂载是指在RabbitMQ中,消息挂载可以被认为是一个队列,它允许消息在不同的交换器之间以及同一个交换器之间传递。它允许消息以不同的方式传递,比如按照给定的路由键匹配到指定的队列,或者将消息发送到多个队列,等等。

每个rabbitmq服务器都可以创建多个虚拟的消息服务器。根据查询rabbitmq概念显示,rabbitmq多租户影响是每个rabbitmq服务器都可以创建多个虚拟的消息服务器,简称为vhost,每个vhost拥有自己的队列、交换器、绑定关系,且每个vhost是隔离的互不影响。

您好,Linux系统中的Rabbit是一个用于消息传递的开源消息队列系统,它可以帮助开发人员更加高效地编写分布式应用程序。RabbitMQ可以在多个服务器之间传递消息,以及在多个应用程序之间传递消息。RabbitMQ可以帮助开发人员更加高效地编写分布式应用程序,从而提高系统的可用性和可靠性。RabbitMQ可以在多个服务器之间传递消息,以及在多个应用程序之间传递消息,从而帮助开发人员更加高效地编写分布式应用程序。RabbitMQ还可以帮助开发人员管理消息传递,以及提供其他一些有用的功能,比如消息路由、消息确认、消息持久性等。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/zz/10639364.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-10
下一篇 2023-05-10

发表评论

登录后才能评论

评论列表(0条)

保存