“ Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志、访问日志,消息服务等等,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目”
01
—
kafka简介
kafka和我们之前说过的rabbitmq以及mq都是采用发布——订阅的模式来实现的。简单来说,一个消息系统负责将数据从一个应用传递到另外一个应用,应用只需关注于数据,无需关注数据在两个或多个应用间是如何传递的。分布式消息传递基于可靠的消息队列,在客户端应用和消息系统之间异步传递消息。
在发布-订阅消息系统中,消息被持久化到一个topic中。与点对点消息系统不同的是,消费者可以订阅一个或多个topic,消费者可以消费该topic中所有的数据,同一条数据可以被多个消费者消费,数据被消费后不会立马删除。在发布-订阅消息系统中,消息的生产者称为发布者,消费者称为订阅者。该模式的示例图如下:
kafka结构如下:
上图中一个topic配置了3个partition。Partition1有两个offset:0和1。Partition2有4个offset。Partition3有1个offset。副本的id和副本所在的机器的id恰好相同。
如果一个topic的副本数为3,那么Kafka将在集群中为每个partition创建3个相同的副本。集群中的每个broker存储一个或多个partition。多个producer和consumer可同时生产和消费数据。
下面对结构中的构成做一个简单介绍,因为这个模式在其他很多的生产消费模式中都有,所以也没有什么特别难理解的。
Partition:
topic中的数据分割为一个或多个partition。每个topic至少有一个partition。一个partition只能被同一组的一个consumer消费,当消费者数量多于partition的数量时,多余的消费者空闲。不同组的consumer可以消费同一个partition。但是一个consumer可以消费多个partition,每个partition中的数据使用多个segment文件存储。partition中的数据是有序的。如果topic有多个partition,消费数据时就不能保证数据顺序。在需要严格保证消息的消费顺序的场景下,需要将partition数设为1。
Broker:
Kafka 集群包含一个或多个服务器,服务器节点称为broker。
broker存储topic的数据。如果某topic有N个partition,集群有N个br