RabbitMQ--基础--11.1--持久化,消息的保障机制,生产者确认机制,消费者处理消息的模式

2023-11-09

RabbitMQ–基础–11.1–持久化,消息的保障机制,生产者确认机制,消费者处理消息的模式


1、持久化

  1. 交换机的持久化
  2. 队列的持久化
  3. 消息的持久化

1.1、交换机的持久化

RabbitMQ服务重启,若交换机不设置持久化,交换机的元数据会丢失,消息不会丢失,不过消息再也不能发送到这个交换机中了

1.2、队列的持久化

RabbitMQ服务重启,若队列不设置持久化,元数据会丢失,数据也会丢失

1.3、消息的持久化

设置所有的消息持久化,可靠性会大大提高,可是对于性能上是一个巨大的影响,这是一个可靠性和吞吐量之间做一个权衡

2、队列中传输消息的保障机制

  1. 消息的传输保障,对于一般的消息中间件来说,会考虑这三个层级
    1. 最多一次
    2. 最少一次
    3. 恰好一次
  2. RabbitMQ 支持最多一次和至少一次,无法保障 恰好一次

2.1、最多一次

消息可能会丢失,但不会重复

2.1.1、最多一次 的实现需要考虑以下几个方面

  1. 生产者需要开启事务机制 或者 确认机制,以确保消息可以可靠地传输到 RabbitMQ 中
  2. 生产者需要配合使用备份交换机来确保消息能够从交换机路由到队列中,进而能够保存下来而不会被丢弃
  3. 消息和队列都需要进行持久化处理,以确保 RabbitMQ 服务器在遇到异常情况时不会造成消息丢失
  4. 消费者在消费消息的同时需要将autoAck设置为 false,然后通过手动确认的方式去确认已经正确消费的消息,以避免在消费端引起不必要的消息丢失。

2.2、最少一次

  1. 消息可能会重复,但不会丢失
  2. 生产者随意发送,消费者随意消费

2.3、恰好一次

  1. 每条消息一定只会被传输一次

2.3.1、无法保障 恰好一次 的原因

  1. 消费者在消费完一条消息之后向 RabbitMQ 发送确认命令,此时由于异常原因(网络,或宕机)造成RabbitMQ并没有收到这个确认命令,RabbitMQ不会将此条消息标记删除。在重新连接之后,消费者还是会消费到这一条消息,这就造成了重复消费
  2. 生产者在使用 确认机制 的时候,发送完一条消息等待 RabbitMQ 返回确认通知,此时正好网络断开,生产者捕获到异常情况,为了确保消息可靠性选择重新发送,这样 RabbitMQ 中就有两条同样的消息,在消费的时候,消费者就会重复消费

3、生产者确认机制

  1. 事务模式
  2. 发送方确认模式 confirm 模式

3.1、事务模式

  1. 事务机制在一条消息发送之后会使发送端阻塞,以等待RabbitMQ的回应,之后才能继续放下一条消息
  2. 事务模式性能非常低,不建议使用。

3.2、发送方确认模式 confirm 模式

  1. 发送方确认机制最大的好处在于它是异步的,一旦发布一条消息,生产者就可以在等信道返回确认的同时继续发送下一条消息
  2. 当消息最终得到确认之后,生产者便可以通过回调方式来处理该确认消息,哪怕是 RabbitMQ 自己内部出现了错误,也会回复响应的应答给到生产者

4、消费者处理消息的模式

  1. 推模式:消费者正常启动程序之后,会是推模式
  2. 拉模式:消费者程序第一次起来的时候,是拉模式
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RabbitMQ--基础--11.1--持久化,消息的保障机制,生产者确认机制,消费者处理消息的模式 的相关文章

  • Akka 的语言和产品替代品是什么?

    现在我正在看游戏框架 https www playframework com 并且非常喜欢它 Play 中提供的功能中最受宣传的部分之一是Akka http akka io 为了更好地理解 Akka 以及如何正确使用它 您能告诉我其他语言或
  • 如何在nodejs中验证rabbitmq?

    错误 握手被服务器终止 403 ACCESS REFUSED 消息 ACCESS REFUSED 使用身份验证拒绝登录 旋转机制平原 有关详细信息 请参阅代理日志文件 我单独尝试了 authMechanism PLAIN AMQPLAIN
  • 每次发布后我应该关闭通道/连接吗?

    我在 Node js 中使用 amqplib 但我不清楚代码中的最佳实践 基本上 我当前的代码调用amqp connect 当 Node 服务器启动时 然后为每个生产者和每个消费者使用不同的通道 而不会真正关闭它们中的任何一个 我想知道这是
  • 无法在Windows上启用rabbitmq管理插件

    所以 这就是我所做的 在我的 Windows x64 位机器上安装了 Erlang 安装 RabbitMQ 启动 RabbitMQ 服务 这一步我没有任何错误 但是 当我尝试启用rabbitmq management时 我在控制台中收到一些
  • 在rabbitmq配置spring boot中在AMQP中配置多个Vhost

    我正在实现一个项目 我必须在rabbitmq中的不同虚拟主机之间发送消息 使用 SimpleRoutingConnectionFactory 但得到 java lang IllegalStateException 无法确定查找键的目标 Co
  • Celery 任务状态取决于 CELERY_TASK_RESULT_EXPIRES

    据我所知 任务状态完全取决于 CELERY TASK RESULT EXPIRES 设置的值 如果我在任务完成执行后检查此间隔内的任务状态 则返回的状态为 AsyncResult task id state 是正确的 如果没有 状态将不会更
  • 死信交换 RabbitMQ 丢弃消息

    我正在尝试在 RabbitMQ 中实现 dlx 队列 场景很简单 我有 2 个队列 1 活着 2 死亡 x dead letter exchange 立即 x message ttl 5000 以及 立即 交换 这必然是 1 活着 我尝试运
  • 在 docker-compose 文件中提供rabbitmq.conf会给出“sed:无法重命名/etc/rabbitmq/sedMaHqMa:设备或资源繁忙”

    我的 docker compose 看起来像这样 version 3 2 services mq hostname HOST NAME ports 5671 5671 5672 5672 15671 15671 15672 15672 en
  • RabbitMQ 上的 Nack 和拒绝

    我想处理消费者从队列中获取的不成功的消息并将它们重新排队 想象一下我有这样的情况 P gt foo bar baz gt C 其中 foo bar 和 baz 是消息 如果消费者读到baz但出了问题 我可以使用basic reject or
  • RabbitMQ - 如何死信/处理过期队列中的消息?

    我有一个队列x expires放 我遇到的问题是我需要对队列中的消息进行进一步处理IF队列过期 我最初的想法是设置x dead letter exchange在队列中 但是 当队列过期时 消息就会消失而不会进入死信交换 如何处理死信或以其他
  • 将 sensu-client 连接到服务器时 AMQP 连接的 bad_header

    我已经安装了 sensu 和厨师社区食谱 但是 sensu客户端无法连接到服务器 导致rabbitmq连接错误 尝试连接时消息超时 这是详细的客户端日志 来自 sensu client log 的日志 timestamp 2014 07 0
  • Rabbit mq - 等待 Mnesia 表时出错

    我已经在 Kubernetes 集群上使用 Helm Chart 安装了 RabbitMQ rabbitmq pod不断重新启动 在检查 pod 日志时 我收到以下错误 2020 02 26 04 42 31 582 warning lt
  • RabbitMQ:无法启动rabbitmq_management插件

    Version gt sudo rabbitmqctl status grep rabbit RabbitMQ rabbit RabbitMQ 3 5 6 Error gt sudo rabbitmq plugins enable rabb
  • 使用 Spring 与 RabbitMQ 集成

    我正在为我们的一个应用程序开发消息传递界面 该应用程序是一种服务 旨在接受 作业 进行一些处理并返回结果 实际上以文件的形式 这个想法是使用 RabbitMQ 作为消息传递基础设施 并使用 Spring AMQP 来处理协议特定的细节 我不
  • RabbitMQ 中的 celeryev 队列变得非常大

    我在rabbitmq上使用celery 我已经向队列发送了数千条消息 它们正在成功处理 一切正常 然而 几个rabbitmq队列中的消息数量增长得相当大 队列中有数十万个项目 队列被命名为celeryev 见下面的截图 这是适当的行为吗 这
  • RabbitMQ 中 Pub/Sub 与工作队列的混合

    我正在评估使用 RabbitMQ 作为消息队列 消息总线 并一直在查看示例教程 https www rabbitmq com getstarted html在 RabbitMQ 页面上 我正在寻找教程中未涵盖的特定场景 并且我不确定是否以及
  • 在 Spring 中设计复杂的通知系统

    我想设计和实现一个复杂的通知系统 其中我有一个用户将自动和手动订阅不同的事件 经过一番研究后 我决定使用 websockets 将通知推送到客户端 并订阅事件 我会选择 RabbitMQ 特别是直接交换 最初的想法是 在建立 websock
  • RabbitMq 和“致命错误:握手失败 -handshake_decode_error”

    我正在使用 Windows Server 2012 Erlang 19 2 和 RabbitMq 3 6 6 我在使用 TLS 配置端点之间的连接时遇到问题 我已经尝试了所有关于 SO 的答案 以及所有 RabbitMq 文档here ht
  • 具有延迟的简单可扩展工作/消息队列

    我需要设置一个作业 消息队列 并可以选择为任务设置延迟 以便空闲工作人员不会立即拾取它 而是在一定时间后 可能因任务而异 我研究了几个 Linux 队列解决方案 rabbitmq gearman memcacheq 但它们似乎都没有提供开箱
  • Rabbitmq 忽略 Ubuntu 12 上的配置

    I have rabbitmq server从系统包安装乌班图12 无论我做什么 它似乎都会忽略任何配置文件 网络上的所有内容都表明服务器正在寻找 etc rabbitmq rabbitmq conf 但即使我创建该文件 服务器也报告没有配

随机推荐

  • Linux系统下卸载VMware Workstation软件

    之所以写这篇文的原因是自己linux台式电脑上需要卸载VMware Workstation软件 网上检索了很多关键词 搜索到的大都是卸载vm虚拟机内安装的Linux操作系统 可能就是这方面的说明内容太少了 在此记录一下 说不定以后就能用上了
  • Flutter使组件居于屏幕中间

    有多种方式可以使组件居于屏幕中间 以下是其中的几种 1 使用 Center 组件将子组件居中 dart Center child YourWidget 2 使用 Align 组件指定子组件的对齐方式 将其居中 dart Align alig
  • CSS的BEM命名规范

    BEM的意思就是块 block 元素 element 修饰符 modifier 是由Yandex团队提出的一种CSS命名方法 其背后的想法是将用户界面分为独立的块 即使使用复杂的UI 这也使界面开发变得容易和快速 并且允许重用现有代码而无需
  • python库是什么

    1 概念 库的概念是具有相关功能模块的集合 这也是Python的一大特色之一 2 库的分类 在Python语言的库中 分为Python标准库和Python的第三方库 python的标准库是随着pyhon安装的时候默认自带的库 python的
  • OkHttp的特性优点及爬虫示例

    OkHttp是一个Java和Android应用程序的HTTP客户端库 旨在提高资源加载速度和节省带宽 与其他类似的库相比 它具有以下优点和区别 一 OkHttp的特性和优点 支持HTTP 2协议 可提高效率和速度 支持连接池 减少请求延迟
  • 【剑指offer】面试题39:二叉树的深度

    一 题目描述 输入一棵二叉树 求该树的深度 从根结点到叶结点依次经过的结点 含根 叶结点 形成树的一条路径 最长路径的长度为树的深度 二 解题思路 递归思想 1 如果一棵树只有一个节点 那么深度为1 2 如果根节点只有左子树而没有右子树 那
  • 【python】【leetcode】【算法题目389—Find the Difference】

    一 题目描述 题目原文 Given two strings s and t which consist of only lowercase letters String t is generated by random shuffling
  • 从一道题目学习Nunjucks模板

    Nunjucks简介 Nunjucks 是一个功能丰富 强大的 JavaScript 专用模板引擎 Nunjucks 提供丰富的语言特性和块继承 自动转移 宏和异步控制等等 重点要关注的是 Nunjucks 模板引擎的代码在沙箱环境中运行
  • Matplotlib课程–学习Python数据可视化

    Learn the basics of Matplotlib in this crash course tutorial Matplotlib is an amazing data visualization library for Pyt
  • 详解Java锁对象

    1 Synchronized 1 1 synchronized特性 1 互斥 synchronized会起到互斥效果 某个线程执行到某个对象的synchronized中时 其他线程如果也执行到同一个对象synchronized就会阻塞等待
  • Python项目:学生信息管理系统(完整版)

    本文是基于上一篇 python项目 学生信息管理系统 初版 进行了完善 并添加了新的功能 主要包括有 完善部分 输入错误 无数据查询等异常错误 新的功能 文件的操作 文件的读写 其中重点是对文本字符串的详细解析 关于整个解析拆解和重组详见代
  • Map分类与常见情况

    java为数据结构中的映射定义了一个接口java util Map 它有四个实现类 分别是HashMap Hashtable LinkedHashMap 和TreeMap Map主要用于存储健值对 根据键得到值 因此不允许键重复 重复了覆盖
  • 计算机网络---流量控制与可靠传输机制

    一 数据链路层的流量控制 较高的发送速度和较低的接收能力的不匹配 会造成传输出错 因此流量控制也是数据链路层的一项重要工作 数据链路层的流量控制是点对点 而传输层的流量控制是端到端的 数据链路层流量控制手段 接收方收不下就不回复确认 传输层
  • Blink 源码编译

    参考 http fetching118 com article 5 html 帮助文档 http fetching118 com blink doc quickstart scala shell quickstart html 1 从Git
  • 由于找不到msvcr120.dll,无法继续执行代码怎么修复,可以使用这个三个方法

    msvcr120 dll是 Microsoft Visual C Redistributable 中的一个文件 是Windows系统非常重要组件 它包含了大量用于 C 程序的函数和类库 这个文件用于一些应用程序或游戏 如果丢失或受损 就可能
  • 【cartographer_ros】四: 发布和订阅里程计odom信息

    上一节介绍了激光雷达Scan传感数据的订阅和发布 本节会介绍里程计Odom数据的发布和订阅 里程计在cartographer中主要用于前端位置预估和后端优化 官方文档 http wiki ros org navigation Tutoria
  • openwrt 编译进阶

    1 编译703 8M固件 1 target linux ar71xx image Makefile eval call SingleProfile TPLINK LZMA fs 64kraw TLWR703 tl wr703n v1 TL
  • 计算机考研复试常问问题 计算机网络篇

    一 计算机网络体系结构 1 OSI TCP IP和五层体系结构 五层协议 分为5层 自上到下分别为 应用层 传输层 网络层 数据链路层 物理层 应用层 为特定应用程序提供数据传输服务 传输单位是报文 传输层 为不同主机的进程提供通信服务 传
  • 五金手册钢材理论重量计算小程序_常用金属重量计算公式,值得收藏

    这是金属加工 mw1950pub 发布的第11525篇文章 编者按 分享常用的一些金属材料重量计算公式 钢管重量计算公式 方钢重量计算公式 钢板重量计算公式 值得收藏 圆钢重量 公斤 0 00617 直径 直径 长度 方钢重量 公斤 0 0
  • RabbitMQ--基础--11.1--持久化,消息的保障机制,生产者确认机制,消费者处理消息的模式

    RabbitMQ 基础 11 1 持久化 消息的保障机制 生产者确认机制 消费者处理消息的模式 1 持久化 交换机的持久化 队列的持久化 消息的持久化 1 1 交换机的持久化 RabbitMQ服务重启 若交换机不设置持久化 交换机的元数据会