请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于prefrech的疑问。

假如设置了prefrech为10,消费者1订阅的是队列a。队列a把10条消息推给消费者1,那消费者1对于这10条消息是在内存里也有一个队列用于存储这10条消息,然后一个一个消费处理,还是会用多个线程并发地去处理呢?

所以我的疑问简而言之就是两个

1、消费者内存是否有一个队列用于存储消息?

2、是一个一个处理消息,还是用多个线程并发地去处理?

正在回答 回答被采纳积分+3

2回答

Moody 2021-05-14 14:38:41

我又查了一下代码,之前回答的应该是说错了-_-,我再重新讲下:

  1. 不管是否开启限流,不论是不是用SpringAMQP,本地都有一个缓存队列,缓存收到但是还未处理的消息。

  2. 不开启限流时,消息确实已经推到消费者内存中的的缓存队列里了。

  3. 开启限流时,只会推有限个数的消息到消费者内存中的的缓存队列里。


1 回复 有任何疑惑可以回复我~
  • 提问者 慕沐3053333 #1
    第2点,不开启限流,MQ是有多少消息就推多少消息到消费者内存中的的缓存队列里吗?这样高并发场景下岂不是会导致消费者内存爆满?
    回复 有任何疑惑可以回复我~ 2021-05-14 23:04:34
Moody 2021-05-14 11:44:40
  1. 现在没有,下一章就有了,具体看5-8节。SpringAMQP在本地做了一个队列用于缓存消息。

  2. 目前是你自己控制的,业务不做多线程就是单线程的。第五章用SpringAMQP就可以自己配置线程数。

1 回复 有任何疑惑可以回复我~
  • 提问者 慕沐3053333 #1
    消费者内存没有队列的话,面对MQ一下子推过来的10条消息,用什么存储?(不考虑适配Springboot,仅仅像当前一样用RabbitMQ原生API)
    回复 有任何疑惑可以回复我~ 2021-05-14 12:12:42
  • Moody 回复 提问者 慕沐3053333 #2
    这里讲解有点问题,没有说明白:unack的消息中,只有正在处理的消息被取走了,其他的还在rabbit里,是被预分配了,等待消费者来取。
    回复 有任何疑惑可以回复我~ 2021-05-14 12:45:05
  • 提问者 慕沐3053333 回复 Moody #3
    这些预分配的还停留在MQ的uack消息,是和channel上的消费者“绑定”的,同一个channel的多个消费者,在MQ那都有自己的nack消息。是吗?
    
    我举个例子比较容易理解我的问题
    同一个channel上有两个消费者,channel上设置qos为10;即如下代码:
    channel. basicQos(10);
    channel. basicConsume("queue1",false,consumer1);
    channel. basicConsume("queue1",false,consumer1);
    
    字数限制 看下条回复
    回复 有任何疑惑可以回复我~ 2021-05-14 13:35:23
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信