惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - GDOUJKZZ

.net 8程序如何在信创的arm64架构下运行【nuget包如何判断能不能在arm架构跑呢】 【AI应用】【声纹识别】一、mini io 来构建高可用的文件存储方案 【AI】第五篇 大话说神经网络第一篇 docker 目录下的overlay2层的太多,导致占用大量占用磁盘空间怎么办呢。【docker目录清理】 【AI】第四篇 什么是神经网络 - GDOUJKZZ 【AI】第三篇 RAG是什么 【AI】前置篇 Ai Agent的全貌概览 【AI】第二篇 为什么会有神经网络 【AI】第一篇 语言模型的前世 n-gram的简单介绍 【一】AI赋能 javascript里面的var let const关键字区别和使用 学习心态 从应用开发转到大数据开发 一分钟RequireJS介绍 .NET 6 在小并发下如何生成唯一单据号 垃圾回收机制简单理解 NPOI导出大量数据的避免OOM解决方案【SXSSFWorkbook】 递归有环问题解决方案 C# 使用NPOI处理Excel模板-【前面部分固定,中间是动态的几行,尾部是固定的部分】
高并发的场景下,如何保证生产者投递到消息中间件的消息不丢失
GDOUJKZZ · 2021-03-17 · via 博客园 - GDOUJKZZ

  生产端如何保证消息不丢失的问题

    在消息的生产端,如果投递的消息出去在网络传输过程中丢失,或者在RabbitMQ内存中,还没有写入磁盘的时候,发生宕机,都会导致生产端,投递到MQ的数据丢失。

    保证消息不丢失的confirm机制

    在生产端,首先要开启一个confirm机制, 接着投递到队列中的消息,如果MQ一旦将消息持久化到磁盘后,就必须要回传一个confirm消息给生产端。

    这样的话,如果生产端的服务接收到这个confirm消息,数据就已经持久化到磁盘了。

    否则,如果美云接收到confirm消息,那么就说明这条消息可能半路丢失了,此时你就可以重新投递消息到MQ去,确保消息不丢失。

    MQ回传ack给生产端的时候,会带上delivery tag。这样你就知道具体对应着哪一次消息投递了,可以删除了这条消息。

    此外,如果RabbitMQ接收到一条消息之后,结果内部出现错误,无法处理这条消息,那么他会回传一个nack给生产端。或者另外一种情况,消息队列很久都没有返回ack/unack,那么可能是极端意外的情况发生了,数据也丢了,你可以重新投递消息到MQ去。

    confirm机制的高延迟性

    一旦启用confirm机制投递消息到MQ之后,MQ是不保证什么时候会给你返回一个ack或者unack的。

    因为RabbitMQ自己内部将消息持久化到磁盘,本身就是通过异步批量的方式来进行的,正常情况下,你投递的消息都会先驻留内存里,然后过了几百毫秒之后,再一次性批量的把多条消息持久化到磁盘里去。

    这样做是为了兼顾高并发写入的时候,吞吐量和性能的,因为你要来一条消息,你就写入,那么性能会很差。

    正因为这样,你开启confirm之后,你接收到MQ回传过来的ack可能会有几百毫秒的延迟。

    高并发下如何投递消息才能不丢失

    大家可以考虑一下,在生产端,高并发写入MQ,你会面临两个问题:

    1、每次写一条数据,为了等待这条消息的ack,必须把消息保存到一个存储里。

    这个存储不建议是内存,因为高并发的消息是很多,每秒可能都几千甚至上万的消息投递,消息的ack要等几百毫秒,放在内存的话,可能会有内存溢出的风险。

    2、绝对不能以同步写消息+等待ack的方式来投递

    那样每投递一次,就会阻塞等几百毫秒,会导致投递性能和吞吐量的大幅度下降。