无法被路由的消息,去了哪里?
如果没有任何设置,无法路由的消息会被直接丢弃。
无法路由的情况:Routing key不正确。
解决方案:
1.使用mandatory=true配合ReturnListener,实现消息回发。
2.声明交换机时,指定备份交换机。
多个消费者监听一个队列时,消息如何分发?
1.Round-Robin(轮询)
默认的策略,消费者轮流、平均地收到消息。
2.Fair dispatch(公平分发)
如果要实现根据消费者的处理能力来分发消息,给空闲地消费者发送更多消息,可以用basicQos(int prefetch_count)来设置。prefetch_count含义:当消费者有多条消息没有响应ACK时,不再给这个消费者发送消息。
消息在什么时候会变成Dead Letter(死信)?
1.消息被拒绝并且没有设置重新入队:(NACK || Reject ) && requeue == false
2.消息过期(消息或者队列的TTL设置)
3.消息堆积,并且队列达到最大长度,先入队的消息编程DL。
解决方案:可以在声明队列时,指定一个Dead Letter Exchange,来实现Dead Letter的转发,保证消息不会丢失。
如何进行消息持久化?
所谓持久化,就是RabbitMQ将内存中的数据(比如交换机、队列、消息等)固化到磁盘,以防止异常情况的发生时造成数据丢失。
持久化分类 | 说明 |
---|---|
交换机持久化 | 在创建Exchange时设置durable参数参数。channel.exchangeDeclare(EXCHANGE_NAME, "direct", true); |
队列持久化 | 同样也是设置设置durable参数。持久化的队列会存盘,在服务器重启的时候可以保证不丢失相关信息。channel.queueDeclare(QUEUE_NAME, true, false, false, null); |
消息持久化 | 即使交换机、队列持久化不会因为重启丢失,但是存储在队列中的消息仍然会丢失。解决的办法就是设置消息的投递模式为2,即代表持久化(JAVA)。理论上,可以将所有的消息都设置为持久化,但是这会严重影响RabbitMQ性能,因为写入到磁盘的速度可比写入到内存的速度慢非常多。因此,在选择是否要持久化消息时,需要在可靠性和吞吐量之间做一个权衡。 |
RabbitMQ专享实例是否支持公网访问?
RabbitMQ专享实例支持公网访问。
在创建RabbitMQ专享实例的“更多”选项中,选择开启“公网访问”可自主控制是否进行公网访问,并选择已购买的弹性IP及带宽。或创建完后,在实例详情页中将公网访问开关打开。
RabbitMQ实例是否支持跨VPC和跨子网访问?
RabbitMQ实例支持跨VPC和子网访问,可以通过创建VPC对等连接,将两个VPC的网络打通,实现跨VPC访问实例。
SSL方式连接RabbitMQ实例失败?
首先排查安全组的入方向规则,是否放开了端口5671(SSL方式访问)或5672(非SSL访问)。
其次,参考如下内容配置SSL单向认证:
ConnectionFactory factory = new ConnectionFactory();
factory.setHost(host);
factory.setPort(port);
factory.setUsername(user);
factory.setPassword(password);
factory.useSslProtocol();
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
客户端是否可以通过DNAT方式访问RabbitMQ实例?
可以。
为什么RabbitMQ集群只有一个连接地址?
RabbitMQ集群实例的连接地址,实际上是实例的LVS节点地址(负载均衡地址),客户端连接实例时,通过负载均衡器将客户端请求分发到集群实例的各个节点。
RabbitMQ实例集群的队列是否有备份?
RabbitMQ实例默认开启了镜像队列,会在集群中多个代理上备份队列的副本,当某个代理故障,集群会从其他正常的代理中选择一个代理,用来同步队列数据。
RabbitMQ支持双向认证吗?
不支持。
RabbitMQ实例是否支持扩容?
不支持。
RabbitMQ实例是否支持修改可用区?
不支持,您可以重新购买实例,以满足可用区要求。
RabbitMQ客户端连接报错原因分析?
RabbitMQ客户端连接失败,可能原因包括地址、端口填错、用户名或者密码填错。
连接地址不正确
Exception in thread "main"java.net.SocketTimeoutException: connect timed out
at java.net.PlainSocketImpl.socketConnect(NativeMethod)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
端口不正确
Exception in thread "main"java.net.ConnectException:Connection refused (Connection refused)
at java.net.PlainSocketImpl.socketConnect(NativeMethod)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
用户名或密码错误
Exception in thread "main"com.rabbitmq.client.AuthenticationFailureException: ACCESS_REFUSED -Login was refused using authentication mechanism PLAIN. For details
see the broker logfile.
at com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.java:351)
at com.rabbitmq.client.impl.recovery.RecoveryAwareAMQConnectionFactory.newConnection(RecoveryAwareAMQConnectionFactory.java:64)
RabbitMQ实例是否支持不同的子网?
支持。
客户端与实例在相同VPC内,可以跨子网段访问。同一个VPC内的子网默认可以进行通信。
客户端与实例在不同VPC时,需建立VPC对等连接。
客户端是否可以连接同个RabbitMQ下多个Vhost?
客户端可以连接同个RabbitMQ下多个Vhost。
Vhost(Virtual Hosts虚拟主机)是RabbitMQ的基本特性,每个Vhost相当于一个独立的虚拟消息服务器,每个Vhost数据目录不同,拥有自己的队列、交换器和权限控制机制。性能上,连接多个Vhost和单独使用一个Vhost差别不大。
消息创建时间在哪设置?
消息创建时间是在生产消息时由生产客户端设置。
RabbitMQ是否支持跨Region部署?
不支持跨Region部署。
如何清空队列数据?
(1)进入“分布式消息服务RabbitMQ”控制中心;
(2)在“实例列表”页面点击对应的RabbitMQ实例;
(3)在“队列管理”页面点击要清空的队列;
(4)在“清除消息”页面点击清空队列。
RabbitMQ支持升级CPU和内存吗?
RabbitMQ支持扩容规格。
如何设置Message ID?
如需追踪和识别消息,可以在分布式消息服务RabbitMQ的Producer客户端设置Message ID属性,为每条消息设置唯一标识符。
在分布式消息服务RabbitMQ的Producer客户端设置Basic.Properties的messageid属性。示例代码如下:
AMQP.BasicProperties props =newAMQP.BasicProperties.Builder().messageId("messageid").build();
channel.basicPublish("ExchangeName","RoutingKey",true, props,("消息发送Body").getBytes());
Message ID(消息标识符)是消息的可选属性,类型为String。Message ID在业务上通常被设置为唯一,适用于追踪和识别销售单、工单等需要保证消息唯一的场景。分布式消息服务RabbitMQ服务端不会对消息进行幂等处理。如需实现消息幂等,即如果消息重试多次,消费者端对该重复消息消费多次与消费一次的结果是相同的,并且多次消费没有对系统产生副作用,在为每条消息设置唯一Message ID的基础上,还需要在分布式消息服务RabbitMQ的Consumer客户端对消息进行幂等处理。
RabbitMQ使用的版本是多少?
服务端RabbitMQ的版本有3.8.9和3.8.35。
RabbitMQ实例SSL连接的协议版本号是多少?
服务端支持协议版本号:SSL v3、TLS v1、TLS v1.1、TLS v1.2、TLS v1.3。