RabbitMq如何确保消息不丢失

上篇写了掌握Rabbitmq几个重要概念,从一条消息说起,这篇来总结关于消息丢失让人头痛的事情。网络故障、服务器重启、硬盘损坏等都会导致消息的丢失。消息从生产到消费主要结果以下几个阶段如下图。

①生产阶段,生产者创建消息,经过网络发送到rabbit服务器

②消息存储阶段,首先被发送到交换器然后经过路由算法,到达队列,等待被拉取消费

③消费阶段,消费者经过网络从rabbit服务器拉取消息进行消费 

这三个阶段都有可能消息丢失,下面一一分析。

消息存储阶段

正常情况下,我们使用BasicPublish方法发送消息到交换器上然后路由到队列上面,消费者还没进行消费,此时服务器重启了(队列、交换器使用默认的创建方式),会发生什么?答案是:消息丢失。原因很简单:消息在内存中,没有刷盘,并且,他们默认是非持久化的,服务重启之后,它们需要重新创建,消息自然就丢失!

还好,Rabbit提供持久化的机制,队列、交换器创建的时候,durable属性设置为true,同时消息投递模式(delivery mode)设置为2,则消息标记成持久化。这样可以避免服务器重启消息丢失的情况。

发送阶段

由于发布操作不返回任何信息给生产者,那你怎么知道服务器是否已经持久化了持久消息到硬盘呢?服务器可能在把消息写入磁盘前就宕机了,消息因此而丢失!

 有。)

Rabbit提供两中解决方案,事务,但是性能会大打折扣,而且会使生产者应用程序产生同步。生产环境一般不会采用;另外一种方案是确认模式。也很简单,消息路由给所有匹配的订阅队列中,之后会异步的告之生产者。使用channel.ConfirmSelect()方法,使信道开启确认模式。然后注入两个回调函数,ack和nack事件。

channel.BasicAcks += (sender, ev) =>{Console.WriteLine("消息已经确认收到" + ev.DeliveryTag);};channel.BasicNacks += (sender, ev) =>{Console.WriteLine("消息未确认" + ev.DeliveryTag);};

消费阶段

你可能会问,消费端消息怎么会丢失呢?Rabbitmq提供自动和手动确认消息,然后消息从队列中移除。如果autoAck为true,自动确认模式,服务器就会在消息发给消费端后自动将其出队。如果因为某些原因连接中断了,或者你的消费端应用发生了故障,那么消息就会丢失!

通过把AutoAck设置为false,手工确认,告知服务器,消息已经处理了,可以进行消息出队删除。

 

 channel.BasicConsume(queue: queueName,autoAck: false,consumer: consumer);
 consumer.Received += (model, ea) =>{//dosometingchannel.BasicAck(ea.DeliveryTag, false);//确认};

小结:如果做了以上的处理,那么消息就不会跟你躲猫猫了。这里有性能的问题,消息持久化,是要刷到磁盘上的会影响投递速度,并且消息确认也会影响到消息投递速度。不基本上能够满足需求了。如果不能满足性能需求,可以使用其他方法,比如 在每次发送消息的时候,都包含应答队列的名称,这样消费者就可以回发应答以确认接受到了。如果消息应答未在合理时间范围内到达,生产者就重新发送消息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/307568.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LEETCODE PATTERNS Neetcode 刷题记录(Leetcode题解-Python语言)

LEETCODE PATTERNS 官网在这个链接,Neetcode 官网在这个链接 If input array is sorted then 遇到有序数组用二分或双指针 Binary searchTwo pointers If asked for all permutations/subsets then 求排列或子集用回溯 Backtracking If given a tree then 遇到树就用…

蓝桥杯-单词分析

一:题目 题目描述 小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组 成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪…

.NET Core 使用 Consul 服务注册发现

Consul是一个用来实现分布式系统服务发现与配置的开源工具。它内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具,使用起来也较为简单。Consul官网:https://www.consul.io开源地…

蓝桥杯-成绩统计

一:题目 题目描述 小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数。 如果得分至少是 60 分,则称为及格。如果得分至少为 85 分,则称为优秀。 请计算及格率和优秀率,用百分数…

Mosh 的 MySQL 课程编程练习题目与答案

这篇文章是我观看 Mosh 的 MySQL 完整版课程进行题目练习的记录,视频的话去 B 站搜索就能找到,数据库文件的话可以从这里下载。 目录第二章2- SELECT 子句3- WHERE 子句4- 逻辑运算符5- IN 运算符6- BETWEEN 运算符7- LIKE 运算符8- REGEXP 运算符&#…

《ASP.NET Core 真机拆解》 送书活动结果公布

截至2020.09.26 本次送书活动 送福利 | 送书5本 ASP.NET Core 真机拆解 。下面把Top 5的留言截图给大家回顾一下。特别鸣谢作者罗志超提供的图书。以下5位同学将获赠书籍一本:傲慢的上校静阿花阿定傲慢与偏见以上同学请在2020年9月30日24:00之前加小二微…

跟我一起学.NetCore之静态文件处理的那些事

前言如今前后端分离开发模式如火如荼,开发职责更加分明(当然前后端一起搞的模式也没有完全褪去);而对于每个公司产品实施来说,部署模式会稍有差别,有的会单独将前端文件部署为一个站点,有的会将…

深度学习入门笔记(3)——用梯度下降进行参数更新

首先是对感知器的简单回顾,假设现有的训练集为 D,共有 n 个训练数据,每个数据都有 m 个输入特征和一个输出标签。一个 epoch 就是遍历一次整个训练集,对于每一个训练数据,都计算其预测、计算误差、更新参数。 在一个 e…

ASP.NET Core Blazor Webassembly 之 路由

web最精妙的设计就是通过url把多个页面串联起来,并且可以互相跳转。我们开发系统的时候总是需要使用路由来实现页面间的跳转。传统的web开发主要是使用a标签或者是服务端redirect来跳转。那今天来看看Blazor是如何进行路由的。使用page指定组件的路由path我们可以在…

手撕单例模式(详解)

一:设计模式概述 1:设计模式的概念 软件设计模式(Software Design Pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生的问题&#xff0…

微软发布.NET 5.0 RC1,未来将只有一个.NET

本周早些时候,微软发布了.NET 5.0 RC1,这是.NET 5 在11 月正式发布之前的第一个“go-live”版本。.NET 5 是.NET 生态系统的统一平台,将所有组件打包成一个跨平台包。新版本包含了.NET Core 3 的很多改进,包括新的语言版本(C# 9 和…

深度学习入门笔记(4)—— Pytorch 和计算图的简单介绍

Pytorch 顾名思义,就是 Torch 7 移植到 Python 的版本,其最大亮点就是自动微分、动态计算图和 Numpy 集成。 Pytorch 相比于 Numpy,优点在于支持 GPU 计算甚至是多设备计算,以及动态计算图。 在 import 的时候,得记住 …

leetcode26. 删除有序数组中的重复项

一:题目 二:上码 // class Solution { // public: // int removeDuplicates(vector<int>& nums) { // //排序 // sort(nums.begin(),nums.end());// //调用unique&#xff08;&#xff09;将vector当中的相同元素 放到 容器的最后面 //…

楼继伟:现有5G技术很不成熟

日前&#xff0c;财政部原部长楼继伟表示&#xff0c;基础设施适度超前是必要的&#xff0c;但有些方面过度超前&#xff0c;抬高了用户成本或不可持续的公共部门债务。现有5G技术很不成熟&#xff0c;数千亿级的投资已经布下&#xff0c;而且运营成本极高&#xff0c;找不到应…

深度学习入门笔记(5)—— Pytorch API 的基本用法框架

第一步&#xff0c;通常是定义我们的神经网络模型。类名后的括号表示我们定义的类会继承 torch.nn.Module&#xff0c;而 super 函数就是调用父类的方法&#xff0c;后面跟 __init__() 就是调用 torch.nn.Module 的构造函数&#xff0c;然后就是我们自定义的模型及其参数。在 f…

跟我一起学.NetCore之路由的最佳实现

前言路由&#xff0c;这词绝对不陌生&#xff0c;不管在前端还是后端都经常提到&#xff0c;而这节不说其他&#xff0c;就聊.NetCore的路由&#xff1b;在之前的Asp.Net MVC 中&#xff0c;路由算是面试时必问的考点&#xff0c;可见其重要性&#xff0c;它的主要作用是映射UR…

leetcode844. 比较含退格的字符串

一:题目 二:上码 class Solution {public:/**思路:1.利用栈 我们将字符串中的单个元素都入栈 当遇到#的时候将将栈顶元素弹出*/bool backspaceCompare(string s, string t) {stack<int> s1;stack<int> s2;for (int i 0; i < s.size(); i) {if(s[i] ! #) s1.pu…

BeetleX之HTTP网关部署

BeetleX组件提供了HTTP网关组件&#xff0c;但使用过程中需要自己写宿主程序来启动它。为了更好的直接使用&#xff0c;组件发布了一个基于.net core 3.1的可运行版本程序并集成了管理插件&#xff1b;只需下载程序即可以在linux或windows下部署一个HTTP网关部署。部署安装运行…

深度学习入门笔记(6)—— Logistic Regression

对比第三节中的 Adaline 和 Logistic Regression&#xff0c;可以发现它们只有两点不同&#xff1a;1、激活函数&#xff0c;Adaline 中的激活函数是恒等函数&#xff08;线性&#xff09;&#xff0c;而 Logistic Regression 中的激活函数是 Sigmoid 函数&#xff08;非线性&a…

微服务模式下,实现前后端多资源服务调用

MicroServices首先&#xff0c;我先解释下&#xff0c;文章标题的意思&#xff1a;咋看起来特别像是一个标题党????&#xff0c;可能是我没想好怎么表达&#xff0c;其实白话文就是&#xff1a;在微服务场景下&#xff0c;肯定会有很多子服务API&#xff0c;那多个前端项目…