(1) topic和record简介
每个topic在kafka集群里面都会有一个或多个分区,类似如下:
每个分区他是有序的,不可变的记录组成。详情如下:
- 生产者往队列里面写数据
- 消费者从队列里面读数据
- 消费者可以从之前的某个offset读取数据,直到now。
(2)分布式
- 分区在kafka集群里面是分布式的。每一个分区是可以通过配置进行复制、备份的。
- 在kafka集群里面,每一个分区都会有一个主服务器(leader),也可以有零个或多个从服务器(followers),当主服务挂了的时候,从服务器(们)会选举出新的主服务器。
- 这个主从关系是根据分区来的,也就是说一个服务器可能是某些topic的主服务器,同时也是某些topic的从服务器。
(3)Geo-Replication(地域复制)
- 通过这个机制,消息(messages)可以被备份到不同的数据中心或者云区域(cloud regions)中。
你可以使用该机制在积极或者消极的场景下备份/恢复消息; - 通过这个机制,可以使你的数据更贴近你的用户;
- 通过这个机制,可以让你的数据来满足本地需求;
(4)生产者
生产者推送数据到对应的topic中。
生产者负责决定哪个record被分配到topic的哪个分区。通过循环的方式,可以非常简单的实现负载均衡。也可以通过某些语义来进行分类。
(5)消费者
消费者通过一个消费者组(consumer group name)来标记他们自己。每个被发布到topic上的记录,都会被发送给每一个消费者组(consumer group)上的某一个具体的实例(consumer instance);消费者实例可以被分为不同的进程,也可以在不同的机器上。
- 如果所有的消费者实例都是同一个组,那么记录的分发会在消费者实例级别进行负载均衡
-
如果消费者在不同的组,那么记录会被广播到所有的组。
具体图示如下:
如上图所示,在kafka集群中有4个分区(P0-P3);有俩个消费者组(Consumer Group A和B),A拥有2个消费者实例(C1和C2),B拥有4个消费者实例(C3-C6);消费者实例之间的负载均衡由kafka协议控制。
- kafka只对分区内的记录进行排序,而不对topic下的分区排序
(6)kafka能特点
- FIFO,消息1优先于消息2被发送,那么kafka保证消息1会在消息2之前;
- 消费者看到的记录顺序和保存的顺序一致;
- 容错:在规模为N的集群中,允许N-1个服务宕机,且消息不丢失。
(7)kafka作为一个消息系统
kafka模型的优势在于它不仅可以成规模的处理消息,也可以拥有多个订阅者。在传统消息系统里面无法做到俩方面都支持。
kafka相对有传统消息系统而言,在消息顺序方面更加有保证。
传统消息系统的并发和有序冲突
在传统的消息系统里面,多个消费者消费一个队列的时候,尽管服务端是按照存储顺序从服务端发出的,但是在客户端那边,接收到的消息是异步的。这也意味着在并发场景下,这个顺序被打破了。想要保证顺序的话,就只能有一个消费者,这就咩有所谓的并发了。
kafka是如何解决这个问题的呢?
kafka有个并行性的概念--分区。kafka能够提供顺序保证以及负载均衡。kafka保证了一个消息只会被一个消费者实例消费。
(8)kafka作为一个存储系统
- kafka会将数据写入到磁盘中,用来进行数据备份和容错。kafka会让生长者等待数据保存结果。
- kafka的磁盘数据结构具有良好的可扩展性,在50k和50TB下kafka都能表现的良好。
(9)kafka用来流处理
仅仅是读、写和存储流式数据还是不够的,kafka还拥有处理实时数据流的能力。
在kafka里面,流式处理器就是一个从一个topic源源不断的读取流失数据,输出到另一个topic的工具。
kafka提供了强大了流式处理API。这允许应用程序进行简单的数据流聚合和数据流拼接。
主要有以下几种用途:
1.处理无序的数据;
2.因代码变动而需要重新处理的数据;
3.执行状态计算
(10)其他
- kafka可以作为一个流式处理平台
- 像HDFS这种分布式文件系统允许批量存储静态文件。这样的系统可以有效的存储和处理历史数据。
- 传统的企业级消息系统允许处理订阅者将订阅的消息。以这种方式构建的应用在到达订阅者时进行数据处理。
- kafka集合了以上俩种能力。这种合并不管在kafka作为一个流式处理平台方面,还是在作为流失数据处理通道方面都起到了至关重要的作用。
- kafka作为流式数据处理通道,这种合并使得在处理实时数据的时候,kafka能做到低延时。但是,可靠的数据存储能力。