【mq】如何保证消息可靠性
文章目录
- mq由哪几部分组成
- rocketmq
- kafka
- 为什么需要这几部分
- nameserver/zookeeper
- 可靠性
- broker
- 可靠性
- 生产者
- 消费者
mq由哪几部分组成
rocketmq
kafka
这里先不讨论Kafka Raft模式
比较一下,kafka的结构和rocketmq的机构基本上一样,都需要一个注册中心,一个broker,然后就是我们的生产者和消费者。
为什么需要这几部分
nameserver/zookeeper
可以理解为注册中心,生产者,消费者,broker都需要注册到nameserver。
RocketMQ 中的 NameServer 和 Kafka 中的 ZooKeeper 在一些方面有相似的作用,但也存在一些区别。它们都是分布式消息传递系统中的关键组件,用于协调和管理集群中的各种信息和状态。以下是它们的共同点和区别:
共同点:
-
集群配置管理: 在两个系统中,都需要管理集群的配置信息,如节点的网络地址、分区分配等。
-
节点健康监测: NameServer 和 ZooKeeper 都能监测集群中各个节点的健康状态,帮助及时发现故障。
-
负载均衡: 两者都可以支持负载均衡,确保请求分发到可用的节点上。
-
元数据管理: 它们都用于存储和管理集群中的元数据,包括主题、分区、消费者组等信息。
-
故障检测和恢复: 在故障情况下,都能够帮助检测并协助进行恢复,确保数据的可用性。
区别:
-
角色不同: NameServer 主要用于 RocketMQ 集群的消息管理和路由,而 ZooKeeper 在 Kafka 中的作用更广泛,涵盖了集群的配置、状态、协调等多个方面。
-
分区分配: 在 Kafka 中,ZooKeeper 参与分区和副本分配的过程,而在 RocketMQ 中,NameServer 只处理消息队列的路由信息。
-
Leader 选举: 在 Kafka 中,ZooKeeper 负责监测 Leader 的状态并进行选举,而在 RocketMQ 中,Leader 选举是由 Broker 自身处理的。
-
消费者协调: 在 Kafka 中,ZooKeeper 协调消费者组的成员关系和消费进度,而在 RocketMQ 中,消费者协调是由 Broker 和 NameServer 共同完成的。
-
依赖程度: 在 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 生产者消息可靠性策略:
-
同步发送模式: RocketMQ 的生产者可以选择同步发送模式,这意味着生产者在消息发送后会等待消息被所有副本成功保存后才返回成功。这可以确保消息不会在发送时丢失。
-
异步发送模式: 生产者还支持异步发送模式,生产者在发送消息后不会等待确认,而是通过回调函数来处理消息发送的结果。异步发送适用于不需要严格的实时性的场景。
-
可靠性级别(Level): RocketMQ 支持不同的消息可靠性级别,分为可靠性发送和可靠性同步发送。可靠性发送仅确保消息被发送到 Broker,而可靠性同步发送会等待消息被所有副本保存后才返回。
-
重试和超时机制: 如果发送消息时遇到错误,RocketMQ 生产者会根据设置的重试次数和超时时间进行自动重试。这有助于确保消息在短时间内能够成功发送。
Kafka 生产者消息可靠性策略:
-
acks 配置: Kafka 生产者可以通过配置
acks
参数来控制消息发送的可靠性级别。可以选择的值包括 0、1 和 all。acks=0
表示生产者不等待确认,acks=1
表示在 Leader 副本确认接收后返回,acks=all
表示在所有副本都确认接收后返回。 -
重试机制: 如果消息发送失败,Kafka 生产者会自动进行重试,重试次数和间隔时间可以通过配置进行调整。
-
消息缓冲: Kafka 生产者会将发送的消息缓存在本地内存中,待缓冲区满或达到一定的时间间隔后,才进行一次批量发送。这样可以提高发送效率,并减少网络传输开销。
-
幂等性与事务性: 较新版本的 Kafka 支持生产者的幂等性和事务性。幂等性保证了重复消息不会引起副作用,而事务性确保了多个消息的原子性发送。
总的来说,无论是 RocketMQ 还是 Kafka,它们都提供了多种策略来确保生产者发送的消息的可靠性,包括等待确认、重试、缓冲和事务等机制,以满足不同应用场景的需求。选择适当的策略取决于业务需求和性能要求。
消费者
RocketMQ 和 Kafka 在消费者端都提供了一些机制来确保消息的可靠性传递。以下是它们在消息消费可靠性方面的主要策略:
RocketMQ 消费者消息可靠性策略:
-
消息确认机制: RocketMQ 消费者通过消息确认机制来确保消息的可靠性。消费者在成功处理消息后,会向 Broker 发送确认消息,告知该消息已被消费。如果消费者没有发送确认消息,Broker 将认为消息未被成功消费,会进行重试。
-
消息消费失败重试: 如果消费者在处理消息时发生错误,RocketMQ 支持设置消费重试次数。当消息消费失败时,消费者会自动进行重试,直到达到最大重试次数。
-
顺序消费: RocketMQ 支持顺序消费,即确保相同队列中的消息按照顺序被消费。这在需要保持消息顺序的业务场景中很有用。
-
定时消息和延迟消息: RocketMQ 支持定时消息和延迟消息,这允许消费者在特定时间或一段时间后消费消息,确保消息在正确的时机被处理。
Kafka 消费者消息可靠性策略:
-
偏移量管理: Kafka 消费者会跟踪每个分区的消费偏移量,确保消费者从正确的位置开始消费消息。消费者会定期提交偏移量,以便在重启后能够继续消费未处理的消息。
-
消费者组: Kafka 支持将多个消费者组成一个消费者组,每个分区只能被同一个消费者组中的一个消费者消费。这有助于确保每个消息只被一个消费者消费。
-
自动提交和手动提交: Kafka 消费者可以选择自动提交偏移量或手动提交偏移量。手动提交可以更精确地控制偏移量的提交,避免因自动提交导致的重复消费或丢失。
-
消息处理的幂等性: 消费者在处理消息时可以实现幂等性,确保多次处理同一消息不会产生副作用。
-
消费者分区再均衡: 当消费者组成员发生变化时,Kafka 会进行消费者分区再均衡,以确保分区被正确地分配给消费者。这有助于实现高可用性和负载均衡。
总之,无论是 RocketMQ 还是 Kafka,消费者端都提供了消息确认、消费失败重试、偏移量管理、幂等性处理等多种机制来保证消息的可靠性传递。选择适当的策略和配置取决于业务需求和性能要求。
相关文章:
![](https://img-blog.csdnimg.cn/6baa290a14334f76a0e7af5677aa39e3.png)
【mq】如何保证消息可靠性
文章目录 mq由哪几部分组成rocketmqkafka 为什么需要这几部分nameserver/zookeeper可靠性 broker可靠性 生产者消费者 mq由哪几部分组成 rocketmq kafka 这里先不讨论Kafka Raft模式 比较一下,kafka的结构和rocketmq的机构基本上一样,都需要一个注册…...
![](https://img-blog.csdnimg.cn/390167ac80d14cdaa90cc42b103705eb.png)
疲劳检测-闭眼检测(详细代码教程)
简介 瞌睡经常发生在汽车行驶的过程中,该行为害人害己,如果有一套能识别瞌睡的系统,那么无疑该系统意义重大! 实现步骤 思路:疲劳驾驶的司机大部分都有打瞌睡的情形,所以我们根据驾驶员眼睛闭合的频率和…...
![](https://www.ngui.cc/images/no-images.jpg)
大数据日常运维命令
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-…...
![](https://img-blog.csdnimg.cn/img_convert/be74e8e5aafb61187037213d4b86c64a.png)
解锁安全高效办公——私有化部署的WorkPlus即时通讯软件
在当今信息时代,高效的沟通与协作对于企业的成功至关重要。然而,随着信息技术的发展,保护敏感信息和数据安全也变得越来越重要。为了满足企业对于安全沟通和高效办公的需求,我们隆重推出私有化部署的WorkPlus即时通讯软件…...
![](https://img-blog.csdnimg.cn/635ebef6903e4e59a0d1f529f7fcd7f9.png)
IDEA使用git
文章目录 给所有文件配置git初始化本地仓库创建.gitignore文件添加远程仓库分支操作 给所有文件配置git 初始化本地仓库 创建.gitignore文件 添加远程仓库 分支操作 新建分支 newbranch 切换分支 checkout 推送分支 push 合并分支 merge...
![](https://www.ngui.cc/images/no-images.jpg)
【跟小嘉学 Rust 编程】十八、模式匹配(Patterns and Matching)
系列文章目录 【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学…...
![](https://img-blog.csdnimg.cn/2fd1e9071c4440d58863b709fa21c51c.png)
keepalived+lvs+nginx高并发集群
keepalivedlvsnginx高并发集群 简介: keepalivedlvsnginx高并发集群,是通过LVS将请求流量均匀分发给nginx集群,而当单机nginx出现状态异常或宕机时,keepalived会主动切换并将不健康nginx下线,维持集群稳定高可用 1.L…...
![](https://www.ngui.cc/images/no-images.jpg)
剑指Offer65.不用加减乘除做加法 C++
1、题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用 “”、“-”、“*”、“/” 四则运算符号。 示例: 输入: a 1, b 1 输出: 2 2、VS2019上运行 使用位运算的方法 #include <iostream>class Solution { public:/*** 计算两个整…...
![](https://www.ngui.cc/images/no-images.jpg)
【linux命令讲解大全】004.探索Linux命令行中的chmod和chown工具
文章目录 chmod概要主要用途参数选项返回值例子 chown补充说明语法选项参数实例 从零学 python chmod 用来变更文件或目录的权限 概要 chmod [OPTION]... MODE[,MODE]... FILE... chmod [OPTION]... OCTAL-MODE FILE... chmod [OPTION]... --referenceRFILE FILE...主要用途…...
![](https://img-blog.csdnimg.cn/135844b57b174ecdae392c87c79b84a6.png)
nginx会话保持
ip_hash:通过IP保持会话 作用: nginx通过后端服务器地址将请求定向的转发到服务器上。 将客户端的IP地址通过哈希算法加密成一个数值 如果后端有多个服务器,第一次请求到服务器A, 并在务器登录成功,那么再登录B服务器就要重新…...
![](https://img-blog.csdnimg.cn/1aa4eac7bd1d4b9eac04e47dae734c42.png)
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…...
![](https://img-blog.csdnimg.cn/img_convert/e32dbafff4575f77e48d45b6b8500a0a.png)
【业务功能篇77】微服务-OSS对象存储-上传下载图片
3. 图片管理 文件存储的几种方式 单体架构可以直接把图片存储在服务器中 但是在分布式环境下面直接存储在WEB服务器中的方式就不可取了,这时我们需要搭建独立的文件存储服务器。 3.1 开通阿里云服务 针对本系统中的相关的文件,图片,文本等…...
![](https://www.ngui.cc/images/no-images.jpg)
【CSS 常用加载动画效果】
常用加载效果 呼吸灯效果波浪光效果转圈加载 呼吸灯效果 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><div id"ti"></div></body><style>b…...
![](https://www.ngui.cc/images/no-images.jpg)
python 模块requests 发送 HTTP 请求
一、简介 requests 模块是 python 基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作 二、安装 pip install requestsimport requests三、方法 requsts.requst(method, url,headers,cookies,prox…...
![](https://img-blog.csdnimg.cn/557810da598d41dd9b5cbdfa4710e6d3.png)
关于 Camera 预览和录像画质不一样的问题分析
1、问题背景 基于之前安卓平台的一个项目,客户有反馈过一个 Camera app 预览的效果,和录像效果不一致的问题。 这里的预览是指打开 Camera app 后直接出图的效果;录像的效果则是指打开 Camera app 开启录像功能,录制一段视频&…...
![](https://img-blog.csdnimg.cn/59f382ba70bf427d917cfa41cebbe5f4.png)
【音视频】 视频的播放和暂停,当播放到末尾时触发 ended 事件,循环播放,播放速度
video 也可以 播放 MP3 音频,当不想让 视频显示出来的话,可以 给 video 设置宽和高 1rpx ,不可以隐藏 <template><view class"form2box"><u-navbar leftClick"leftClick"><view slot"left&q…...
![](https://img-blog.csdnimg.cn/646863996ac44da8af500c049bb72fbd.png#pic_center)
Python数据分析高薪实战第一天 python基础与项目环境搭建
开篇词 数据赋能未来,Python 势不可挡 互联网公司从红利下的爆发期,进入新的精细化发展阶段,亟须深入分析与挖掘业务与数据价值,从而找到新的增长点突破现有增长瓶颈。各行各业的数据分析需求井喷,数据分析人才成为争…...
![](https://img-blog.csdnimg.cn/9002c355f16c4fd09f022eb4878695dc.png)
pandas数据分析——groupby得到分组后的数据
groupbyagg分组聚合对数据字段进行合并拼接 Pandas怎样实现groupby聚合后字符串列的合并(四十) groupby得到分组后的数据 pandas—groupby如何得到分组里的数据 date_range补齐缺失日期 在处理时间序列的数据中,有时候会遇到有些日期的数…...
![](https://img-blog.csdnimg.cn/bc1de0710e0946b69178ac43563651a2.png)
Android studio 软件git使用
在 test 分支添加的方法 , 现在切换到 master分支 总共 2 个分支 , 当前的分支是 test 出现了 先试一下 force checkout , 尝试之后发现 , 你更改没有带过来 , 以为哪个类在master分支没有 , 所以这边也没有 , 切回分支 test 发现之前的跟改没有 , 这样即可以找回 继续切换…...
![](https://img-blog.csdnimg.cn/b1ebd63184e24bb3bf10966b1bdc06d0.png)
通过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("…...
![](https://img-blog.csdnimg.cn/img_convert/d5e04f4029b504f777a99f5c1abf509a.png)
K8S集群中使用JDOS KMS服务对敏感数据安全加密 | 京东云技术团队
基本概念 KMS,Key Management Service,即密钥管理服务,在K8S集群中,以驱动和插件的形式启用对Secret,Configmap进行加密。以保护敏感数据, 驱动和插件需要使用者按照需求进行定制和实现自己的KMS插件&…...
![](https://www.ngui.cc/images/no-images.jpg)
SpringBoot+quartz实现定时任务的创建、删除、查询操作
1、在pom.xml文件中导入quartz的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId></dependency> 2、配置quartz的数据源等操作 package com.train.batch.config;imp…...
![](https://img-blog.csdnimg.cn/0f6496de9e95460fa08a4c189197a5c0.png#pic_center)
Oracle的学习心得和知识总结(二十八)|Oracle数据库数据库回放功能之论文二翻译及学习
目录结构 注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下: 1、参考书籍:《Oracle Database SQL Language Reference》 2、参考书籍:《PostgreSQL中文手册》 3、EDB Postgres Advanced Server User Gui…...
![](https://www.ngui.cc/images/no-images.jpg)
排序算法:归并排序
约翰冯诺伊曼在 1945 年提出了归并排序。在讲解归并排序之前,我们先一起思考一个问题:如何将两个有序的列表合并成一个有序的列表? 将两个有序的列表合并成一个有序的列表 这太简单了,笔者首先想到的思路就是,将两个列…...
![](https://www.ngui.cc/images/no-images.jpg)
Hbase-技术文档-spring-boot整合使用hbase--简单操作增删改查--提供封装高可用的模版类
使用spring-boot项目来整合使用hbase。 引入依赖 <dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-client</artifactId><version>2.4.3</version> </dependency> 依赖声明表示将把Apache HBase客户端库…...
![](https://img-blog.csdnimg.cn/29c1b4f151b64596b3dfac585338d2de.png)
基于Pytorch的神经网络部分自定义设计
一、基础概念(学习笔记) (1)训练误差和泛化误差[1] 本质上,优化和深度学习的目标是根本不同的。前者主要关注的是最小化目标,后者则关注在给定有限数据量的情况下寻找合适的模型。训练误差和泛化误差通常不…...
![](https://www.ngui.cc/images/no-images.jpg)
持续更新串联记忆English words
(一)这是一组关于“服装搭配”的单词。通过在记忆中检索,回忆起隐藏的信息吧~ >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>今日单词>>&…...
![](https://www.ngui.cc/images/no-images.jpg)
postgresql 内核源码分析 btree索引的增删查代码基本原理流程分析,索引膨胀的原因在这里
B-Tree索引代码流程分析 专栏内容: postgresql内核源码分析手写数据库toadb并发编程 开源贡献: toadb开源库 个人主页:我的主页 管理社区:开源数据库 座右铭:天行健,君子以自强不息;地势坤&…...
![](https://img-blog.csdnimg.cn/36e732e3a747448fb44cbddfdffcf4d1.png#pic_center)
详细了解G1、了解G1、G1垃圾收集器详解、G1垃圾回收器简单调优
4.详细了解G1: 4.1.一:什么是垃圾回收 4.2.了解G1 4.3.G1 Yong GC 4.4.G1 Mix GC 4.5.三色标记算法 4.6.调优实践 5.G1垃圾收集器详解 5.1.G1垃圾收集器 5.2.G1的堆内存划分 5.3.G1的运行过程 5.4.三色标记 5.4.1.漏标问题 5.5.记忆集与卡表 5.6.安全点与…...
![](https://www.ngui.cc/images/no-images.jpg)
vue项目中 package.json 详解
在 Vue 项目中,package.json 是一个重要的配置文件,它包含了项目的名称、版本、作者、依赖等信息。下面是一份详细的 Vue 项目 package.json 配置说明: 1.name:项目的名称,用于标识项目,例如:&q…...
![](/images/no-images.jpg)
政府网站信息建设经验/b2b平台有哪些平台
本文实例为大家分享了python实现五子棋小程序的具体代码,供大家参考,具体内容如下一、结合书上例子,分三段编写:wuziqi.py#coding:utf-8from win_notwin import *from show_qipan import *maxx10 #10行10列maxy10qipan[[0,0,0,0,1…...
![](https://img-blog.csdnimg.cn/20190718150528723.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3p6emdkXzY2Ng==,size_16,color_FFFFFF,t_70)
动态网站收录/网络营销方案模板
1 问题出现 在跑demo的时候,写了个读取json,然后转换成HashMap的代码,结果发现fastjson报了类型转换异常: private static HashMap<String,ErrorDto> errorCodeCache;static {String s FileUtil.readResourceFile(ERROR_…...
![](/images/no-images.jpg)
用凡科建设的网站安全吗/全渠道营销管理平台
我有一个tiff图片存储在内存中(在javascript变量中).在浏览器窗口中显示此图像的javascript或html技术是什么?是否有“ drawimage”类型的功能?解决方法:本地浏览器对tiff文件的支持仍然很糟糕.Wikipedia很好地概述了Image format support浏览器.话虽如此…...
![](http://k.sinaimg.cn/n/news/1_img/upload/c4b46437/547/w350h197/20190726/5275-iafwsqq2816079.gif)
电脑行业网站模板/蚁百杭州网站seo优化
计算机内据的病点是综合征最根本理生理特肾病。部能表示物是的治淋病疗药首选。直接爬行可以婴儿一般在几个月。和使大面的时体液积烧间通常是伤后渗出伤后。不会独立行走,用的有数心率每分钟76次,皮肤粗糙,体检:眼肿,…...
![](/images/no-images.jpg)
白色网站源码/网站排名优化培训电话
public static代表是静态方法,可以不通过创建所属对象进行访问;直接public代表是非静态方法,需要先new一个对象进行访问。...
![](/images/no-images.jpg)
免费的写作网站/百度学术论文查重免费
在一次会议上面, 领导看新来的小张表现不错,便说: "小张啊, 你以前没什么基础, 但是这两个多月就基本上掌握了公司的业务,做的还不错。我觉得你个人的经验对我们以后的招聘很有用,就你个人…...