Moon's blog

write the code, change the world.

kafka introduce翻译

年前看过一遍kafka的文档,没想到现在忘得差不多了,于是结合自己的理解来写一篇译文。

简介

kafka是一个分布式流处理平台

有三个关键特性

  • 发布、订阅,类似消息队列
  • 错误容忍的持久化流数据
  • 处理流式数据

kafka有两个比较大的应用场景

  • 构建实时流数据管道(偏向于数据传输)
  • 构建实时流数据处理(根据数据做出对应的行为)

概念

  • kafka以集群运行,支持跨dc部署
  • kafka集群分类存储流数据,叫做topic
  • 每条记录都包含key、value、timestamp

kafaka有四大核心API

  • Producer
  • Consumer
  • Stream(流数据处理)
  • Connector(和现有系统的集成)

Topics and Logs

一个topic包含多个partition,partition内部的数据是有序并且不可变的。向kafka写入数据,其实就是在向某个partition追加数据。kafka只保证单个partition内的数据是有序的!

而消费时,客户端其实就是在控制partition内部的指针。

kafka会在一个可配置的周期内,保存所有消息(无论有没有被消费)

Distribution

topic内的partitions会分布在多台server上,但partition本身不可再分。为了防止partition挂了丢失数据,partition本身也会有主从备份机制,leader处理所有读写,follower复制leader作为备份。

在宏观上,每台物理服务器会包含多个不同topic的partition,其中一部分是leader partition,一部分是follower partition,通过这样来均衡集群内的负载

Geo-Replication

提供了跨dc的复制机制,我觉得99%的企业用不上这个特性。

Producers

负责向topic发送数据,它需要通过一些策略来选择topic内的某个partition进行写入,

Consumers

kafka里的consumer有点特殊,它们会组成一个叫consumer group的概念,投递给topic的消息,最终会被订阅这个topic的consumer group中的某一个consumer消费。可以理解成,消息会被传递给consumer group,然后group内部通过某种策略选择具体的consumer处理。consumer可以分布于不同的进程或者机器上。

如果订阅某个topic的所有consumer都属于同一个group,那么消息会被高效地负载均衡。

如果订阅某个topic的所有consumer都属于不同的组,那么消息会被广播给所有的consumer

Guarantees

kafka提供的保证有三点

  • 同一个producer向同一个partition发送的数据是有序的
  • consumer看到的数据是有序的(即数据被存储的顺序)
  • topic有N个备份,能保证在N-1个server当机时不丢失数据。

优势

传统消息队列的queue和pub\sub模型,都有不足之处。

queue不支持多个subsriber,某个subsriber读了数据,这个数据就没了

pub\sub无法扩展处理能力,因为每个消息都会投递给所有subsriber

kafka以consumer group作为订阅的单位,就解决了这两个模型的不足。

kafka还是可靠又快速的存储系统,性能几乎不受数据量的影响。

参考

https://kafka.apache.org/intro#intro_multi-tenancy