Apache Kafka
实时的生产者消费者处理系统,类似于消息队列的感觉。它将生产者和消费者松耦合,从而使得生产和消费不会相互制约。它可用于收集各种各样的消息,例如用户行为,传感器数据,日志,metrics等,在kafka的后面再对接多种多样的分析工具进行消费。
架构设计
Kafka是一个分布式的,分区的,多副本的commit log服务。消息按照种类被划分为不同的topics,同一个topic又被划分为多个不同的partitions,然后散布到不同的机器中,一个分区在一个机器中是连续存储的。Kafka由多个server组成cluster,这些server叫作brokers。一个简单的架构如下图所示:
topic和数据分区
前面说过,每个topic由多个partitions组成,每个partition是一个有序的不可变的消息序列。
生产者和消费者
Kafka对它存储的消息保存一定的时间(可配置),这就使得消息既可以被real-time处理,也可以被off-line Hadoop任务处理。Producer可以指定要将message发布到哪个topic下的哪个partition。多个Consumer可以组成一个Consumer group,然后消息可能被一个group内的任意一个consumer消费。同一条消息会被广播给不同的group。
Kafka具体架构
上面的介绍应该已经大致讲清楚了producer,consumer和broker的关系,以及消息存储逻辑实体topic和物理实体partitions。
producer
生产者的职能
- 决定选择消息要发布到哪个topic下的哪个partition
- 如何选择呢? round-robin或者基于key的hash(给消息指定一个key以及hash函数)
consumer
消息的两种处理模型: (a)消息队列模型,供给多个人消费,(b)pub-sub模型,消息被广播到多个不同人消费。在kafka中,通过consumer group将两种模型进行统一化。一条消息会被广播到多个不同的group中的某一个consumer中。如果,一个group中有多个consumers,那么这相当于消息队列模型;如果只有一个consumer,那么相当于pub-sub模型。
每一个partition只会被一个consumer消费。partition自身是严格ordered的,而partition之间非全局有序的。这也就是说,如果你需要以全局严格有序的方式消费某一个topic,那么只能使用一个partition,也就只有一个consumer。
zookeeper
留待专门的zookeeper讲解。
- [1] Thein K M M. Apache kafka: Next generation distributed messaging system[J]. International Journal of Scientific Engineering and Technology Research, 2014, 3(47): 9478-9483.