RabbitMQ消息队列消费顺序相关问题验证

RabbitMQ消息队列中数据的消费顺序问题

场景:多个消费者绑定到同一个队列中
在这里插入图片描述
生产者:
有序发送一百条消息到队列中去,发送方法
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.如果一个队列绑定一个消费者,创建大量队列的开销是否合理?

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值