kafka学习笔记

Posted on 2018-09-26 23:57  芳草园一只地鼠仔  阅读(132)  评论(0编辑  收藏  举报

kafka即是一个消息系统,又是一个流处理平台。
 
基本概念
producer: 生产者
consumer:消费者
consumer group: 消费者组。一个topic可以被多个消费者组订阅,一个消费者组内可以有多个消费者实例。,
topic: 标记一类消息
partition:分区,消息会按指定策略分发到多个partition中,一个partition中的消息是有序的
 
特性
作为消息系统,与传统消息系统的区别:
 
1、模式上的区别。传统消息系统有两种模式:消息队列,和发布-订阅模式。队列的优势在于可以支持消费者的负载均衡,但一条消息只能被一个消费者消费一次,不支持“多消费者”(多消费者的意义是什么呢?);发布-订阅模式可以被多个消费者消费(why?),但无法均衡消费者负载。kafka结合了这两种模式的有点。消息是按consumer group分发的,从consumer group维度看是一个发布-订阅模式的系统;consumer group内部则是一个消息队列,group内的多个消费者示例之间可以实现负载均衡。(个人感觉仍然没有解决多个消费者之间的有序性问题啊)
 
2、更高的有序性保证。传统消息队列,在并行消费时,消费者之间是无序的。kafka引入了partition概念,每个partition内的消息是有序的,一个partition只能被一个消费者消费(但一个消费者可以消费多个partition),通过将不同partition分配给不同消费者实现消费者负载均衡,同时保证每个消费者消费的消息都是有序的。需注意,当消费者数量超过partition个数时,多出的消费者不会分配到partition也就无法消费任何消息。
举个例子,人员变更消息,按人员id取模分配到10个partiton,有5个消费者,每个消费者消费两个partiton。这样同一个人的消息只会被一个消费者消费,保证了人员维度的消息是按顺序消费的。
如果consumer group中新增一个consumer,新的consumer会从其他consumer中分担一部分partition;如果摘除consumer,他的partition会重新分配给其他consumer。由于“新增”“摘除”动作起到了同步栅的作用,不会影响partition内消息消费的有序性。
 
3、消费方式区别。已经消费的消息不会立刻删除,而是保存在队列中直到超出有效期。实际上kafka不会为每个消费者维护一个队列,消费者只持有自己在partition中的当前位置(offset),可以通过offset递增按序消费消息,也可以自己置顶offset访问任意位置的消息。一个消费者消费某个消息并不会影响其他消费者消费该消息。这种设计使得kafka消费者的成本非常低。
 
4、存储方式的区别。kafka将消息存储在磁盘上,每个partition在分布式系统中有零到多个备份以增强容错能力。因此,kafka也是一个高吞吐,低延迟,高可靠的分布式文件存储系统。
 
kafka的消息分发机制
 
server和partition是多对多的关系,但一个partition同一时刻只有一个默认server,其他是备份。
图中topic有四个partition,将消息按规则分发到四个partition上。consumer Group A有两个消费者,则每个消费者分配两个partiton,两个消费者并行工作。由于一个partition只被一个消费者消费,可以保证一个partiton内的消息是按顺序被消费的。
要根据业务需要设计partiton的分配规则。如果同一个用户的相关消息要按顺序消费,则需保证同一个用户的消息分配到同一个partition上;如果要求所有消息有序,则只能有一个partiton;如果完全不关心顺序,则可以采用round robin算法分配到partion,保证负载均衡。 

Copyright © 2024 芳草园一只地鼠仔
Powered by .NET 8.0 on Kubernetes