Kafka(一)基础特性

linkin的开源消息队列,现在随着大数据一起非常火。但是并不是只能用于大数据那一套上,可以说是一个基础的组件,用处非常广。特点是持久化快,吞吐量大。 与Nosql数据库相对关系型数据库设计一样,设计上去除了很多束缚,解决特定领域(需要持久化快,吞吐量大)的问题。例如所有消息都会持久化,pull的消息方式,只保证同一partition的消息顺序等。

使用场景

Feature

持久化快

顺序写磁盘,与随机写内存差不多。7200转的硬盘有100MB的速度,一般固态有300MB速度,更快固态硬盘的有500MB的速度

高吞吐率,写,读都有负载均衡

在发送一条消息时,可以指定这条消息的key,Producer根据这个key和Partition机制来判断应该将这条消息发送到哪个Parition。

同一Topic的一条消息只能被同一个Consumer Group内的一个Consumer消费,但多个Consumer Group可同时消费这一消息。

简化设计

使用zk

delivery guarantee

producer到broker

Producer在发布消息到某个Partition时,先通过Zookeeper找到该Partition的Leader,然后无论该Topic的Replication Factor为多少(也即该Partition有多少个Replica),Producer只将该消息发送到该Partition的Leader。Leader会将该消息写入其本地Log。每个Follower都从Leader pull数据。

可通过配置request.required.acks改变提交的可靠性

broker到consumer处理有三种方式

不处理Byzantine问题

拓扑结构

一个典型的Kafka集群中包含若干Producer(可以是web前端产生的Page View,或者是服务器日志,系统CPU、Memory等),若干broker(Kafka支持水平扩展,一般broker数量越多,集群吞吐率越高),若干Consumer Group,以及一个Zookeeper集群。Kafka通过Zookeeper管理集群配置,选举leader,以及在Consumer Group发生变化时进行rebalance。Producer使用push模式将消息发布到broker,Consumer使用pull模式从broker订阅并消费消息。

High Availability

为何需要Leader Election

如果没有一个Leader,所有Replica都可同时读/写数据,那就需要保证多个Replica之间互相(N×N条通路)同步数据,数据的一致性和有序性非常难保证 Leader负责数据读写,Follower只向Leader顺序Fetch数据(N条通路),系统更加简单且高效。

MYQA

Q: 目前公司使用大数据的方式是在中心收集到数据后调用提供的sdk,发送到他们的kafka上大数据平台处理,这种方式问题? A: 既然有了kafka,应该算一个底层的支持,数据应该直接到kafka,应用服务器的中心与大数据平台订阅方式获取数据。

Q: why kafka is pull based instead of push based?

参考

Kafka设计解析(一)

Table of Contents