草庐IT

kafka基本知识之术语、分区策略与消息确认机制

好久啦 2023-09-24 原文

文章目录

kafka 基本知识

一、基本术语

  • 消息:Record,是 Kafka 处理的主要对象
  • 消息位移:Offset,对应分区中每条消息的位置信息,是一个单调递增且不变的值
  • 主题:Topic,是承载消息的逻辑容器;实际使用中多用来区分具体的业务,不同topic即为不同业务
  • 生产者:Producer,发布消息
  • 消费者:Consumer,订阅主题消息;多个消费者实例共同组成Consumer Group消费者组,消费者组里面的所有消费者实例不仅“瓜分”订阅主题的数据,还能彼此协助。假设组内某个实例挂掉了,Kafka 能够自动检测到,然后把这个 Failed 实例之前负责的分区转移给其他活着的消费者
  • 消费者位移:Consumer Offset,用于表示消费者的消费进度,每个消费者都有自己的消费者位移

二、从结构上理解kafka的高可用手段

  • 消费者和生产者都是kafka的客户端,Kafka 的服务器端是由被称为 Broker 的服务进程构成,即一个 Kafka 集群由多个 Broker 组成。

  • Broker 负责接收和处理客户端发送过来的请求,以及对消息进行持久化。虽然多个 Broker 进程能够运行在同一台机器上,但更常见的做法是将不同的 Broker 分散运行在不同的机器上,这样如果集群中某一台机器宕机,即使在它上面运行的所有 Broker 进程都挂掉了,其他机器上的 Broker 也依然能够对外提供服务。这就是 Kafka 提供高可用的手段之一

  • 备份机制(Replication),就是把相同的数据拷贝到多台broker机器上,而这些相同的数据拷贝在 Kafka 中被称为副本(Replica)副本被分类为领导者副本(Leader Replica)追随者副本(Follower Replica)

    • 前者对外提供服务,生产者总是向领导者副本写消息;而消费者总是从领导者副本读消息;
    • 后者只是被动地追随领导者副本而已,不能与外界进行交互,它只做一件事:向领导者副本发送请求,请求领导者把最新生产的消息发给它,这样它能保持与领导者的同步
  • 领导者副本是唯一对外的副本,那么可能就存在单台broker都无法容纳,kafka有分区的概念,即每个主题划分为多个分区,每个分区是一组有序的消息日志;副本是分区的层级下定义的,每个分区可以配置若干个副本分区,也就是说实际上从broker层级上看,生产者向分区写入消息,消费者从分区读取消息

    • 其中kafka源码中会对副本数进行参数检查要满足大于0且小于等于broker数量,以保证副本平均分布在不同的broker上;每个不同的领导者副本尽可能分布在不同的broker去实现各个broker负载均衡

可以通过下图对kafka整体有更形象的认知:

注:图片来源于网络

三、分区策略

分区策略其实就是决定生产者将消息发送到哪个分区的算法
java api中如果指定了partition就直接发送到该分区;如果没有指定分区但是指定了key,就按照key的hash值选择分区;如果partition和key都没有指定就使用轮询策略

  • 轮询策略
    默认策略,即将数据按顺序分配地发送到每个分区,比如一个主题下有 3 个分区,那么第一条消息被发送到分区 0,第二条被发送到分区 1,第三条被发送到分区 2,以此类推
  • 随机策略
    将消息放置到任意一个分区上,类似于random.nextInt()去获得一个小于总分区数的值,该值即为要发送的分区
  • 自定义策略
    通过编写一个具体实现类且配置生产者端参数partitioner.class即可,主要需要实现partition方法

四、消息确认机制

生产者发送消息的确认机制,通过配置生产者acks实现

  • acks = 0:生产者根本不会等待服务器的任何确认。消息将立即添加到套接字缓冲区并视为已发送。这种情况下不能保证服务器已经收到消息,为每条记录返回的偏移量将始终设置为-1
  • acks = 1:领导者副本会将消息写入其本地日志,并在不等待所有追随者完全确认同步到消息的情况下做出响应。如果领导者在确认消息后但在追随者复制它之前立即失败,消息将丢失
  • acks = all / acks = -1 :领导者将等待副本同步队列的所有副本确认收到消息。这保证只要至少一个同步副本保持活动状态,消息就不会丢失
  • 默认设置为all

副本同步队列ISR(In-Sync Replicas):每个分区的leader负责维护和跟踪ISR中所有follower滞后的状态。当producer发送一条消息到broker后,leader写入消息并复制到ISR中所有follower。消息复制延迟受最慢的follower限制,重要的是快速检测慢副本,如果follower“落后”太多或者失效,leader将会把它从ISR中删除。所有的副本统称为Assigned Replicas,ISR是它的一个子集,follower从leader同步数据有一些延迟时间,任意一个超过阈值replica.lag.time.max.ms都会把follower剔除出ISR

小思考:

kafka的副本机制为什么不像MySQL那样允许追随者副本也对外提供读服务

1、MySQL从库提供读服务,实现了读负载,减轻主库的读压力;而kafka的broker以及分区分配规则已经实现了多台broker的负载均衡
2、kafka保存的数据和数据库数据实质的区别就是kafka数据具有消费的概念,消费需要位移,而数据库是实体数据不存在这个概念,如果从kafka的follower读,消费者offset控制将会更复杂
3、如果从follower读,就要确保领导者收到生产者的消息之后,follower也必须同步数据才不会造成副本间数据的不一致性,按照kafka设置的消息确认机制,那就必须需要等所有的追随者副本数据同步之后才是真正的消息确认,可能比acks = all的情况还需要更长的时间

有关kafka基本知识之术语、分区策略与消息确认机制的更多相关文章

  1. Ruby rpartition 与分区? - 2

    rpartition和partition有什么区别?我已经阅读了文档,但我认为它们是一样的。只是那些出现在后来的ruby​​版本中吗? 最佳答案 以下示例将有助于识别差异:"abccba".partition("b")#=>["a","b","ccba"]"abccba".rpartition("b")#=>["abcc","b","a"]所以区别在于rpartition搜索最右边的匹配项,而不是最左边的匹配项。 关于Rubyrpartition与分区?,我们在StackOverflow

  2. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

    我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

  3. ruby - 使用 Ruby 通过 Outlook 发送消息的最简单方法是什么? - 2

    我的工作要求我为某些测试自动生成电子邮件。我一直在四处寻找,但未能找到可以快速实现的合理解决方案。它需要在outlook而不是其他邮件服务器中,因为我们有一些奇怪的身份验证规则,我们需要保存草稿而不是仅仅发送邮件的选项。显然win32ole可以做到这一点,但我找不到任何相当简单的例子。 最佳答案 假设存储了Outlook凭据并且您设置为自动登录到Outlook,WIN32OLE可以很好地完成此操作:require'win32ole'outlook=WIN32OLE.new('Outlook.Application')message=

  4. Ruby - 如何将消息长度表示为 2 个二进制字节 - 2

    我正在使用Ruby,我正在与一个网络端点通信,该端点在发送消息本身之前需要格式化“header”。header中的第一个字段必须是消息长度,它被定义为网络字节顺序中的2二进制字节消息长度。比如我的消息长度是1024。如何将1024表示为二进制双字节? 最佳答案 Ruby(以及Perl和Python等)中字节整理的标准工具是pack和unpack。ruby的packisinArray.您的长度应该是两个字节长,并且按网络字节顺序排列,这听起来像是n格式说明符的工作:n|Integer|16-bitunsigned,network(bi

  5. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  6. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  7. ruby-on-rails - 在 Flash 警报 Rails 3 中显示错误消息 - 2

    如果我在模型中设置验证消息validates:name,:presence=>{:message=>'Thenamecantbeblank.'}我如何让该消息显示在闪光警报中,这是我迄今为止尝试过的方法defcreate@message=Message.new(params[:message])if@message.valid?ContactMailer.send_mail(@message).deliverredirect_to(root_path,:notice=>"Thanksforyourmessage,Iwillbeintouchsoon")elseflash[:error]

  8. ruby-on-rails - 使用 HTTParty 的非常基本的 Rails 4.1 API 调用 - 2

    Rails相对较新。我正在尝试调用一个API,它应该向我返回一个唯一的URL。我的应用程序中捆绑了HTTParty。我已经创建了一个UniqueNumberController,并且我已经阅读了几个HTTParty指南,直到我想要什么,但也许我只是有点迷路,真的不知道该怎么做。基本上,我需要做的就是调用API,获取它返回的URL,然后将该URL插入到用户的数据库中。谁能给我指出正确的方向或与我分享一些代码? 最佳答案 假设API为JSON格式并返回如下数据:{"url":"http://example.com/unique-url"

  9. ruby-on-rails - 在 RSpec 中,如何以任意顺序期望具有不同参数的多条消息? - 2

    RSpec似乎按顺序匹配方法接收的消息。我不确定如何使以下代码工作:allow(a).toreceive(:f)expect(a).toreceive(:f).with(2)a.f(1)a.f(2)a.f(3)我问的原因是a.f的一些调用是由我的代码的上层控制的,所以我不能对这些方法调用添加期望。 最佳答案 RSpecspy是测试这种情况的一种方式。要监视一个方法,用allowstub,除了方法名称之外没有任何约束,调用该方法,然后expect确切的方法调用。例如:allow(a).toreceive(:f)a.f(2)a.f(1)

  10. ruby-on-rails - 设计注册确认 - 2

    我在我的项目中有一个用户和一个管理员角色。我使用Devise创建了身份验证。在我的管理员角色中,我没有任何确认。在我的用户模型中,我有以下内容:devise:database_authenticatable,:confirmable,:recoverable,:rememberable,:trackable,:validatable,:timeoutable,:registerable#Setupaccessible(orprotected)attributesforyourmodelattr_accessible:email,:username,:prename,:surname,:

随机推荐