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

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

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

相关文章

计算机竞赛 基于GRU的 电影评论情感分析 - python 深度学习 情感分类

文章目录 1 前言1.1 项目介绍 2 情感分类介绍3 数据集4 实现4.1 数据预处理4.2 构建网络4.3 训练模型4.4 模型评估4.5 模型预测 5 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 基于GRU的 电影评论情感分析 该项目较为新颖,适合作为竞…

Postman中参数区别及使用说明

一、Params与Body 二者区别在于请求参数在http协议中位置不一样。Params 它会将参数放入url中以?区分以&拼接Body则是将请求参数放在请求体中 后端接受数据: 二、body中不同格式 2.1 multipart/form-data key - value 格式输入,主要特点是可以上…

(三)行为模式:5、中介者模式(Mediator Pattern)(C++示例)

目录 1、中介者模式(Mediator Pattern)含义 2、中介者模式的UML图学习 3、中介者模式的应用场景 4、中介者模式的优缺点 (1)优点 (2)缺点 5、C实现中介者模式的实例 1、中介者模式(Media…

基于unity的轻量配置工具开发

工具结构:针对每张表格生成一个表格类,其中默认包含一个list和字典类型参数记录表格数据,初始化项目时将list中的数据转为按id索引的dictionary,用于访问数据。额外包含一个同名Temp后缀的类,记录表格的字段、备注等信…

Leetcode:238. 除自身以外数组的乘积【题解超详细】

纯C语言实现(小白也能看明白) 题目 给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数…

Apache Poi 实现Excel多级联动下拉框

由于最近做的功能,需要将接口返回的数据列表,输出到excel中,以供后续导入,且网上现有的封装,使用起来都较为麻烦,故参考已有做法封装了工具类。 使用apache poi实现excel联动下拉框思路 创建隐藏单元格&a…

计算机组成原理学习笔记-精简复习版

一、计算机系统概述 计算机系统硬件软件 计算机硬件的发展: 第一代计算机:(使用电子管)第二代计算机:(使用晶体管)第三代计算机:(使用较小规模的集成电路)第四代计算机:(使用较大规模的集成电路) 冯诺依曼体系结构…

指针C语言

1指针方式 1.int a,*p&a; 2. int a;int *p&a;特点: 1.指针变量与类型无关,在TC占2字节,在VC下占四字节 2.指针变量的引用 1.直接引用 2.间接引用 注意*的运算对象必须为地址 *p1; //相当于取p指针指向的值然后+1 int …

keepalived+lvs(DR)

目录 一,作用 二,调度器配置 1,安装keepalived 2, 安装ipvsadm 3, 配置keepalived 4. 查看lvs节点状态 5, web节点配置 1.1 调整ARP参数 1.2 配置虚拟IP地址 1.3添加回环路由 1.4安装nginx并写…

机器学习实战之模型的解释性:Scikit-Learn的SHAP和LIME库详解

引言:机器学习模型的“黑箱”困境 机器学习模型的崛起让我们惊叹不已!不论是预测房价、识别图片中的猫狗,还是推荐给你喜欢的音乐,这些模型都表现得非常出色。但是,有没有想过,这些模型到底是如何做出这些决…

echarts 甘特图一组显示多组数据

<template><el-button type"primary" click"addlin">添加线</el-button><el-button type"success" click"addArea">添加区域</el-button><div ref"echart" id"echart" class&qu…

自学设计模式(类图、设计原则、单例模式 - 饿汉/懒汉)

设计模式需要用到面向对象的三大特性——封装、继承、多态&#xff08;同名函数具有不同的状态&#xff09; UML类图 eg.—— 描述类之间的关系&#xff08;设计程序之间画类图&#xff09; : public; #: protected; -: private; 下划线: static 属性名:类型&#xff08;默认值…

Linux(基础IO、文件权限、Makefile)

目录 1、man 手册 1.1 汉化 1.2 具体使用 2、文件权限 2.1 权限理解 2.2 文件详细信息查询 2.3 权限更改 3、常用函数接口 3.1 open 3.2 read 3.3 write 3.4 close 3.5 函数使用示例 4、make与Makefile 4.1 make 与 Makefile区别 4.2 Makefile的编写 5、vim简…

Git 原理与使用

1.版本控制器 所谓的版本控制器&#xff0c;就是能让你了解到⼀个⽂件的历史&#xff0c;以及它的发展过程的系统。通俗的讲就是⼀个可以记录⼯程的每⼀次改动和版本迭代的⼀个管理系统&#xff0c;同时也⽅便多⼈协同作业。 ⽬前最主流的版本控制器就是 Git 。Git 可以控制电脑…

四、Kafka Broker

4.1.1 Zookeeper 存储的 Kafka 信息 4.1.2 Kafka Broker 总体工作流程 4.2 生产经验 - 节点的服役和退役 自己的理解&#xff1a;其实就是将kafka的分区&#xff0c;负载到集群中的各个节点上。 1、服役新节点 2、退役旧节点 4.3 kafka副本 1、副本的作用 2、Leader的选…

Java设计模式-状态模式

1.概述 定义&#xff1a; 对有状态的对象&#xff0c;把复杂的“判断逻辑”提取到不同的状态对象中&#xff0c;允许状态对象在其内部状态发生改变时改变其行为。 【例】通过按钮来控制一个电梯的状态&#xff0c;一个电梯有开门状态&#xff0c;关门状态&#xff0c;停止状…

论文笔记: MOGRIFIER LSTM

2020 ICLR 修改传统LSTM 当前输入和隐藏状态充分交互&#xff0c;从而获得更佳的上下文相关表达 1 Mogrifier LSTM LSTM的输入X和隐藏状态H是完全独立的 机器学习笔记&#xff1a;GRU_gruc_UQI-LIUWJ的博客-CSDN博客这篇论文想探索&#xff0c;如果在输入LSTM之前&#xf…

前端需要理解的跨平台知识

混合开发是指使用多种开发模开发App的一种开发模式&#xff0c;涉及到两大类技术&#xff1a;原生 Native、Web H5。原生 Native 主要指 iOS&#xff08;Objective C&#xff09;、Android&#xff08;Java&#xff09;&#xff0c;原生开发效率较低&#xff0c;开发完成需要重…

Nginx的搭建与核心配置

Nginx的搭建与核心配置 1、IO模型1.1I/O 模型相关概念1.2网络I/O模型1.2.1阻塞型I/O模型1.2.2非阻塞型I/O模型1.2.3多路复用I/O型1.2.4信号驱动式I/O模型1.2.5异步I/O模型 2、Nginx概述2.1Nginx功能介绍2.2基础特性2.3Web服务相关的功能2.4Nginx进程结构2.4Nginx模块2.5Nginx三…

人工智能项目集合推荐(数据集 模型训练 C++和Android部署)

人工智能项目集合推荐(数据集 模型训练 C和Android部署) 目录 人工智能项目集合推荐(数据集 模型训练 C和Android部署) 1.三维重建项目集合 ★双目三维重建 ★结构光三维重建 2.AI CV项目集合 ★人脸检测和人体检测 ★人体姿态估计(人体关键点检测) ★头部朝向估计 …