互联网 网站设计,江苏省宿迁市建设局网站,做马来西亚生意的网站,电白区住房和城乡建设局网站生产者-消息丢失 之 场景分析 生产者消息丢失的场景消息无法到达RabbitMQ连接断开信道关闭 RabbitMQ无法将消息入队交换机不存在无匹配队列 消息过期丢失消息丢失场景对比 生产者消息丢失的场景 生产者发送消息的流程如下#xff1a;首先生产者和RabbitMQ服务器建立连接… 生产者-消息丢失 之 场景分析 生产者消息丢失的场景消息无法到达RabbitMQ连接断开信道关闭 RabbitMQ无法将消息入队交换机不存在无匹配队列 消息过期丢失消息丢失场景对比 生产者消息丢失的场景 生产者发送消息的流程如下首先生产者和RabbitMQ服务器建立连接然后创建信道通过信道发送消息给RabbitMQ服务器RabbitMQ服务器接收到消息后交由交换机进行消息存储交换机根据不同策略将消息路由到指定队列中。在此过程中可能会存在以下消息丢失的场景
在发送消息的过程中生产者和RabbitMQ服务连接断开。在发送消息的过程中信道关闭RabbitMQ接收到消息后但是无法匹配到合适的交换机进行消息处理交换机接收到消息后无法将消息按照相关策略路由到指定队列中消息存放到队列中但是一致没有消费者消费并且消息存放时间超过了设置的过期时间消息被过期丢失 按照上述消息丢失场景可以划分为三种情况消息无法到达RabbitMQ、RabbitMQ无法将消息存放的队列中、消息过期丢失
消息无法到达RabbitMQ 上述已经分析了消息无法从生产者发送给你RabbitMQ的两种情况分别是连接端口和信道关闭。
连接断开
测试方法生产者重复发送消息在消息发送的过程中将RabbitMQ服务停止。 测试结果生产者提示异常 Exception in thread “main” com.rabbitmq.client.AlreadyClosedException: connection is already closed due to connection error; 通过上述测试内容不难发现如果连接断开则生产者将在消息发送的过程中提示异常因此可以通过捕获异常的方式进行消息存储避免消息丢失。
信道关闭
测试方法生产者重复发送消息开启一个线程在一段时间后将信道关闭。 测试结果生产者提示异常 Exception in thread “main” com.rabbitmq.client.AlreadyClosedException: channel is already closed due to clean channel shutdown; protocol method: #methodchannel.close(reply-code200, reply-textOK, class-id0, method-id0) 通过上述测试内容发现信道关闭和连接断开类似生产者都能接收到异常信息。本测试也可以侧面说明信道是非线程安全的不建议去在不同线程间使用相同信道。由于信道是逻辑连接因此信道关闭后可以通过连接再次创建信道。
RabbitMQ无法将消息入队 这种消息丢失的场景是指消息被RabbitMQ接收到了因此针对生产者而言消息已经成功发送了。单论消息发送的职责生产者已经完成了但是不可否认的情况话RabbiMQ合法的接收到消息后已经可能存在消息丢失的情况例如处理该消息的交换机不存在消息无法按照规则路由到相关队列中。
交换机不存在
测试方法消息发送的过程中写一个不存在的路由名称。 测试结果生产者提示异常 Exception in thread “main” com.rabbitmq.client.AlreadyClosedException: channel is already closed due to channel error; protocol method: #methodchannel.close(reply-code404, reply-textNOT_FOUND - no exchange ‘sample_exchangetest’ in vhost ‘/’, class-id60, method-id40) 虽然生产者提示了该条异常但是这是在第二次发送信息时提示的异常也就是说在第一次给不存在的交换机发送消息时生产者并未抛出异常当第一条消息发送后由于不存在相关交换机则生产者将将该发送消息的信道关闭进而在第二次通过该信道发送消息的时候提示信道关闭异常.
无匹配队列
测试方法消息发送的过程中设置一个无法匹配到队列的路由键。 测试结果生产者持续发送消息未出现异常但是队列中不存在生产者发送的消息。 当消息按照设置规则发送给相关交换机但是交换机无法根据消息携带的路由键匹配到队列中此时消息无法存储到队列中消费者无法消费这些消息。值得注意的是无匹配队列这种情况发生时并未向上述几种情况生产者出现异常提示。所以无论生产者无法通过异常监听的方式得知消息发送失败为此RabbitMQ提供了mandatory属性配置实现当队列不可达时生产者接收到返回消息。mandatory详细讲解见后文。
消息过期丢失
测试方法在发送消息的过程中设置过期时间。队列无消费者监听等到消息过期。 测试结果消息过期丢失生产者无法获取消息丢失事件。 消息的过期时间设置见 RabbitMQ 过期时间TTL
消息丢失场景对比
场景是否发生异常连接断开是信道关闭是交换机不存在是无匹配队列否消息过期丢失否