【mq】如何保证消息可靠性

文章目录

    • mq由哪几部分组成
      • rocketmq
      • kafka
    • 为什么需要这几部分
      • nameserver/zookeeper
        • 可靠性
      • broker
        • 可靠性
      • 生产者
      • 消费者

mq由哪几部分组成

rocketmq

在这里插入图片描述

kafka

这里先不讨论Kafka Raft模式
在这里插入图片描述

比较一下,kafka的结构和rocketmq的机构基本上一样,都需要一个注册中心,一个broker,然后就是我们的生产者和消费者。

为什么需要这几部分

nameserver/zookeeper

可以理解为注册中心,生产者,消费者,broker都需要注册到nameserver。

RocketMQ 中的 NameServer 和 Kafka 中的 ZooKeeper 在一些方面有相似的作用,但也存在一些区别。它们都是分布式消息传递系统中的关键组件,用于协调和管理集群中的各种信息和状态。以下是它们的共同点和区别:

共同点:

  1. 集群配置管理: 在两个系统中,都需要管理集群的配置信息,如节点的网络地址、分区分配等。

  2. 节点健康监测: NameServer 和 ZooKeeper 都能监测集群中各个节点的健康状态,帮助及时发现故障。

  3. 负载均衡: 两者都可以支持负载均衡,确保请求分发到可用的节点上。

  4. 元数据管理: 它们都用于存储和管理集群中的元数据,包括主题、分区、消费者组等信息。

  5. 故障检测和恢复: 在故障情况下,都能够帮助检测并协助进行恢复,确保数据的可用性。

区别:

  1. 角色不同: NameServer 主要用于 RocketMQ 集群的消息管理和路由,而 ZooKeeper 在 Kafka 中的作用更广泛,涵盖了集群的配置、状态、协调等多个方面。

  2. 分区分配: 在 Kafka 中,ZooKeeper 参与分区和副本分配的过程,而在 RocketMQ 中,NameServer 只处理消息队列的路由信息。

  3. Leader 选举: 在 Kafka 中,ZooKeeper 负责监测 Leader 的状态并进行选举,而在 RocketMQ 中,Leader 选举是由 Broker 自身处理的。

  4. 消费者协调: 在 Kafka 中,ZooKeeper 协调消费者组的成员关系和消费进度,而在 RocketMQ 中,消费者协调是由 Broker 和 NameServer 共同完成的。

  5. 依赖程度: 在 Kafka 2.8.0 版本以后,Kafka 开始逐步剥离对 ZooKeeper 的依赖,而在 RocketMQ 中,NameServer 仍然是核心组件之一。

可靠性

rocketmq的nameserver可以集群配置来实现高可用,还可以配置相应的报警和备份机制。
zookeeper一般我们部署的时候都会部署多个节点来保证可用性。

broker

总体上,不管是rocketmq还是kafka的broker,都包含了消息存储,传递和处理的功能。可以理解为数据处理的中心,生产者和消费者都要和broker打交道。

可靠性

RocketMQ 和 Kafka 都是流行的分布式消息传递系统,它们在消息存储、可靠性和吞吐量方面有些不同的实现策略。

RocketMQ 的消息存储和可靠性:

在 RocketMQ 中,消息存储使用了类似数据库的存储引擎,被称为 CommitLog(提交日志)。消息首先被写入 CommitLog 中,然后通过内存映射的方式进行索引,这有助于实现高速读写。然后,消息将异步复制到其他 Broker 节点的 CommitLog 中,以实现冗余和可靠性。

  • 可靠性保障: RocketMQ 通过异步复制和冗余存储来实现消息的可靠性。当消息写入本地 CommitLog 后,会异步地进行复制到其他 Broker 节点。只有当多个 Broker 节点都确认收到消息后,消息才被视为已提交。这种方式保障了消息的不丢失和高可靠性。

  • 吞吐量: RocketMQ 通过消息分区和水平扩展来提高吞吐量。每个主题被划分为多个分区,每个分区都有多个副本。这样,多个消费者可以同时消费不同分区中的消息,从而提高了系统的吞吐量。

Kafka 的消息存储和可靠性:

在 Kafka 中,消息存储采用了一种日志结构的文件系统,被称为日志分段(Log Segment)。消息以追加写入的方式写入日志分段中,每个分段有固定大小。Kafka 还使用了消息索引来加速消息的查找。

  • 可靠性保障: Kafka 通过副本机制来实现消息的冗余存储。每个分区通常有多个副本,其中一个是 Leader,负责读写操作,其他副本是 Followers,用于备份。当 Leader 宕机时,Kafka 可以从 Followers 中选举出新的 Leader。这种机制确保了消息在 Leader 宕机时仍然可用。

  • 吞吐量: Kafka 通过分区和副本的组合来提高吞吐量。多个消费者可以并行地从不同分区读取消息,而多个副本可以在不同的 Broker 上并行处理写入操作,提高了整体吞吐量。

综上所述,RocketMQ 和 Kafka 在消息存储和可靠性方面都使用了类似的冗余副本机制,确保消息不丢失。它们的吞吐量提升主要通过分区、副本和并行处理来实现。虽然实现细节有所不同,但它们的目标都是在高吞吐量和消息可靠性之间取得平衡。

生产者

RocketMQ 和 Kafka 都提供了多种方式来保证消息生产者发送的消息的可靠性。以下是它们在消息可靠性方面的主要策略:

RocketMQ 生产者消息可靠性策略:

  1. 同步发送模式: RocketMQ 的生产者可以选择同步发送模式,这意味着生产者在消息发送后会等待消息被所有副本成功保存后才返回成功。这可以确保消息不会在发送时丢失。

  2. 异步发送模式: 生产者还支持异步发送模式,生产者在发送消息后不会等待确认,而是通过回调函数来处理消息发送的结果。异步发送适用于不需要严格的实时性的场景。

  3. 可靠性级别(Level): RocketMQ 支持不同的消息可靠性级别,分为可靠性发送和可靠性同步发送。可靠性发送仅确保消息被发送到 Broker,而可靠性同步发送会等待消息被所有副本保存后才返回。

  4. 重试和超时机制: 如果发送消息时遇到错误,RocketMQ 生产者会根据设置的重试次数和超时时间进行自动重试。这有助于确保消息在短时间内能够成功发送。

Kafka 生产者消息可靠性策略:

  1. acks 配置: Kafka 生产者可以通过配置 acks 参数来控制消息发送的可靠性级别。可以选择的值包括 0、1 和 all。acks=0 表示生产者不等待确认,acks=1 表示在 Leader 副本确认接收后返回,acks=all 表示在所有副本都确认接收后返回。

  2. 重试机制: 如果消息发送失败,Kafka 生产者会自动进行重试,重试次数和间隔时间可以通过配置进行调整。

  3. 消息缓冲: Kafka 生产者会将发送的消息缓存在本地内存中,待缓冲区满或达到一定的时间间隔后,才进行一次批量发送。这样可以提高发送效率,并减少网络传输开销。

  4. 幂等性与事务性: 较新版本的 Kafka 支持生产者的幂等性和事务性。幂等性保证了重复消息不会引起副作用,而事务性确保了多个消息的原子性发送。

总的来说,无论是 RocketMQ 还是 Kafka,它们都提供了多种策略来确保生产者发送的消息的可靠性,包括等待确认、重试、缓冲和事务等机制,以满足不同应用场景的需求。选择适当的策略取决于业务需求和性能要求。

消费者

RocketMQ 和 Kafka 在消费者端都提供了一些机制来确保消息的可靠性传递。以下是它们在消息消费可靠性方面的主要策略:

RocketMQ 消费者消息可靠性策略:

  1. 消息确认机制: RocketMQ 消费者通过消息确认机制来确保消息的可靠性。消费者在成功处理消息后,会向 Broker 发送确认消息,告知该消息已被消费。如果消费者没有发送确认消息,Broker 将认为消息未被成功消费,会进行重试。

  2. 消息消费失败重试: 如果消费者在处理消息时发生错误,RocketMQ 支持设置消费重试次数。当消息消费失败时,消费者会自动进行重试,直到达到最大重试次数。

  3. 顺序消费: RocketMQ 支持顺序消费,即确保相同队列中的消息按照顺序被消费。这在需要保持消息顺序的业务场景中很有用。

  4. 定时消息和延迟消息: RocketMQ 支持定时消息和延迟消息,这允许消费者在特定时间或一段时间后消费消息,确保消息在正确的时机被处理。

Kafka 消费者消息可靠性策略:

  1. 偏移量管理: Kafka 消费者会跟踪每个分区的消费偏移量,确保消费者从正确的位置开始消费消息。消费者会定期提交偏移量,以便在重启后能够继续消费未处理的消息。

  2. 消费者组: Kafka 支持将多个消费者组成一个消费者组,每个分区只能被同一个消费者组中的一个消费者消费。这有助于确保每个消息只被一个消费者消费。

  3. 自动提交和手动提交: Kafka 消费者可以选择自动提交偏移量或手动提交偏移量。手动提交可以更精确地控制偏移量的提交,避免因自动提交导致的重复消费或丢失。

  4. 消息处理的幂等性: 消费者在处理消息时可以实现幂等性,确保多次处理同一消息不会产生副作用。

  5. 消费者分区再均衡: 当消费者组成员发生变化时,Kafka 会进行消费者分区再均衡,以确保分区被正确地分配给消费者。这有助于实现高可用性和负载均衡。

总之,无论是 RocketMQ 还是 Kafka,消费者端都提供了消息确认、消费失败重试、偏移量管理、幂等性处理等多种机制来保证消息的可靠性传递。选择适当的策略和配置取决于业务需求和性能要求。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

首席执行官Adam Selipsky解读“亚马逊云科技的技术产品差异化”

迄今为止,亚马逊云科技已经参与了21世纪几乎所有的大型计算变革,亚马逊云科技是一个很传奇的故事,它始于大约20年前的一项实验,当时亚马逊试图出售其过剩的服务器。人们确实对此表示怀疑。为什么在线书店试图销售云服务&#xff1…

区分什么是Java内存模型(JMM)和 JVM运行时数据区

文章目录 一、概念区分1、什么是内存模型?什么是(内存区域)运行时数据区?2、为什么要有Java内存模型?2.1、硬件的效率与一致性2.2、 CPU和缓存的一致性2.2.1、为什么需要CPU cache?2.2.2、三级缓存&#xf…

如何在 Linux 中设置 SSH 无密码登录

SSH(Secure SHELL)是一种开源且可信的网络协议,用于登录远程服务器以执行命令和程序。 它还用于使用安全复制 (SCP) 命令和 rsync 命令通过网络将文件从一台计算机传输到另一台计算机。 在本文[1]中,我们将向您展示如何在基于 RHE…

基于Java+SpringBoot+vue前后端分离在线问卷调查系统设计实现

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

推荐系统峰会:图与推荐系统

文章目录 图机器学习在京东视频召回中的应用提纲背景图召回架构图业务特色图召回总结 图算法在蚂蚁集团营销推荐场景的应用目录背景基金推荐长尾推荐 图模型在百度推荐系统的实践与思考目录图背景介绍常用算法Feed流图模型演进历程 GNN跨域推荐在微信业务上的应用目录GNN跨域遇…

登录校验-JWT令牌-登陆后下发令牌

目录 思路 接口文档 令牌生成和下发 步骤 具体代码如下 工具类 控制类 测试 前后端联调 思路 令牌生成:登陆成功后,生成JWT令牌,并返回给前端令牌校验:在请求到达服务端后,对令牌进行统一拦截、校验 接口文档…

非常简单!用Java实现一个简单的向量数据库雏形。

概述 向量数据库是用来解决高维向量数据管理和查询的问题。它能够有效地存储、索引和查询大规模高维度向量数据,并提供高性能和高效的相似度搜索。传统的关系型数据库或文档数据库在处理高维向量数据时可能会遇到诸多问题。比如在高维空间中,数据点之间…

搭建web网站

1.基于域名www.openlab.com可以访问网站内容为welcome to openlab!!! (1).安装所需软件HTTPD、mod_ssl [rootserver ~]# yum install httpd mod_ssl -y 添加域名映射:vim /etc/hosts (2)创建网站目录及网页,修改主配置文件新建openlab目录网站 配置文…

【网络安全】防火墙知识点全面图解(二)

本系列文章包含: 【网络安全】防火墙知识点全面图解(一)【网络安全】防火墙知识点全面图解(二)【网络安全】防火墙知识点全面图解(三) 防火墙知识点全面图解(二) 21、路…

基于android的学生公寓后勤系统/学生公寓管理系统APP

摘 要 随着网络科技的发展,移动智能终端逐渐走进人们的视线,相关应用越来越广泛,并在人们的日常生活中扮演着越来越重要的角色。因此,关键应用程序的开发成为影响移动智能终端普及的重要因素,设计并开发实用、方便的应…

《C语言编程环境搭建》工欲善其事 必先利其器

C语言编译器 GCC 系列 GNU编译器套装(英语:GNU Compiler Collection,缩写为GCC),指一套编程语言编译器,常被认为是跨平台编译器的事实标准。原名是:GNU C语言编译器(GNU C Compiler)。 MinGW 又称mingw32 &#xff0c…

无人驾驶领域的软件测试该如何开展?

无人驾驶汽车使用自主决策和控制系统,这种系统通常由多个软件和硬件组件组成。软件测试是必要的,因为它可以确保无人驾驶汽车的软件系统达到高度可靠性和安全性,以及提高无人驾驶汽车的性能和可靠性。 因此无人驾驶汽车是一定要进行严格的软件…

设计模式--工厂模式(Factory Pattern)

一、 什么是工厂模式 工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的接口,但是将对象的实例化过程推迟到子类中。工厂模式允许通过调用一个共同的接口方法来创建不同类型的对象,而无需暴露对…

08.利用Redis实现签到功能

学习目标&#xff1a; 来源&#xff1a;黑马教程 使用Redis中BitMap数据结构使用签到功能和连续签到功能 学习产出&#xff1a; 解决方案&#xff1a; 1. 准备pom环境 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-b…

【ARP欺骗】嗅探流量、限速、断网操作

【ARP欺骗】 什么是ARP什么是ARP欺骗ARP欺骗实现ARP断网限制网速嗅探流量 什么是ARP ARP&#xff08;Address Resolution Protocol&#xff0c;地址解析协议&#xff09;是一个TCP/IP协议&#xff0c;用于根据IP地址获取物理地址。在计算机网络中&#xff0c;当一个主机需要发…

Linux之iptables防火墙

目录 一.网络安全技术 二.防火墙 2.1.防火墙分类 2.2.iptables工具简述 2.3.iptables基本语法 2.4.控制类型 2.5.查看规则 2.6.添加规则 2.7.黑白名单 2.8.根据规则编号删除 清空 替换规则 2.9.默认策略 2.10.隐藏扩展模块 2.11.显示扩展模块 三.iptables保存规则…

Python 阿里云盾滑块验证

&#xfeff;<table><tr><td bgcolororange>本文仅供学习交流使用&#xff0c;如侵立删&#xff01;</td></tr></table> 记一次阿里云盾滑块验证分析并通过 操作环境 win10 、 macPython3.9selenium、pyautogui 分析 最近在做中国庭审…

设计模式之详解

概念 在软件工程中&#xff0c;设计模式是指软件设计问题的推荐方案。 设计模式一般是描述如何组织代码和使用最佳实践来解决常见的设计问题。 设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。 好处 设计模式可以提高代码的可重用性和可读…

29 - ref 和 $refs 获取dom和组件

作用: 利用 ref 和 $refs 可以用于 获取 dom 元素, 或 组件实例 特点: 查找范围 -> 当前组件内(更精确稳定) 1. 获取 dom: (1). 目标标签 - 添加 ref属性 <div ref"chartRef">我是渲染图表的容器</div> (2). 恰当时机,通过this.$refs.xxx,获取目标…

Linux内核学习(十一)—— 进程地址空间(基于Linux 2.6内核)

目录 一、地址空间 二、内存描述符 三、虚拟内存区域 四、操作内存区域 find_vma() mmap() 和 do_mmap()&#xff1a;创建地址区间 五、页表 一、地址空间 进程地址空间由进程可寻址并且允许进程使用的虚拟内存组成&#xff0c; 每个进程都有一个 32 位或 64 位的平坦&…