消息队列Kafka | 字节青训营

108 阅读6分钟

Kafka介绍

Kafka是一个高吞吐量的分布式发布-订阅消息系统,由Apache软件基金会开发。Kafka具有高性能、可扩展、持久化、可靠性等特点,适用于大规模的数据处理、日志收集、消息推送等场景。

Kafka中重要的组件

1)Producer:消息生产者,发布消息到Kafka集群的终端或服务

2)Broker:一个 Kafka 节点就是一个 Broker,多个Broker可组成一个Kafka 集群。集群由多个 Broker 组成,Broker 负责接收和处理客户端发送过来的请求,以及对消息进行持久化

如果某个 Topic 下有 n 个Partition 且集群有 n 个Broker,那么每个 Broker会存储该 Topic 下的一个 Partition

如果某个 Topic 下有 n 个Partition 且集群中有 m+n 个Broker,那么只有 n 个Broker会存储该Topic下的一个 Partition

如果某个 Topic 下有 n 个Partition 且集群中的Broker数量小于 n,那么一个 Broker 会存储该 Topic 下的一个或多个 Partition,这种情况尽量避免,会导致集群数据不均衡

3)Topic:消息主题,每条发布到Kafka集群的消息都会归集于此,Kafka是面向Topic 的

4)Partition:Partition 是Topic在物理上的分区,一个Topic可以分为多个Partition,每个Partition是一个有序的不可变的记录序列。单一主题中的分区有序,但无法保证主题中所有分区的消息有序。

5)Consumer:从Kafka集群中消费消息的终端或服务

6)Consumer Group:每个Consumer都属于一个Consumer Group,每条消息只能被Consumer Group中的一个Consumer消费,但可以被多个Consumer Group消费。如果所有实例都属于同一个 Group, 那么它实现的就是消息队列模型;如果所有实例分别属于不 同的 Group,那么它实现的就是发布/订阅模型

7)Replica:Partition 的副本,用来保障Partition的高可用性。定义了两类副本:领导者副本和追随者副本。前者对外提供服务,这里的对外指的是与 客户端程序进行交互;而后者只是被动地追随领导者副本而已,不能与外界进行交互

8)Controller: Kafka 集群中的其中一个服务器,用来进行Leader election以及各种 Failover 操作。

9)Zookeeper:Kafka 通过Zookeeper来存储集群中的 元数据

10)Coordinator:协调者。所谓协调者,它专门为Consumer Group服务,负责为Group执行Rebalance以及提供位移管理和组成员管理等。具体来讲,Consumer端应用程序在提交位移时,其实是向Coordinator所在的Broker提交位移,同样地,当Consumer应用启动时,也是向Coordinator所在的Broker发送各种请求,然后由Coordinator负责执行消费者组的注册、成员管理记录等元数据管理操作。所有Broker在启动时,都会创建和开启相应的Coordinator组件。也就是说,「所有Broker都有各自的Coordinator组件」

Kafka特性

Kafka性能高的原因

  1. 利用了 PageCache 缓存

  2. 磁盘顺序写

  3. 零拷贝技术

    1. 零拷贝:传统的 IO 流程,需要先把数据拷贝到内核缓冲区,再从内核缓冲拷贝到用户空间,应用程序处理完成以后,再拷贝回内核缓冲区。这个过程中发生了多次数据拷贝。为了减少不必要的拷贝,Kafka 依赖 Linux 内核提供的 Sendfile 系统调用。在 Sendfile 方法中,数据在内核缓冲区完成输入和输出,不需要拷贝到用户空间处理,这也就避免了重复的数据拷贝。在具体的操作中,Kafka 把所有的消息都存放在单独的文件里,在消息投递时直接通过 Sendfile 方法发送文件,减少了上下文切换,因此大大提高了性能
    2. Kafka 使用 Memory Mapped Files 完成内存映射,Memory Mapped Files 对文件的操作不是 write/read,而是直接对内存地址的操作,如果是调用文件的 read 操作,则把数据先读取到内核空间中,然后再复制到用户空间,但 MMAP可以将文件直接映射到用户态的内存空间,省去了用户空间到内核空间复制的开销。Producer生产的数据持久化到broker,采用mmap文件映射,实现顺序的快速写入。Customer从broker读取数据,采用sendfile,将磁盘文件读到OS内核缓冲区后,直接转到socket buffer进行网络发送。
  4. 批量发送读取。Kafka 的批量包括批量写入、批量发布等。它在消息投递时会将消息缓存起来,然后批量发送。同样,消费端在消费消息时,也不是一条一条处理的,而是批量进行拉取,提高了消息的处理速度

  5. 数据压缩。Kafka还支持对消息集合进行压缩,Producer可以通过GZIPSnappy格式对消息集合进行压缩。压缩的好处就是减少传输的数据量,减轻对网络传输的压力

  6. 分区机制。kafka中的topic中的内容可以被分为多partition存在,每个partition又分为多个段segment,所以每次操作都是针对一小部分做操作,很轻便,并且增加并行操作的能力

Kafka 的应用场景

  1. 日志聚合:可收集各种服务的日志写入kafka的消息队列进行存储
  2. 消息系统:广泛用于消息中间件
  3. 系统解耦:在重要操作完成后,发送消息,由别的服务系统来完成其他操作
  4. 流量削峰:一般用于秒杀或抢购活动中,来缓冲网站短时间内高流量带来的压力
  5. 异步处理:通过异步处理机制,可以把一个消息放入队列中,但不立即处理它,在需要的时候再进行处理

Kafka 的优缺点

优点

  • 高性能、高吞吐量、低延迟:Kafka 生产和消费消息的速度都达到每秒10万级
  • 高可用:所有消息持久化存储到磁盘,并支持数据备份防止数据丢失
  • 高并发:支持数千个客户端同时读写
  • 容错性:允许集群中节点失败(若副本数量为n,则允许 n-1 个节点失败)
  • 高扩展性:Kafka 集群支持热伸缩,无须停机

缺点

  • 没有完整的监控工具集

  • 不支持通配符主题选择

作者:JessieJ
链接:juejin.cn/post/727050…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。