- 主题:Kafka maintains feeds of messages in categories called topics.
- 生产者:We’ll call processes that publish messages to a Kafka topic producers.
- 消费者:We’ll call processes that subscribe to topics and process the feed of published messages consumers.
-
代理(Broker):Kafka is run as a cluster comprised of one or more servers each of which is called a broker.
-
Partition:Partition 是物理上的概念,每个 Topic 包含一个或多个 Partition。
生产者通过网路将消息发送到Kafka集群上,集群依次(轮流)服务消息到达消费者。 Kafka运行在一个集群中,集群中的每一个服务器就叫代理。
Kafka保存所有(一段时间内的-可配置)已经发布的消息-无论它们是否已经被消费。例如,如果日志保留被设置为两天,那么在一个消息发布后,两天内它是可用的,两天后它将被丢弃到空闲空间
每个分区都有一个服务器它充当“leader”,而0到其他编号的服务器,作为“followers”。leader处理所有的读写请求,而followers被动地复制到leader。如果leader失败,其中一个“followers”将自动成为新的“leader”。
Producers
生产者将数据发布到他们所选择的主题。生产者负责选择某个消息分配到某个主题的哪个partition。至于选择哪个分区可以简单的循环方式达到负载均衡,也可以者根据语义功能来分区。
Consumers
每个消费者把自己标识到一个消费组,当每个消息发布到主题后,消息再投递到每个订阅消费组一个消费实例。消费者实例可以在不同的进程或不同的机器上。
如果所有的消费者实例都有相同的消费组,那么这就像一个传统的队列。
如果所有的消费者实例都有不同的消费组,那么这类作品就如发布订阅,所有的信息都被广播给所有的消费者。
然而,更常见的是主题有一个小数量的消费组,每一个为“逻辑订阅。每个组都是由许多消费实例,为了可扩展性和容错性。
传统的队列在服务器上保留顺序消息,如果多个消费者从队列中消费,然后服务器将它们存储的消息按照顺序发送出去。然而,虽然服务器按照顺序发送消息,但是消息传递异步发送给消费者,所以消息到达消费者时可能失序了。这种高效意味着在并行消费过程中,消息的顺序丢失。消息传递系统经常围绕这个工作,有一个“exclusive consumer“的概念,它只允许一个进程从一个队列中消耗,但当然这意味着没有并行性处理的可能性。
Kafka做得更好。通过对主题进行分区,Kafka是既能保证顺序,又能负载均衡的消费。这是通过给主题进行分区,然后给消费组,使的每个分区都被组内唯一消费进程消费。通过这样做,我们确保消费进程是唯一的读取那个分区,并消费数据的顺序。请注意,在一个消费组中,不能有比分区更多的消费进程。
Kafka只在一个分区中的消息提供了一个总的顺序,而不是在一个主题中的不同分区之间的。然而,如果您需要一个完全有序的消息,这可以通过一个主题和一个分区来实现,显然这将意味着每一个消费组只有一个消费进程。
Guarantees(保证)
Kafka给出了以下保证:
- 生产者发送到一个特定主题的分区的消息,将被添加,并且发送是顺序的。
- 各消费实例看到消息是顺序,并且存储在日志里。
- 一个主题由N个复制备份,我们将容忍N-1服务器故障而不丢失任何信息提交到日志。
源码例子,后续章节将贴上自己的
原文http://blog.csdn.net/likewindy/article/details/51740837