一、什么是Kafka
Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志、访问日志,消息服务等等,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。其主要应用场景是:日志收集系统和消息系统。
二、Kafka架构
• producer:消息生存者
• consumer:消息消费者
• broker:kafka集群的server,负责处理消息读、写请求,存储消息。多个borker组成kafka cluster,一个机器上可以部署一个或者多个Broker,这多个Broker连接到相同的ZooKeeper就组成了Kafka集群。
• topic:消息队列/分类 。个Broker上可以创建一个或者多个Topic。同一个topic可以在同一集群下的多个Broker中分布。
三、kafka 的消息存储和生产消费模型
kafka里面的消息是由topic来组织的,简单的我们可以想象为一个队列,一个队列就是一个topic,然后它把每个topic又分为很多个partition,这个是为了做并行的,在每个partition里面是有序的,相当于有序的队列,其中每个消息都有个序号,比如0到12,从前面读往后面写。
一个partition对应一个broker,一个broker可以管多个partition,比如说,topic有6个partition,有两个broker,那每个broker就管3个partition。
当数据发过来的时候就往这个partition上面append,kafka和很多消息系统不一样,很多消息系统是消费完了我就把它删掉,而kafka是根据时间策略删除,而不是消费完就删除,在kafka里面没有一个消费完这么个概念,只有过期这样一个概念。
这里producer自己决定往哪个partition里面去写,这里有一些的策略,譬如如果hash就不用多个partition之间去join数据了。
• consumer自己维护消费到哪个offset
• 每个consumer都有对应的group
• group内是queue消费模型
– 各个consumer消费不同的partition
– 因此一个消息在group内只消费一次
• group间是publish-subscribe消费模型
– 各个group各自独立消费,互不影响
– 因此一个消息在被每个group消费一次
四、Kafka特点
• 消息系统的特点:生存者消费者模型,FIFO
• 高性能:单节点支持上千个客户端,百MB/s吞吐
• 持久性:消息直接持久化在普通磁盘上且性能好
• 分布式:数据副本冗余、流量负载均衡、可扩展
• 很灵活:消息长时间持久化+Client维护消费状态