一文理解Kafka如何保证消息顺序性

2023-11-08

要想实现消息有序,需要从Producer和Consumer两方面来考虑。

如果对Kafka不了解的话,可以先看这篇博客《一文快速了解Kafka》。

针对消息有序的业务需求,还分为全局有序和局部有序。

  • 全局有序:一个Topic下的所有消息都需要按照生产顺序消费。

  • 局部有序:一个Topic下的消息,只需要满足同一业务字段的要按照生产顺序消费。例如:Topic消息是订单的流水表,包含订单orderId,业务要求同一个orderId的消息需要按照生产顺序进行消费。

全局有序

由于Kafka的一个Topic可以分为了多个Partition,Producer发送消息的时候,是分散在不同 Partition的。当Producer按顺序发消息给Broker,但进入Kafka之后,这些消息就不一定进到哪个Partition,会导致顺序是乱的。

因此要满足全局有序,需要1个Topic只能对应1个Partition。

而且对应的consumer也要使用单线程或者保证消费顺序的线程模型,否则会出现下图所示,消费端造成的消费乱序。

局部有序

要满足局部有序,只需要在发消息的时候指定Partition Key,Kafka对其进行Hash计算,根据计算结果决定放入哪个Partition。这样Partition Key相同的消息会放在同一个Partition。此时,Partition的数量仍然可以设置多个,提升Topic的整体吞吐量。

如下图所示,在不增加partition数量的情况下想提高消费速度,可以考虑再次hash唯一标识(例如订单orderId)到不同的线程上,多个消费者线程并发处理消息(依旧可以保证局部有序)。

消息重试对顺序消息的影响

对于一个有着先后顺序的消息A、B,正常情况下应该是A先发送完成后再发送B,但是在异常情况下,在A发送失败的情况下,B发送成功,而A由于重试机制在B发送完成之后重试发送成功了。这时对于本身顺序为AB的消息顺序变成了BA。

针对这种问题,严格的顺序消费还需要max.in.flight.requests.per.connection参数的支持。

该参数指定了生产者在收到服务器响应之前可以发送多少个消息。它的值越高,就会占用越多的内存,同时也会提升吞吐量。把它设为1就可以保证消息是按照发送的顺序写入服务器的。

此外,对于某些业务场景,设置max.in.flight.requests.per.connection=1会严重降低吞吐量,如果放弃使用这种同步重试机制,则可以考虑在消费端增加失败标记的记录,然后用定时任务轮询去重试这些失败的消息并做好监控报警。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一文理解Kafka如何保证消息顺序性 的相关文章

随机推荐

  • Java超过long型范围时使用的BigInteger和BigDecimal

    文章目录 前言 一 BigInteger 二 BigDecimal 前言 Java中当一个数的超过long型范围 能够表示64位的整数 时可以使用BigInteger和BigDecimal类型 一 BigInteger 推荐使用BigInt
  • 地震数据剖面图-matlab

    这里主要有四个参数需要设置 wigb m地震数据画图函数下载地址 a seismic data 地震数据 scale multiple data by scale 扫描频率 1 3 范围内任选一个数字 x x axis 所有道的位置信息 z
  • Java集合相关的常用工具类简介说明

    转自 Java集合相关的常用工具类简介说明 下文笔者将讲述java集合类中常用的工具类简介说明 如下所示 Java中的集合类既可以当做放其他数据的容器 又可以当做常见的数据结构使用 Java中提供了很多好用的工具类来操作这些集合类 java
  • 贪心 算法

    本文目录 1 部分背包问题 2 乘船问题 3 区间调度问题 4 区间覆盖问题 5 区间选点问题 6 小船过河 往返问题 7 硬币支付问题 8 字典序最小问题 9 最优装载问题 1 部分背包问题 问题描述 有n个物体 第i个物体的重量为wi
  • 文件exer1的访问权限为rw-r--r--,现要增加所有用户的执行权限和同组用户的写权限,下列哪个命令是对的?

    文件exer1的访问权限为rw r r 现要增加所有用户的执行权限和同组用户的写权限 下列哪个命令是对的 正确答案 A 你的答案 C 错误 chmod a x g w exer1
  • 微信小程序实现瀑布流展示

    在现代互联网时代 瀑布流展示方式越来越受到人们的青睐 其可以将海量的图片 商品等展示在界面上 不同大小的内容通过某种规律美观 有序地布局在网页或应用程序上 极大地提升了内容的呈现方式和用户体验 微信小程序在展示图片和商品等方面也可以采用瀑布
  • Java将Word转换成PDF

    最近项目需要做在线预览文档功能 要求对word文档后台转为pdf 遇到了很多问题 因此记录一下 网上有很多将Word转换成PDF的方式 这里我试了几种比较简单的方式 POI aspose spire和documents4j 1 POI PO
  • Mac OS : 源码安装nginx (不需homebrew)

    下载 nginx http nginx org download nginx 1 19 10 tar gz 解压到 usr local 下载 pcre https ftp pcre org pub pcre pcre 8 44 tar gz
  • 数据属性的类型

    数据属性的类型 原文 https blog csdn net qq 33457248 article details 79594782 数据集由数据对象组成 一个数据对象代表一个实体 数据对象又称样本 实例 数据点或对象 属性 attrib
  • 数据结构——链表练习题

    题目一 思路 双指针 当listA和listB其中一个位空时 两个列表就不存在相交 返回NULL 当listA和listB都不为空链表时 指针phead1和phead2同时分别遍历listA和listB 遍历完后 再去分别遍历listB和l
  • c++运算符优先级归纳

    C 一共有 18个优先级 运算中按优先级进行性计算 当优先级相同时 根据结合性规则来决定 结合性 1 从左到右 L R 操作数和操作符结合的顺序大部分是从左到右结合性的 例如 单独的算术运算符 2 从右到左 R L 最典型的是赋值运算符 当
  • lecture 8:OLS回归模型

    先学习这个资料 OLS自编算法 不调用函数 重要的英文参考资料 Using Python for Introductory Econometrics kevinsheppard讲授Python做计量 相关分析 1 相关系数的计算公式 r x
  • Java核心技术 卷Ι 1~2)Java 的基本程序设计结构、类和对象

    文章目录 一 Java 的基本程序设计结构 1 强制类型转换 2 检测字符串是否相等 二 类和对象 一 Java 的基本程序设计结构 1 强制类型转换 double x 9 99987 int i int x System out prin
  • 跟着代码随想录练算法——二叉树(JS)(下)

    跟着代码随想录练算法 二叉树 106 从中序与后序遍历序列构造二叉树 https leetcode cn problems construct binary tree from inorder and postorder traversal
  • HttpClient进行timeout设置及存活机制设置

    package com example demo config import lombok Data import org springframework boot context properties ConfigurationPrope
  • docker学习记录--使用Xshell连接docker上的Centos镜像

    1 下载docker https download docker com win stable Docker 20Desktop 20Installer exe 2 安装选择默认 3 配置以下国内镜像 registry mirrors ht
  • POJ 2456 疯牛(二分+贪心)

    疯牛 时间限制 1000 ms 内存限制 65535 KB 难度 4 描述 农夫 John 建造了一座很长的畜栏 它包括N 2 lt N lt 100 000 个隔间 这些小隔间依次编号为x1 xN 0 lt xi lt 1 000 000
  • 过拟合产生的原因和解决方案

    最近在研究室内定位的问题 总是过拟合 之前研究问题太过草率 这次计划将问题彻底的研究明白 过拟合 简单来说就是在训练集表现好 在测试集 验证集 表现差 从表现来看可以理解成模型复杂也好 还是你的数据有问题也好 总之最后模型学习到了你现在数据
  • vue 数组按时间排序

  • 一文理解Kafka如何保证消息顺序性

    要想实现消息有序 需要从Producer和Consumer两方面来考虑 如果对Kafka不了解的话 可以先看这篇博客 一文快速了解Kafka 针对消息有序的业务需求 还分为全局有序和局部有序 全局有序 一个Topic下的所有消息都需要按照生