产品简介

网易云 Kafka 是由网易云提供的高性能、高可靠的分布式消息服务,通过一套独特的设计提供了消息系统中间件的功能。

网易云 Kafka 支持集群弹性伸缩、在线水平扩容,并提供完善的集群、Topic 状态监控查看及性能监测等功能,简化用户的部署和使用。

网易云 Kafka 基于 Apache Kafka 进行二次开发,并完全兼容 Kafka 协议,已有 Apache Kafka 企业和用户能够方便的对接和部署,快捷享受专业的服务。

概括来讲,生产者通过网络将消息发送到 Kafka 机器,然后由 Kafka 集群将这些消息提供给消费者:

客户端和服务端通过一个简单的、高效的基于 TCP 的协议进行交互。

Topics and Logs

Topics

对于每一个 Topic,Kafka 会为其维护一个如下图所示的分区日志文件:

Logs

每个分区是一个有序的、不可修改的、消息组成的队列,这些消息会被不断的追加到提交日志文件上。在这些分区中每个消息会被赋予一个叫做 offset 的顺序 id 编号,用来在分区之中唯一性的标识这个消息。

实际上 Kafka 关注的关于每个消费者的元数据信息也基本上仅仅只有这个消费者的 offset ,即访问到了 log 的哪个位置。这个 offset 由消费者控制,通常情况下当消费者读取信息时这个数值是线性递增的,但实际上消费者可以自行随意的控制这个值从而随意控制其消费信息的顺序。例如,一个消费者可以将其重置到更早的时间来实现信息的重新处理。

这些特性组合起来意味着 Kafka消费者是非常低消耗的,它可以随意的被添加或者移出而不会对集群或者其他的消费者造成太大的干扰。

对 log 进行分区主要是为了以下几个目的:

  • 可以让 log 的伸缩能力超过单台服务器上限,每个独立的分区的大小仅受限于单台服务器的容积,但是一个 topic 可以有很多分区从而使得它有能力处理任意大小的数据。
  • 在并行处理方面可以作为一个独立的单元。

分布式

log 的分区被分布到 Kafka 集群之中,每个服务器负责处理彼此共享的分区的一部分数据和请求。每个分区被复制成指定的份数散布到机器之中来提供故障转移能力。

对于每一个分区都会有一个服务器作为它的 leader ,并且有零个或者多个服务器作为 followers。leader 服务器负责处理关于这个分区的所有的读写请求,follower 服务器则被动的复制 leader 服务器。如果 leader 服务器失效,那么 follower 服务器将有一台被自动选举成为新的 leader ,每个服务器作为某些分区的 leader 的同时也作为其他服务器的 follower ,从而实现了集群的负载均衡。

生产者

生产者将数据发布到它们指定的 topics 上。生产者负责决定哪个消息发送到 topic 的哪个分区上。

消费者

通常消息通信有两种模式:队列模式和订阅模式。

队列模式中一组消费者可能是从一个服务器中读取消息,每个消息被发送到其中一个消费者。

在订阅模式中消费者被广播给所有的消费者,Kafka 提供了一个抽象,把消费者组的所有消费者视为同一个抽象的消费者。

每个消费者都有一个自己的消费组名称标识,每一个发布到 topic 上的消息会被投递到每个订阅此 topic 的消费者组的某一个消费者,这个被选中的消费者实例可以在不同的处理程序中或者不同的机器上。

如果所有的消费者实例都有相同的消费者组标识,那么整个结构就是一个传统的消息队列模式,消费者之间负载均衡。

如果所有的消费者实例都采用不同的消费者组,那么这个结构就是订阅模式,每个消息将被广播给每一个消费者。