您的位置:首页 > 娱乐 > 明星 > RabbitMq,通过prefetchCount限制消费并发数

RabbitMq,通过prefetchCount限制消费并发数

2024/10/6 12:24:53 来源:https://blog.csdn.net/java_zhulinghai/article/details/140269990  浏览:    关键词:RabbitMq,通过prefetchCount限制消费并发数
1.问题:项目瓶颈,通过rabbitMq来异步上传图片,由于并发上传的图片过多导致阿里OSS异常,
   解决方法:通过prefetchCount限制图片上传OSS的并发数量
2.定义消费者
@Component
@AllArgsConstructor
@Slf4j
public class ReceiveFaceImageEvent {private final UPloadService uploadService;/*** 采用 prefetchCount限制消费并发数*/@RabbitHandler@RabbitListener(queues = "faceImageQueue",//指定了应该使用哪个RabbitListenerContainerFactory来创建消息监听容器containerFactory = "limitRabbitListenerContainerFactory",//这设置了并发消费者的数量范围。在这个例子中,它设置了两个并发消费者,这意味着同时有两个线程可以处理来自该队列的消息。//(concurrency 控制特定监听器的并发消费者数量,而 setMaxConcurrentConsumers 控制通过工厂创建的所有监听器的并发消费者数量的上限。两者并不直接冲突,但 concurrency 会覆盖工厂级别的设置(对于设置了concurrency的监听器而言))concurrency = "2-2")public void handler(MqMessage mqMessage){FaceImageInput input= (FaceImageInput) mqMessage.getObj();uploadService.uploadImage(input.getFaceImageUrl());}
}
3.创建RabbitMQ消息监听容器的工厂类。
@Configuration
public class RabbitAutoConfiguration {@Bean("limitRabbitListenerContainerFactory")public SimpleRabbitListenerContainerFactory limitRabbitListenerContainerFactory(ConnectionFactory connectionFactory) {SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();factory.setConnectionFactory(connectionFactory);//设置最大消费者   (设置此监听容器工厂创建的监听容器的最大并发消费者数量为5。这意味着在任何时候,都将有最多5个消费者线程并发地从RabbitMQ队列中拉取消息。)factory.setMaxConcurrentConsumers(5);//设置预取,计数为30。(预取是RabbitMQ消费者从队列中预先拉取但尚未处理的消息数量。当消费者处理消息的速度跟不上从队列中拉取消息的速度时,这个设置可以帮助减少消费者的空闲时间。但是,如果设置得太高,可能会导致消费者处理不过来,从而增加消息的延迟。)factory.setPrefetchCount(30);//设置了消息确认模式为自动确认(当消息被消费者处理完成后,RabbitMQ将自动认为该消息已被成功处理,并从队列中删除)factory.setAcknowledgeMode(AcknowledgeMode.AUTO);return factory;}}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com