RabbitMQ中的消息预取值prefetchCount参数详解

这篇具有很好参考价值的文章主要介绍了RabbitMQ中的消息预取值prefetchCount参数详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

刚学习RabbitMQ的同学可能对prefetchCount预取值这个参数有一些困惑,本文对其作用进行详细讲解。配合了几张有趣的图片方便同学们理解。

一、从轮询分发说起

  首先要从轮询分发机制讲起,轮询分发顾名思义,依次发消息,生产者不会管你消费者消费消息的速度,我只负责把消息依次给你们,假设我有两个消费者C1和C2,生产者发出四条消息11,22,33,44;我们可以认为,11和33将由消费者C1处理,22和44将由C2处理,谁处理得快,谁处理得慢,生产者不在意,生产者一有消息就发,挨个拼命地发
  那么这会导致一个什么问题,不知道大家有没有思考过,当生产者这边突然有大量消息的时候,假如有10000000条消息,而两个消费者处理消息的速度是不够快的,例如都是1秒1条,而生产者发过来的这些消息是要存储在消费者的JVM堆内存中的,那么在轮询的这样的机制下,生产者不会管你消费者那边JVM堆内存够不够,会不会爆内存,他都一直这样发给消费者,而消费者担心消息丢失,他从生产者那边接收到的每一条消息都得保存到自己的堆内存中,很可能就因为消息数量太多就OOM(Out of Memory)了。
  当然,这种情况我说的比较夸张,实际中可能有的消费者处理速度快,有的消费者处理速度慢,那么慢的那个就更有可能发生JVM堆内存爆掉的情况。
rabbitmq prefetchcount设置,java-rabbitmq,rabbitmq,java

二、不公平分发

  很显然,上面这种轮询分发的方法,根本不可取,因为这种方法首先没有考虑到消费者处理消息的速度,无论快慢,都给所有消费者等量的消息,会造成速度快的消费者资源空闲(没有消息给他处理),速度慢的消费者JVM堆内存不足。
  那么我们想到一种改进的方式,设置一个名为prefetchCount的参数,例如我设置为1,就代表当我的消费者在同一时间只能处理一条消息,当消费者在处理消息时,生产者就不要把消息发给我,占用我的JVM堆内存,想想这样会得到什么样的效果?速度快的消费者处理完一条,接着去队列拿消息,速度慢的消费者同样如此,只是它消费的消息数量更少一些而已。看上去这种方式非常合理,但如果我们进一步考虑到吞吐量的问题,消费者每次只能处理一条消息,处理完一条,再去拿一条,假如消息普遍比较大,并且服务端距离客户端距离非常远,那么消息的网络传输肯定需要不少时间,极端一点,我假设消费者小C处理消息的速度极快(小C表示,根本不够打好不好?我要打10个!),0.01秒一条,而每条消息传输时间需要1秒钟,这就会发生消费者处理完消息,等下条消息需要1秒,刚花0.01秒处理完,又是等1秒,计算资源浪费太多了有没有?
rabbitmq prefetchcount设置,java-rabbitmq,rabbitmq,java

三、预取值的设置

  这时候我们预取值的作用就体现出来了,我可以允许小C在同一时间有多条未处理的消息存放在他和队列连接的信道里,比方说有200条,那么处理完一条,就不用再去等待下一条新消息从遥远的生产者(服务端)那边发过来,直接接着处理下一条。同时,生产者那边发现小C这信道里的消息不足200条了,就继续给他发(继续满上),这样可以使得生产者小C一直有消息可以处理,也不会因为消息发过来太多导致小C的JVM内存爆炸。
rabbitmq prefetchcount设置,java-rabbitmq,rabbitmq,java

基于以上几种情形,我们可以做出如下总结:

1.当消费者处理消息的速度很慢,而且队列消息较少的情况下,可以把prefetchCount设置为1。
2.当每条消息的数据很大,或传输距离很远时,即网络传输延迟大时,要计算好客户端能容纳的未确认消息的总量,设置一个合理的预取值。
3.当消费者处理速度极快,远超过服务端分发消息的速度时,在网络带宽足够时,可以设置预取值为0,即不设限。

本文章基于某谷的RabbitMQ教程进行讲解,如有错误,欢迎讲出。文章来源地址https://www.toymoban.com/news/detail-798510.html

到了这里,关于RabbitMQ中的消息预取值prefetchCount参数详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 手动清理RabbitMq队列中的消息

    一、手动删除队列中指定个数的消息 打开RabbitMq管理页面,进入队列。 点击 Get messages Requeue 改成No Mesaages 设置一个值 点击Get messages 二、一次清理队列中的所有消息 打开RabbitMq管理页面,进入队列。 点击Purge 点击按钮Purge Messages

    2024年02月11日
    浏览(35)
  • 如何解决RabbitMQ中的延迟消息问题

    首先我们要知道什么是死信? 当一个队列中的消息满足下列情况之一时,可以成为死信(dead letter): 消费者使用basic.reject或 basic.nack声明消费失败,并且消息的requeue参数设置为false。 消息是一个过期消息,超时无人消费。 要投递的队列消息堆积满了,最早的消息可能成为

    2024年02月14日
    浏览(50)
  • 优雅地处理RabbitMQ中的消息丢失

    目录 一、异常处理 二、消息重试机制 三、错误日志记录 四、死信队列 五、监控与告警 优雅地处理RabbitMQ中的消息丢失对于构建可靠的消息系统至关重要。下面将介绍一些优雅处理消息丢失的方案,包括异常处理、重试机制、错误日志记录、死信队列和监控告警等。 一、异

    2024年02月13日
    浏览(33)
  • 消息队列—RabbitMQ(万字详解)

    笔记整理自 【涛哥】最适合小白入门的RabbitMQ教程 Ⅰ. 消息队列需求场景 在基于微服务开发的电商项目中,商品的查询和商品的修改是通过两个服务实现的,如果修改了商品的价格,如何保证商品查询服务查询出来的商品价格同步更新呢? 服务与服务之间的通信方式有两种

    2024年02月12日
    浏览(37)
  • 消息中间件RabbitMQ详解

    消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。 消息中间件适用于需要可靠的数据传送的分布式环境。采用消息中间件机制的系统中

    2024年02月16日
    浏览(83)
  • Spring Boot 中的 RabbitMQ 消息发送配置

    RabbitMQ 是一个开源的消息代理系统,它实现了 AMQP(高级消息队列协议)标准,并支持多种消息传输协议。它具有高可用性、可扩展性和可靠性,广泛应用于分布式系统、微服务架构、异步任务处理、日志收集等场景。 RabbitMQ 的核心概念包括: Producer:消息生产者,负责将消

    2024年02月07日
    浏览(43)
  • 如何使用 Java 发送消息到 RabbitMQ 中的队列

    RabbitMQ是一个强大的消息队列中间件,可以实现高效的消息传递和解耦。在实际应用中,我们还可以使用更多高级特性,如消息持久化、消息确认机制、消息路由策略等,以满足复杂的业务需求。本文将介绍如何在Spring Boot应用程序中集成RabbitMQ,并实现一个简单的消息发送和

    2024年03月14日
    浏览(49)
  • RabbitMQ如何保证消息的可靠性6000字详解

    RabbitMQ通过生产者、消费者以及MQ Broker达到了解耦的特点,实现了异步通讯等一些优点,但是在消息的传递中引入了MQ Broker必然会带来一些其他问题,比如如何保证消息在传输过程中可靠性(即不让数据丢失,发送一次消息就会被消费一次)?这篇博客将详细从生产者,MQ B

    2024年02月16日
    浏览(38)
  • 深入详解高性能消息队列中间件 RabbitMQ

      目录 1、引言 2、什么是 RabbitMQ ? 3、RabbitMQ 优势 4、RabbitMQ 整体架构剖析 4.1、发送消息流程 4.2、消费消息流程 5、RabbitMQ 应用 5.1、广播 5.2、RPC VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...) https://blog.csdn.net/chenlycly/article/details/124272585 C++软件异常排查从入

    2024年02月05日
    浏览(82)
  • 工具篇--4.1RabbitMq--常用配置参数详解

    前言: 在使用Rabbitmq 过程中,每次配置参数都需要进行搜索和回忆,本文对rabbitmq 中常用的配置成参数进行列举并解释; 这里先粘下比较常用的参数及其简单注注释,更为详细的注释可以在文章中后面的部分进行解读: 参数分类介绍: 1 基础参数: 客户端连接mq 服务端必要

    2024年02月12日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包