返回顶部
首页 > 资讯 > 精选 >MQ不丢消息究竟是怎么实现的
  • 844
分享到

MQ不丢消息究竟是怎么实现的

2023-06-03 16:06:12 844人浏览 独家记忆
摘要

本篇文章为大家展示了MQ不丢消息究竟是怎么实现的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。通过消息队列(MsgQueue,MQ)发送任务和消息,万一MQ重启了怎么办?能否保证MQ不丢消息?今天就

本篇文章为大家展示了MQ不丢消息究竟是怎么实现的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。


通过消息队列(MsgQueue,MQ)发送任务和消息,万一MQ重启了怎么办?能否保证MQ不丢消息?
今天就聊聊MQ的消息必达性架构与流程。
不丢消息,MQ架构设计的核心方向是什么?
MQ要想消息必达,架构上有两个核心设计点:
(1)消息落地;
(2)消息超时、重传、确认;

为了实现上述两个核心点,MQ架构如何?
MQ不丢消息究竟是怎么实现的
上图是一个MQ的核心架构图,可以分为三大块:
(1)发送方 -> 左侧粉色部分;
(2)MQ核心集群 -> 中间蓝色部分;
(3)接收方 -> 右侧屎黄色部分;

粉色发送方又由两部分构成:
(1)业务调用方;
(2)MQ-client-sender;
其中后者向前者提供了两个核心API

(1)SendMsg(bytes[] msg);

(2)SendCallback();

蓝色MQ核心集群又分为四个部分:

(1)MQ-server

(2)zk;

(3)db;

(4)管理后台WEB


黄色接收方也由两部分构成:
(1)业务接收方;
(2)MQ-client-receiver;
其中后者向前者提供了两个核心API

(1)RecvCallback(bytes[] msg);

(2)SendAck();

MQ是一个系统间解耦的利器,它能够很好的解除发布订阅者之间的耦合,它将上下游的消息投递解耦成两个部分,如架构图中的1箭头和2箭头:

MQ不丢消息究竟是怎么实现的
箭头1:发送方将消息投递给MQ,上半场;
箭头2:MQ将消息投递给接收方,下半场;

MQ消息可靠投递核心流程如何?
MQ既然将消息投递拆成了上下半场,为了保证消息的可靠投递,上下半场都必须保证消息必达。
MQ不丢消息究竟是怎么实现的
MQ消息投递上半场,MQ-client-sender到MQ-server流程见上图1-3:
(1)MQ-client将消息发送给MQ-server;
画外音:此时业务方调用api:SendMsg。
(2)MQ-server将消息落地,落地后即为发送成功;
(3)MQ-server将应答发送给MQ-client;
画外音:此时回调业务API:SendCallback。

MQ不丢消息究竟是怎么实现的
MQ消息投递下半场,MQ-server到MQ-client-receiver流程见上图4-6:
(4)MQ-server将消息发送给MQ-client;
画外音:此时回调业务API:RecvCallback。
(5)MQ-client回复应答给MQ-server;
画外音:此时业务方主动调用API:SendAck。
(6)MQ-server收到ack,将之前已经落地的消息删除,完成消息的可靠投递;

如果消息丢了怎么办?
MQ消息投递的上下半场,都可以出现消息丢失,为了保证消息可达性,MQ需要进行超时和重传。

上半场如何实施超时与重传?
MQ不丢消息究竟是怎么实现的
MQ上半场的1或者2或者3如果丢失或者超时,MQ-client-sender内的timer会重发消息,直到期望收到3,如果重传N次后还未收到,则SendCallback回调发送失败,需要注意的是,这个过程中MQ-server可能会收到同一条消息的多次重发。

下半场如何实施超时与重传?
MQ不丢消息究竟是怎么实现的
MQ下半场的4或者5或者6如果丢失或者超时,MQ-server内的timer会重发消息,直到收到5并且成功执行6,这个过程可能会重发很多次消息。
画外音:一般采用指数退避的策略,先隔x秒重发,2x秒重发,4x秒重发,以此类推。
需要注意的是,这个过程中MQ-client-receiver也可能会收到同一条消息的多次重发。
MQ是系统之间的解耦利器,MQ为了保证消息必达,架构设计方向为:
(1)消息收到先落地;
(2)消息超时、重传、确认保证消息必达;

上述内容就是MQ不丢消息究竟是怎么实现的,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网精选频道。

--结束END--

本文标题: MQ不丢消息究竟是怎么实现的

本文链接: https://lsjlt.com/news/234889.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MQ不丢消息究竟是怎么实现的
    本篇文章为大家展示了MQ不丢消息究竟是怎么实现的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。通过消息队列(MsgQueue,MQ)发送任务和消息,万一MQ重启了怎么办?能否保证MQ不丢消息?今天就...
    99+
    2023-06-03
  • mq保证消息不丢失的方法是什么
    MQ(消息队列)保证消息不丢失的方法主要有以下几种:1. 持久化机制:在发送消息时,将消息持久化到磁盘上,即使在消息队列崩溃或重启后...
    99+
    2023-10-12
    mq
  • mq怎么避免消息重复和消息丢失
    要避免消息重复和消息丢失,可以采取以下措施:1. 使用独立的消息唯一标识符:在每条消息中添加一个唯一的标识符,可以是消息的ID或者其...
    99+
    2023-10-20
    mq
  • mq消息丢失补偿机制是什么
    MQ消息丢失补偿机制是一种在消息中间件(MQ)中,当消息发送或消费遇到异常情况导致消息丢失时,能够进行补偿和保证消息不丢失的一种机制...
    99+
    2023-10-20
    mq
  • kafka消息不丢失是如何实现的
    Kafka通过以下几个方面来确保消息不丢失: 持久化存储:Kafka使用持久化日志文件来存储消息,即将消息写入到硬盘上的文件中。...
    99+
    2023-10-20
    kafka
  • MQ消息队列的概念是什么
    这篇文章主要介绍“MQ消息队列的概念是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MQ消息队列的概念是什么”文章能帮助大家解决问题。 一、消息队列使用场景 ...
    99+
    2024-04-02
  • java消息队列mq的使用场景是什么
    Java消息队列(MQ)的使用场景主要包括以下几个方面:1. 异步通信:当系统中的不同模块之间需要进行异步通信时,可以使用消息队列来...
    99+
    2023-10-09
    java
  • mq怎么保证消息的顺序一致性
    保证消息的顺序一致性是消息队列(MQ)中一个重要的问题。下面是几种常用的方法来解决这个问题:1. 单个消费者:只有一个消费者的情况下...
    99+
    2023-10-12
    mq
  • 怎么保证mq消息的顺序一致性
    要保证MQ消息的顺序一致性,可以采取以下几种方式:1. 使用单个消息队列:将所有需要保持顺序的消息发送到同一个消息队列中。这样可以确...
    99+
    2023-10-20
    mq
  • Python中线程的MQ消息队列实现以及消息队列的优点解析
    “消息队列”是在消息的传输过程中保存消息的容器。消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成...
    99+
    2022-06-04
    队列 消息 线程
  • 深入探究 RocketMQ 事务机制的实现流程,为什么它能做到发送消息零丢失?
    本文来自狸猫技术窝专栏《从零开始带你成为消息中间件实战高手》,是作者原子弹大侠开放的试读1、解决消息丢失的第一个问题:订单系统推送消息领丢失既然我们已经明确了消息在基于MQ传输的过程中可能丢失的几个地方,那么我们接着就得一步一步考虑如何去解...
    99+
    2023-06-03
  • golang mq的实现方法是什么
    在Go语言中,MQ(消息队列)的实现方法通常是使用第三方的消息队列软件,然后利用相应的客户端库来与消息队列进行交互。 以下是几种常见...
    99+
    2023-10-27
    golang mq
  • 手把手教你用redis实现一个简单的mq消息队列(java)
      众所周知,消息队列是应用系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构。目前使用较多的消息队列有 ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,Ro...
    99+
    2017-12-15
    手把手教你用redis实现一个简单的mq消息队列(java)
  • redis怎么实现消息队列
    Redis可以通过以下几种方式实现消息队列:1. List数据结构:使用Redis的List数据结构实现简单的消息队列。生产者将消息...
    99+
    2023-09-14
    redis
  • go怎么实现消息队列
    在Go语言中,你可以使用第三方库来实现消息队列。目前比较常用的消息队列库有:1. RabbitMQ:RabbitMQ是一个开源的消息...
    99+
    2023-08-31
    go
  • MSMQ消息队列怎么实现
    这篇文章主要介绍了MSMQ消息队列怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MSMQ消息队列怎么实现文章都会有所收获,下面我们一起来看看吧。一、引言Windows Communication Fou...
    99+
    2023-06-29
  • golang怎么实现消息队列
    在Golang中实现消息队列可以使用Golang的内置库和第三方库来实现。以下是两种常见的实现方式: 使用Golang内置的cha...
    99+
    2023-10-25
    golang
  • php实现消息推送的原理是什么
    这篇文章主要讲解了“php实现消息推送的原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php实现消息推送的原理是什么”吧!一、PHP实现消息推送的基础在介绍PHP实现消息推送的原理...
    99+
    2023-07-06
  • Redis消息队列实现的方法是什么
    Redis消息队列通常通过使用Redis的List数据结构来实现。消息生产者可以将消息推送到List中,而消息消费者可以从List中...
    99+
    2024-04-22
    Redis
  • Springboot+Netty+Websocket实现消息推送实例是怎样的
    Springboot+Netty+Websocket实现消息推送实例是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 前言We...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作