kafka 不支持读写分离的原因

2023-10-29

前段时间在看 kafka 相关内容,发现 kafka “所有的”读写流量都在主 partition 上,从 partition 只负责备份数据。

那么为什么 kafka 从 partition 不跟其他中间件一样承接读流量?

读写分离的初衷

读写分离的初衷我觉得是利用读流量 & 写流量不同的特性做针对性的优化,而这两种流量我觉得区别如下

读流量 写流量
业务特性 展示类的业务 操作类业务
流量占比
可接受数据延迟 较大 非常小
增长的可预见性 高峰/安全攻击可能会突发增长 总体平稳

使用 kafka 的业务特征

  1. 操作型业务,consumer 消费 producer 生产的消息,进行自身业务,这个消息就类似于 trigger
  2. 可支撑的流量较大,并且可支撑下游 consumer 较多,rebalance 需要一定的时间

kafka 架构

  1. 以 topic 为单位,一 topic 可拆分多个 partition,每个 partition 都可以有多个从 partition,不同 partition 分布在不同 broker 上
  2. 以 partition 为单位,形成 AR(Assigned Repllicas),ISR(In Sync Repllicas),OSR(Out Sync Repllicas),主 partition 接收到消息后按照 ack 策略同步到 ISR 中从 partition
    1. ack = 0,producer 发出消息后就不管了
    2. ack = 1,producer 发出消息写入主 partition 所在 broker 的磁盘就算成功
    3. ack = all,producer 发出消息写入主 partition 以及 ISR 上所有副 partition 的磁盘才算成功

kafka 没有主从读写分离的原因

  1. 不能主从读写分离的原因
    1. kafka 承接的大多是操作型业务,这部分读操作对数据延迟非常敏感。
    2. kafka 主从同步为半同步复制,并且有部分 partition 在 OSR 上,数据延迟较大
    3. kafka 主 partition 接收到消息后,可以根据 ack 策略落盘,如果不是 all 的话存在数据丢失的风险
  2. 不需要主从读写分离的原因
    1. kafka 本身就是多 partition 的架构,不同 parition 在不同的 broker 上,多主节点的结构本身分流了流量
    2. kafka 本身就有成熟的 rebalance 机制,partition 上线与下线都比较无感

本文首发于cartoon的博客

转载请注明出处:https://cartoonyu.github.io

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

kafka 不支持读写分离的原因 的相关文章

  • 如何在 IDEA Intellij 上使用 Spring-boot 自动重新加载

    我写了一个基于Spring boot tomcat freemarker的项目 我运行成功 但是每当我修改一些模板和java类时 我必须重新启动服务器或使用Intellij上的 重新加载更改的类 菜单才能使更改生效 浪费很多时间 然后我尝试
  • 从文本文件中读取阿拉伯字符

    我完成了一个项目 在该项目中我读取了用记事本编写的文本文件 我的文本文件中的字符是阿拉伯语 文件编码类型是UTF 8 当在 Netbeans 7 0 1 中启动我的项目时 一切似乎都正常 但是当我将项目构建为 jar 文件时 字符以这种方式
  • 将 MouseListener 添加到面板

    我正在尝试将鼠标操作添加到我的面板中 这就是程序应该做的事情 编写一个程序 允许用户通过按三下鼠标来指定一个三角形 第一次按下鼠标后 画一个小点 第二次按下鼠标后 绘制一条连接前两个点的线 第三次按下鼠标后 绘制整个三角形 第四次按下鼠标会
  • 在 Java 中使用 Batik 检查和删除 SVG 中的属性

    这个问题基本上说明了一切 如何检查 SVG 是否具有 viewBox 属性 我正在使用蜡染库 我需要这个 因为我需要 至少 通知用户有一个 viewBox 属性 我可以删除它吗 使用 org w3c dom 类 您可以按照以下方式做一些事情
  • 如何在url请求中发送数组

    我的要求如下 我想给出演员姓名 开始日期 结束日期并获取他在该时期出演的所有电影 因此 我的服务请求是这样的 http localhost 8080 MovieDB GetJson name Actor startDate 20120101
  • 重写 getPreferredSize() 会破坏 LSP

    我总是在这个压倒一切的网站上看到建议getPreferredSize 而不是使用setPreferredSize 例如 如前面的线程所示 对于固定大小的组件 使用重写 getPreferredSize 而不是使用 setPreferredS
  • Spring中的ProxyFactoryBean

    有人可以解释一下吗代理工厂Bean http static springsource org spring docs current javadoc api org springframework aop framework ProxyFa
  • 本地开发的 Azure Functions 扩展包版本问题

    我有一个带有队列触发器的 Java 11 Azure 函数 该函数在部署到 Azure 时按预期工作 并正确从定义的服务总线主题中提取消息 但是 运行相同的功能locally除非我回滚版本 否则不起作用Azure Functions 绑定扩
  • 这个等待通知线程语义的真正目的是什么?

    我刚刚遇到一些代码 它使用等待通知构造通过其其他成员方法与类中定义的线程进行通信 有趣的是 获取锁后 同步范围内的所有线程都会在同一锁上进行定时等待 请参见下面的代码片段 随后 在非同步作用域中 线程执行其关键函数 即 做一些有用的事情1
  • 无法在 Java 中输出正确的哈希值。怎么了?

    在我的 Android 应用程序中 我有一个 SHA256 哈希值 我必须使用 RIPEMD160 消息摘要算法进一步对其进行哈希值 我可以输出任何字符串的正确 sha256 和ripemd160 哈希值 但是当我尝试使用ripemd160
  • 如何在 JPA 和 Hibernate 中将数据库生成的列值定义为只读字段?

    使用 MariaDB 10 2 可以定义日期时间的默认值 例如创建和最后修改 我应该如何将此列作为只读字段访问 因为这个值应该只在数据库的控制之下 并且不应该从代码中修改 但我想在代码中读取这个属性 这很简单 只需设置insertable
  • 如何在不反编译的情况下更改已编译的.class文件?

    我想更改 class 文件方法 我安装 JD Eclipse Decompiler 并打开 class 文件 我添加了一些代码并保存 class 文件 但是 class 文件没有改变 我不知道如何使用反编译器 如果可能的话 如何在不使用反编
  • 如何从intellij项目视图中隐藏不必要的文件?

    给定一个示例 gradle 项目 其项目结构如下所示 正如你所看到的 有很多东西你实际上不需要在想法中看到 但你需要它们存在 我知道下面被忽略的文件 文件夹类型Editor File Types但这些正在影响库和项目 idea 会在各处忽略
  • 如何减去两个 XmlGregorianCalendar 对象来创建一个 Duration 对象?

    我想计算两个时间之间的差值XmlGregorianCalendar对象 从而创建一个Duration object 但我还没有找到执行减法的干净方法 你会怎么做 那应该是 DatatypeFactory newDuration xgc2 t
  • 如何在 O(n) 时间内根据 Map 中的整数值相对于其他值随机选择一个键?

    如果我们有一个Map
  • javax.media.jai 类的公共下载?

    这是一个非常简单的问题 我一直在寻找可以下载 javax media jai 库的地方 我找到了 jai imageio 库 但是我发现的所有其他 jai 内容要么已经过时 2008 年及之前 然后我遇到了登录屏幕 是否有 javax me
  • java中使用多线程调用同一类的不同方法

    我有一个类 如下所示 具有三种方法 public class MyRunnable implements Runnable Override public void run what code need to write here to c
  • Android UnityPlayerActivity 操作栏

    我正在构建一个 Android 应用程序 其中包含 Unity 3d 交互体验 我已将 Unity 项目导入 Android Studio 但启动时该 Activity 是全屏的 并且不显示 Android 操作栏 我怎样才能做到这一点 整
  • 如何建立与 FileZilla Server 1.2.0 的 FTPS 数据连接

    使用 Apache commons net 的 Java FTPSClient 进行会话恢复是一个已知问题 会话恢复是 FTPS 服务器数据连接所需的一项安全功能 Apache FTPSClient 不支持会话恢复 并且 JDK API 使
  • mybatis:使用带有 XML 配置的映射器接口作为全局参数

    我喜欢使用 XML 表示法来指定全局参数 例如连接字符串 我也喜欢 Mapper 注释 当我尝试将两者结合起来时 我得到这个例外 https stackoverflow com questions 4263832 type interfac

随机推荐

  • PHP 常用的设计模式跟使用场景

    策略模式 把类中可能改变的方法用成员属性替换 属性是实现对应方法接口的类 本来直接调用类方法 修改后就是调用成员属性类的方法 这样可以在运行时给类设置不同的成员属性达到动态改变调用的方法 使用 Model 类 持有 Query 类 通过调用
  • Android 项目调用第三方库so动态库

    在Android NDK开发中 可以通过自己编写C C 代码来构建so动态库进行调用之外 还可以把so动态库提供给第三方使用 接下来 我将介绍在新创建的Android 项目 或已存在的Android 项目 中如何调用第三方so动态库 关于如
  • ChatGPT的原理与前端领域实践

    一 ChatGPT 简介 ChatGPT的火爆 ChatGPT作为一个web应用 自22年12月发布 仅仅不到3个月的时间 月活用户就累积到1亿 在此之前 最快记录的保持者也需要9个月才达到月活1亿 ChatGPT的反爬 https cha
  • 02-react组件基础-函数组件-类组件(有状态和无状态组件)-事件处理(this指向)-setState修改状态-表单处理(受控组件和非受控组件)-案例

    学习目标 能够使用函数创建组件 函数组件 能够掌握class语法 extends继承 能够使用class创建组件 类组件 能够给React元素绑定事件 能够使用state与setState 能够处理事件中this的指向问题 能够使用受控组件
  • mysql,oracle,sqlserver之表备份

    mysql表备份 1 只复制表结构到新表 只有结构无数据 create table 新表 select from 旧表 where1 2 或create table 新表 like 旧表 此两种方法的区别 使用第一条语句 备份的新表并没有旧
  • C++之共享智能指针shared_ptr的实现

    目录 概念 使用标准库共享智能指针 共享智能指针底层实现 概念 共享指针是可以 由多个栈上智能指针对象 同时托管同一堆上资源的 因为shared ptr的内部实现引用计数来管理有多少智能指针指向了这块堆上资源 当一个共享智能指针出栈时 引用
  • 人脸建模1

    宝宝 把眼睛球体控制器和簇点的translate属性关联之后 选中眼睛一圈隔一个选一个面 给上nhair毛囊 删除结算器等 只留图中鼠标所在位置 毛囊分别对对应位置控制器父子约束 所有控制器做好之后一定要冻结 舌头控制器前面的组p给后面的盒
  • 二、C++语言进阶:动态库与静态库之函数篇

    2 动态库与静态库之函数篇 作用 分离编译 代码重用 分类 分类 作用 后缀 静态库 一个或多个 o目标文件归档在一个文件中 a 共享库 没有main函数的可执行文件 so 动态加载库 没有main函数的可执行文件 接口复合API so 2
  • 让树叶摇动起来

    Shader XW Tree TreeLeaf Simple Properties Color Main Color Color 1 1 1 1 clipAlpha clip Alpha Range 0 1 0 5 MainTex Base
  • Nginx 服务器

    简介 Nginx 是一款HTTP和反向代理服务器 它的内存占用少 能够支持高达五万个并发连接响应 其主要有三个功能 反向代理 负载均衡 反向代理 正向代理 就相当于 VPN 当你想要访问一个服务器但是由于某种原因不能直接访问时 可以去访问一
  • 如何使用 Vagrant 命令行工具创建和管理虚拟机

    创建和管理虚拟机曾经是一个乏味且耗时的过程 在不同的服务器上复制虚拟机也可能具有挑战性 如果必须复制多个虚拟机 情况会变得更加困难 但后来 Vagrant 出现了 它是一种通常与2 类虚拟机管理程序配合使用的命令行或 shell 工具 你可
  • QT从入门到实战x篇_06_信号和槽2:自定义信号和槽函数的创建及使用

    接上文 QT从入门到实战x篇 xx 信号和槽1 Qt中自带的信号和槽函数的使用方法本文主要介绍如何根据自身的功能需要 创建和使用自定义信号及槽函数 先写出一个功能需求 下课后 老师触发信号 饿了 学生响应信号 请客吃饭 1 建立老师类和学生
  • jquery ztree实现下拉树形框,json数据

    公司最近的项目需要用到树形下拉框 在网上找了挺多源码 最后还是采用了zTree来实现 因为代码的移植性比较高 而且数据的获取比较容易 废话不多说 直接上代码 index jsp
  • 轻量应用服务器腾讯云和阿里云哪家更好?

    轻量应用服务器阿里云和腾讯云哪个好 云服务器吧认为腾讯云轻量应用服务器还不错 腾讯云轻量服务器30元起 配置可选2核2G3M 2核2G4M 2核4G5M 4核8G12M 8核16G18M和16核32G28M 阿里云轻量应用服务器配置仅可以选
  • C语言函数大全-- w 开头的函数(1)

    w 开头的函数 1 1 wcscat 1 1 函数说明 1 2 演示示例 1 3 运行结果 2 wcschr 2 1 函数说明 2 2 演示示例 2 3 运行结果 3 wcscmp 3 1 函数说明 3 2 演示示例 3 3 运行结果 4
  • AHB接口总线仲裁1主多从细节。关于hready in和hready out信号的理解

    所有slaver 只要有1个hready out等于0 表示slaver没有准备好执行此拍操作 这时 所有slaver都不能执行此拍操作 以防止1主多从的AHB接口协议问题 所有slaver的hreadyout 需要与之后 提供给所有sla
  • linux下c++操作MySQL

    第一步 先在Linux中安装MySQL 第二步 在安装连接器 中端命令 sudo apt get install libmysqlclient dev 第三步写一个操作MySQL的c 代码保存退出 include
  • allegro如何对差分对单根网络进行等长调节

    选中要调整的差分线 再点击左栏的快捷按钮 此时options会弹出相关的调整s参数 设置好差分线参数 鼠标放在刚才选中的线上拉出一个方框 方框内就会显示线的形状变化 再次点击鼠标后 就会把线绘制成曲线形状 蛇形走线 在这里注意 如果调整走线
  • Redis缓存穿透, 击穿, 雪崩

    缓存穿透 缓存穿透是指用户想要查询一个数据 发现redis内存中没有 也就是没有缓存命中 于是向持久层数据库查询 发现也没有 于是本次查询失败 当用户很多的时候 缓存中都没有 于是都去请求持久层数据库 这会给持久层数据库造成很大压力 这就是
  • kafka 不支持读写分离的原因

    前段时间在看 kafka 相关内容 发现 kafka 所有的 读写流量都在主 partition 上 从 partition 只负责备份数据 那么为什么 kafka 从 partition 不跟其他中间件一样承接读流量 读写分离的初衷 读写