当前位置: 首页 > news >正文

【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,消费者端都提供了消息确认、消费失败重试、偏移量管理、幂等性处理等多种机制来保证消息的可靠性传递。选择适当的策略和配置取决于业务需求和性能要求。

相关文章:

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

文章目录 mq由哪几部分组成rocketmqkafka 为什么需要这几部分nameserver/zookeeper可靠性 broker可靠性 生产者消费者 mq由哪几部分组成 rocketmq kafka 这里先不讨论Kafka Raft模式 比较一下,kafka的结构和rocketmq的机构基本上一样,都需要一个注册…...

疲劳检测-闭眼检测(详细代码教程)

简介 瞌睡经常发生在汽车行驶的过程中,该行为害人害己,如果有一套能识别瞌睡的系统,那么无疑该系统意义重大! 实现步骤 思路:疲劳驾驶的司机大部分都有打瞌睡的情形,所以我们根据驾驶员眼睛闭合的频率和…...

大数据日常运维命令

1、HDFS NameNode /usr/local/fqlhadoop/hadoop/sbin/hadoop-daemon.sh start namenode /usr/local/fqlhadoop/hadoop/sbin/hadoop-daemon.sh stop namenode bin/hdfs haadmin -DFSHAAdmin -getServiceState n1 2、HDFS DataNode /usr/local/fqlhadoop/hadoop/sbin/hadoop-…...

解锁安全高效办公——私有化部署的WorkPlus即时通讯软件

在当今信息时代,高效的沟通与协作对于企业的成功至关重要。然而,随着信息技术的发展,保护敏感信息和数据安全也变得越来越重要。为了满足企业对于安全沟通和高效办公的需求,我们隆重推出私有化部署的WorkPlus即时通讯软件&#xf…...

IDEA使用git

文章目录 给所有文件配置git初始化本地仓库创建.gitignore文件添加远程仓库分支操作 给所有文件配置git 初始化本地仓库 创建.gitignore文件 添加远程仓库 分支操作 新建分支 newbranch 切换分支 checkout 推送分支 push 合并分支 merge...

【跟小嘉学 Rust 编程】十八、模式匹配(Patterns and Matching)

系列文章目录 【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学…...

keepalived+lvs+nginx高并发集群

keepalivedlvsnginx高并发集群 简介: keepalivedlvsnginx高并发集群,是通过LVS将请求流量均匀分发给nginx集群,而当单机nginx出现状态异常或宕机时,keepalived会主动切换并将不健康nginx下线,维持集群稳定高可用 1.L…...

剑指Offer65.不用加减乘除做加法 C++

1、题目描述 写一个函数&#xff0c;求两个整数之和&#xff0c;要求在函数体内不得使用 “”、“-”、“*”、“/” 四则运算符号。 示例: 输入: a 1, b 1 输出: 2 2、VS2019上运行 使用位运算的方法 #include <iostream>class Solution { public:/*** 计算两个整…...

【linux命令讲解大全】004.探索Linux命令行中的chmod和chown工具

文章目录 chmod概要主要用途参数选项返回值例子 chown补充说明语法选项参数实例 从零学 python chmod 用来变更文件或目录的权限 概要 chmod [OPTION]... MODE[,MODE]... FILE... chmod [OPTION]... OCTAL-MODE FILE... chmod [OPTION]... --referenceRFILE FILE...主要用途…...

nginx会话保持

ip_hash:通过IP保持会话 作用&#xff1a; nginx通过后端服务器地址将请求定向的转发到服务器上。 将客户端的IP地址通过哈希算法加密成一个数值 如果后端有多个服务器&#xff0c;第一次请求到服务器A&#xff0c; 并在务器登录成功&#xff0c;那么再登录B服务器就要重新…...

SpringBoot使用Druid连接池 + 配置监控页面(自定义版 + starter版)

目录 1. Druid连接池的功能2. 自定义版2.1 pom.xml添加依赖2.2 MyDataSourceConfig实现2.3 application.properties配置编写Controller进行测试2.4 druid监控页面查看 3. starter版3.1 pom.xml添加依赖3.2 自动配置分析3.3 使用application.properties对druid进行配置3.4 druid…...

【业务功能篇77】微服务-OSS对象存储-上传下载图片

3. 图片管理 文件存储的几种方式 单体架构可以直接把图片存储在服务器中 但是在分布式环境下面直接存储在WEB服务器中的方式就不可取了&#xff0c;这时我们需要搭建独立的文件存储服务器。 3.1 开通阿里云服务 针对本系统中的相关的文件&#xff0c;图片&#xff0c;文本等…...

【CSS 常用加载动画效果】

常用加载效果 呼吸灯效果波浪光效果转圈加载 呼吸灯效果 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><div id"ti"></div></body><style>b…...

python 模块requests 发送 HTTP 请求

一、简介 requests 模块是 python 基于 urllib&#xff0c;采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便&#xff0c;可以节约我们大量的工作 二、安装 pip install requestsimport requests三、方法 requsts.requst(method, url,headers,cookies,prox…...

关于 Camera 预览和录像画质不一样的问题分析

1、问题背景 基于之前安卓平台的一个项目&#xff0c;客户有反馈过一个 Camera app 预览的效果&#xff0c;和录像效果不一致的问题。 这里的预览是指打开 Camera app 后直接出图的效果&#xff1b;录像的效果则是指打开 Camera app 开启录像功能&#xff0c;录制一段视频&…...

【音视频】 视频的播放和暂停,当播放到末尾时触发 ended 事件,循环播放,播放速度

video 也可以 播放 MP3 音频&#xff0c;当不想让 视频显示出来的话&#xff0c;可以 给 video 设置宽和高 1rpx &#xff0c;不可以隐藏 <template><view class"form2box"><u-navbar leftClick"leftClick"><view slot"left&q…...

Python数据分析高薪实战第一天 python基础与项目环境搭建

开篇词 数据赋能未来&#xff0c;Python 势不可挡 互联网公司从红利下的爆发期&#xff0c;进入新的精细化发展阶段&#xff0c;亟须深入分析与挖掘业务与数据价值&#xff0c;从而找到新的增长点突破现有增长瓶颈。各行各业的数据分析需求井喷&#xff0c;数据分析人才成为争…...

pandas数据分析——groupby得到分组后的数据

groupbyagg分组聚合对数据字段进行合并拼接 Pandas怎样实现groupby聚合后字符串列的合并&#xff08;四十&#xff09; groupby得到分组后的数据 pandas—groupby如何得到分组里的数据 date_range补齐缺失日期 在处理时间序列的数据中&#xff0c;有时候会遇到有些日期的数…...

Android studio 软件git使用

在 test 分支添加的方法 , 现在切换到 master分支 总共 2 个分支 , 当前的分支是 test 出现了 先试一下 force checkout , 尝试之后发现 , 你更改没有带过来 , 以为哪个类在master分支没有 , 所以这边也没有 , 切回分支 test 发现之前的跟改没有 , 这样即可以找回 继续切换…...

通过C实现sqlite3操作,导入电子词典

#include <stdio.h> #include <string.h> #include <stdlib.h> #include <sqlite3.h> int main(int argc, const char *argv[]) {//创建并打开一个数据库sqlite3 *db NULL;if(sqlite3_open("./dict.db",&db) ! SQLITE_OK){printf("…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

comfyui 工作流中 图生视频 如何增加视频的长度到5秒

comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗&#xff1f; 在ComfyUI中实现图生视频并延长到5秒&#xff0c;需要结合多个扩展和技巧。以下是完整解决方案&#xff1a; 核心工作流配置&#xff08;24fps下5秒120帧&#xff09; #mermaid-svg-yP…...

Python异步编程:深入理解协程的原理与实践指南

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 持续学习&#xff0c;不断…...

【多线程初阶】单例模式 指令重排序问题

文章目录 1.单例模式1)饿汉模式2)懒汉模式①.单线程版本②.多线程版本 2.分析单例模式里的线程安全问题1)饿汉模式2)懒汉模式懒汉模式是如何出现线程安全问题的 3.解决问题进一步优化加锁导致的执行效率优化预防内存可见性问题 4.解决指令重排序问题 1.单例模式 单例模式确保某…...

【仿生机器人】刀剑神域——爱丽丝苏醒计划,需求文档

仿生机器人"爱丽丝"系统架构设计需求文档 一、硬件基础 已完成头部和颈部硬件搭建 25个舵机驱动表情系统 颈部旋转功能 眼部摄像头&#xff08;视觉输入&#xff09; 麦克风阵列&#xff08;听觉输入&#xff09; 颈部发声装置&#xff08;语音输出&#xff09…...