场景:多个消费者绑定到同一个队列中
生产者:
有序发送一百条消息到队列中去,发送方法
rabbitTemplate.convertAndSend(“交换机”,“路由”,“消息内容”);
消费者:
然后打印截图:
消费者一: 测试消息队列消费顺利0
消费者三: 测试消息队列消费顺利2
消费者二: 测试消息队列消费顺利1
消费者三: 测试消息队列消费顺利5
消费者一: 测试消息队列消费顺利3
消费者二: 测试消息队列消费顺利4
消费者三: 测试消息队列消费顺利8
消费者二: 测试消息队列消费顺利7
消费者一: 测试消息队列消费顺利6
消费者三: 测试消息队列消费顺利11
消费者二: 测试消息队列消费顺利10
消费者一: 测试消息队列消费顺利9
消费者二: 测试消息队列消费顺利13
消费者三: 测试消息队列消费顺利14
消费者一: 测试消息队列消费顺利12
消费者二: 测试消息队列消费顺利16
消费者三: 测试消息队列消费顺利17
消费者一: 测试消息队列消费顺利15
消费者二: 测试消息队列消费顺利19
消费者三: 测试消息队列消费顺利20
消费者三: 测试消息队列消费顺利23
消费者二: 测试消息队列消费顺利22
消费者三: 测试消息队列消费顺利26
消费者二: 测试消息队列消费顺利25
消费者三: 测试消息队列消费顺利29
消费者一: 测试消息队列消费顺利18
消费者三: 测试消息队列消费顺利32
消费者一: 测试消息队列消费顺利21
消费者二: 测试消息队列消费顺利28
消费者一: 测试消息队列消费顺利24
消费者二: 测试消息队列消费顺利31
消费者一: 测试消息队列消费顺利27
消费者二: 测试消息队列消费顺利34
消费者一: 测试消息队列消费顺利30
消费者三: 测试消息队列消费顺利35
消费者二: 测试消息队列消费顺利37
消费者一: 测试消息队列消费顺利33
消费者三: 测试消息队列消费顺利38
消费者二: 测试消息队列消费顺利40
消费者一: 测试消息队列消费顺利36
消费者三: 测试消息队列消费顺利41
消费者一: 测试消息队列消费顺利39
消费者三: 测试消息队列消费顺利44
消费者二: 测试消息队列消费顺利43
消费者一: 测试消息队列消费顺利42
消费者三: 测试消息队列消费顺利47
消费者二: 测试消息队列消费顺利46
消费者二: 测试消息队列消费顺利49
消费者二: 测试消息队列消费顺利52
消费者二: 测试消息队列消费顺利55
消费者三: 测试消息队列消费顺利50
消费者一: 测试消息队列消费顺利45
消费者二: 测试消息队列消费顺利58
消费者三: 测试消息队列消费顺利53
消费者一: 测试消息队列消费顺利48
消费者三: 测试消息队列消费顺利56
消费者一: 测试消息队列消费顺利51
消费者三: 测试消息队列消费顺利59
消费者二: 测试消息队列消费顺利61
消费者一: 测试消息队列消费顺利54
消费者二: 测试消息队列消费顺利64
消费者二: 测试消息队列消费顺利67
消费者三: 测试消息队列消费顺利62
消费者一: 测试消息队列消费顺利57
消费者二: 测试消息队列消费顺利70
消费者一: 测试消息队列消费顺利60
消费者二: 测试消息队列消费顺利73
消费者三: 测试消息队列消费顺利65
消费者二: 测试消息队列消费顺利76
消费者一: 测试消息队列消费顺利63
消费者三: 测试消息队列消费顺利68
消费者二: 测试消息队列消费顺利79
消费者三: 测试消息队列消费顺利71
消费者一: 测试消息队列消费顺利66
消费者三: 测试消息队列消费顺利74
消费者一: 测试消息队列消费顺利69
消费者三: 测试消息队列消费顺利77
消费者一: 测试消息队列消费顺利72
消费者三: 测试消息队列消费顺利80
消费者一: 测试消息队列消费顺利75
消费者二: 测试消息队列消费顺利82
消费者三: 测试消息队列消费顺利83
消费者二: 测试消息队列消费顺利85
消费者三: 测试消息队列消费顺利86
可以发现消费者在争抢消息队列中的消息,并消费
可以发现同一队列下的消费被消费者消费的过程中,消费顺序是没有顺序的.
解决方案一:一个队列仅绑定一个消费者,然后按顺序分发给多个队列中去
解决方案二:使用消息确认机制,即队列确认消息被消费之后,再发送消息至队列中
使用方法:rabbitTemplate.convertSendAndReceive()
/**
* 消息队列测试,测试发送
*
* @return string
*/
@ApiOperation("TopExchange/路由模式")
@GetMapping("/test1")
public String test(@ApiParam(value = "发送的具体消息") @RequestParam("object") String object) {
// #参数1.exchange 交换机
// #参数2.routingKey 路由key
// #参数3.object 发送的具体消息
for (int i = 0; i < 100; i++) {
rabbitTemplate.convertSendAndReceive(RabbitConfig.TEST_EXCHANGE, RabbitConfig.TEST_ROUTING_KEY, object + i);
}
return "消息队列已经发送,收到与否不清楚,到队列里面也不清楚";
}
使用发送确认模式的结果:
消费者一: 测试消息队列消费顺利0
消费者二: 测试消息队列消费顺利1
消费者三: 测试消息队列消费顺利2
消费者一: 测试消息队列消费顺利3
消费者二: 测试消息队列消费顺利4
消费者三: 测试消息队列消费顺利5
消费者一: 测试消息队列消费顺利6
消费者二: 测试消息队列消费顺利7
消费者三: 测试消息队列消费顺利8
消费者一: 测试消息队列消费顺利9
消费者二: 测试消息队列消费顺利10
消费者三: 测试消息队列消费顺利11
消费者一: 测试消息队列消费顺利12
消费者二: 测试消息队列消费顺利13
消费者三: 测试消息队列消费顺利14
消费者一: 测试消息队列消费顺利15
消费者二: 测试消息队列消费顺利16
消费者三: 测试消息队列消费顺利17
消费者一: 测试消息队列消费顺利18
消费者二: 测试消息队列消费顺利19
消费者三: 测试消息队列消费顺利20
消费者一: 测试消息队列消费顺利21
消费者二: 测试消息队列消费顺利22
消费者三: 测试消息队列消费顺利23
消费者一: 测试消息队列消费顺利24
消费者二: 测试消息队列消费顺利25
消费者三: 测试消息队列消费顺利26
消费者一: 测试消息队列消费顺利27
消费者二: 测试消息队列消费顺利28
消费者三: 测试消息队列消费顺利29
消费者一: 测试消息队列消费顺利30
消费者二: 测试消息队列消费顺利31
消费者三: 测试消息队列消费顺利32
消费者一: 测试消息队列消费顺利33
消费者二: 测试消息队列消费顺利34
消费者三: 测试消息队列消费顺利35
消费者一: 测试消息队列消费顺利36
消费者二: 测试消息队列消费顺利37
消费者三: 测试消息队列消费顺利38
消费者一: 测试消息队列消费顺利39
消费者二: 测试消息队列消费顺利40
消费者三: 测试消息队列消费顺利41
消费者一: 测试消息队列消费顺利42
消费者二: 测试消息队列消费顺利43
消费者三: 测试消息队列消费顺利44
消费者一: 测试消息队列消费顺利45
消费者二: 测试消息队列消费顺利46
消费者三: 测试消息队列消费顺利47
消费者一: 测试消息队列消费顺利48
消费者二: 测试消息队列消费顺利49
消费者三: 测试消息队列消费顺利50
消费者一: 测试消息队列消费顺利51
消费者二: 测试消息队列消费顺利52
消费者三: 测试消息队列消费顺利53
消费者一: 测试消息队列消费顺利54
消费者二: 测试消息队列消费顺利55
消费者三: 测试消息队列消费顺利56
消费者一: 测试消息队列消费顺利57
消费者二: 测试消息队列消费顺利58
消费者三: 测试消息队列消费顺利59
消费者一: 测试消息队列消费顺利60
消费者二: 测试消息队列消费顺利61
消费者三: 测试消息队列消费顺利62
测试结果发现:队列中的消息被有序的消费了,而且三个消费者也是有序的去队列中消费消息,轮训去队列中消费,但是有很严重的一个问题,此种发送模式下,测试的100条数据,消费了至少有6分钟,甚至更多,明显此种发送确认模式无法没办法满足大量数据同时处理的情况.
因此需要在各种应用场景下:具体情况具体分析,此博客就分析到这儿,分析验证的内容如下:
#1.RabbitMQ中的消费者消费队列中信息是无序的
#2.RabbitMQ中的发送确认机制能够满足有序消费,但效率太低,很低很低
Question:
#1.存在的几种模式是否能够满足所有需求?还是说存在的模式自己并未深刻的理解?
#2.如果一个队列绑定一个消费者,创建大量队列的开销是否合理?