Kafka 基本概念

Kafka 基本概念

Kafka 是一个分布式的消息引擎系统,它的主要功能是提供一套完备的消息发布与订阅解决方案。

  • Topic

    在 Kafka 中,发布订阅的对象是主题(Topic),你可以为每个业务、每个应用甚至每类数据都创建专属的主题。是承载消息的逻辑容器,在实际使用中多用来区分具体的业务。

  • Producer

    向主题发布消息的客户端应用程序称为生产者(Producer),生产者程序通常持续不断地向一个或者多个主题发送消息

  • Consumer

    订阅主题消息的客户端应用程序被称为消费者(Consumer)。和生产者类似,消费者也能同时订阅多个主题的消息

  • Client

    生产者和消费者统称为客户端(Clients),你可以同时运行多个生产者和消费者实例,这些实例会不断地向 Kafka 集群中的多个主题生产和消费消息。

  • Broker

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

  • Replica

    实现高可用的另一个手段就是备份机制(Replication)。备份的思想很简单,就是把相同的数据拷贝到多台机器上,而这些相同的数据拷贝在 Kafka 中被称为副本(Replica)。副本的数量是可以配置的,这些副本保存着相同的数据,却有不同的角色和作用。

    Kafka 定义了两类副本:领导者副本(Leader Replica)和追随者副本(Follower Replica)。前者对外与客户端交互,而后者不能对外服务。

    副本的工作机制也很简单,生产者总是向领导者副本写消息,而消费者总是从领导者副本读消息。至于追随者副本,它只做一件事情:向领导者副本发送请求,请求领导者把最新生产的消息发送给它,这样它能保持与领导者的同步。

    为什么追随者副本不对外提供服务呢?

    1. Kafka 的分区(Partition)已经让读请求是从多个 Broker 读从而实现负载均衡
    2. 如果允许追随者对外提供服务,会存在数据一致性的问题,因为消息从主节点同步到从节点需要时间。
  • Partition

    Kafka 中的分区机制指的是将每个主题划分成多个分区(Partition),每个分区是一组有序的消息日志。生产者生产的每条消息只会发送到一个分区中。

    刚才提到的副本如何与这里的分区联系在一起呢?实际上,副本是在分区这个层级定义的。每个分区下可以配置若干个副本,其中只能有 1 个领导者副本和 N-1 个追随者副本。

    生产者向分区写入消息,每条消息在分区中的位置信息由 一个叫位移(Offset)的数据来表征。分区位移总是从 0 开始,假设一个生产者向一个空分区写入了 10 条消息,那么这 10 条消息的位移依次是 0、1、2、…、9。

    至此我们能够完整地串联起 Kafka 的三层消息架构:

    • 第一层是主题层,每个主题可以配置 M 个分区,而每个分区又可以配置 N 个副本。
    • 第二层是分区层,每个分区的 N 个副本中只能有一个充当领导者角色,对外提供服务; 其他 N-1 个副本是追随者副本,只是提供数据冗余之用。
    • 第三层是消息层,分区中包含若干条消息,每条消息的位移从 0 开始,依次递增。最后,客户端程序只能与分区的领导者副本进行交互。
  • 持久化

    Kafka 使用消息日志来保持数据,一个日志就是磁盘上一个只能追加写(Appen-only)消息的物理文件。因为只能追加写入,避免了缓慢的随机 I/O 操作,改为性能较好的顺序 I/O 写操作,这也是 Kafka 实现高吞吐量特性的一个重要手段。

    不过如果不停地追加写日志,最终也会耗尽所有的磁盘空间,因此 Kafka 会定期地删除消息以回收磁盘。简单来说就是通过日志段(Log Segment)机制。在 Kafka 底层,一个日志又进一步细分为多个日志段,消息被追加写到当前日志段中,当写满了一个日志段后,Kafka 会自动切分出一个新的日志段,并将老的日志段封存起来。Kafka 在后台还有定时任务会定期地检查老的日志段是否能够删除,从而回收磁盘空间。

  • 消费者组

    Kafka 支持两种消息模型:点对点模型(Peer to Peer,P2P)和发布订阅模型。

    点对点模型指的是同一条消息只能被下游的一个消费者消费,其他消费者不能消费。Kafka 中实现这种 P2P 模型方法就是引入了消费者组(Consumer Group)。

    所谓的消费者组,指的是多个消费者实例共同组成一个组来消费一组主题。这组主题中的每个分区都只会被组内的一个消费者实例消费,其他消费者实例不能消费它。

    为什么要引入消费者组呢?主要是为了提升消费者段的吞吐量,多个消费者同时消费,加速整个消费段的吞吐量(TPS)。

    消费者组里面的所有消费者不仅瓜分订阅主题的消息,而且它们还能彼此协助。假设组内的某个实例挂了,Kafka 能自动检测到,然后把这个 Failed 的实例之前负责的分区转移给其他存活的消费者,这个过程也就是 Kafka 大名鼎鼎的 “重平衡” (Rebalance)。

    每个消费者在消费消息的过程中必然需要有个字段记录它当前消费到了分区的哪个位置上,这个字段就是消费者位移(Consumer Offset)。注意,这和上面所说的位移完全不是一个概念。上面的“位移”表征的是分区内的消息位置,它是不变的,即一旦消息被成功写入到一个分区上,它的位移值就是固定的了。而消费者位移则不同,它可能是随时变化的,毕竟它是消费者消费进度的指示器嘛。另外每个消费者有着自己的消费者位移,因此一定要区分这两类位移的区别。我个人把消息在分区中的位移称为分区位移,而把消费者端的位移称为消费者位移。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q3ZEhyBA-1608021237864)(https://i.loli.net/2020/12/15/6spgqamJi2WFntI.pn#pic_center)]

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值