采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
假如设置了prefrech为10,消费者1订阅的是队列a。队列a把10条消息推给消费者1,那消费者1对于这10条消息是在内存里也有一个队列用于存储这10条消息,然后一个一个消费处理,还是会用多个线程并发地去处理呢?
所以我的疑问简而言之就是两个
1、消费者内存是否有一个队列用于存储消息?
2、是一个一个处理消息,还是用多个线程并发地去处理?
我又查了一下代码,之前回答的应该是说错了-_-,我再重新讲下:
不管是否开启限流,不论是不是用SpringAMQP,本地都有一个缓存队列,缓存收到但是还未处理的消息。
不开启限流时,消息确实已经推到消费者内存中的的缓存队列里了。
开启限流时,只会推有限个数的消息到消费者内存中的的缓存队列里。
第2点,不开启限流,MQ是有多少消息就推多少消息到消费者内存中的的缓存队列里吗?这样高并发场景下岂不是会导致消费者内存爆满?
现在没有,下一章就有了,具体看5-8节。SpringAMQP在本地做了一个队列用于缓存消息。
目前是你自己控制的,业务不做多线程就是单线程的。第五章用SpringAMQP就可以自己配置线程数。
消费者内存没有队列的话,面对MQ一下子推过来的10条消息,用什么存储?(不考虑适配Springboot,仅仅像当前一样用RabbitMQ原生API)
这里讲解有点问题,没有说明白:unack的消息中,只有正在处理的消息被取走了,其他的还在rabbit里,是被预分配了,等待消费者来取。
这些预分配的还停留在MQ的uack消息,是和channel上的消费者“绑定”的,同一个channel的多个消费者,在MQ那都有自己的nack消息。是吗? 我举个例子比较容易理解我的问题 同一个channel上有两个消费者,channel上设置qos为10;即如下代码: channel. basicQos(10); channel. basicConsume("queue1",false,consumer1); channel. basicConsume("queue1",false,consumer1); 字数限制 看下条回复
登录后可查看更多问答,登录/注册
消息驱动架构+订单状态机,二次开发,手写分布式事务框架。
1.0k 11
1.0k 8
876 7
3.4k 7
847 6