kafka理论简介
本文主要针对Kafka从理论方面做出简单介绍,让大家对kafka有个整体的了解。
- kafka简介
- kafka术语说明
- broker
- topic
- partition
- producer
- consumer
- kafka优点
一、kafka简介
1.1 消息系统介绍
消息系统主要作用是将数据从一个系统传递到另一个系统。消息传递模式有两种:点对点式传递、发布订阅式传递。
-
- 点对点式传递:消息被持久化到一个队列中,可以提供给一个或多个消费者进行消费,但是每条消息只能消费一次,当一个消费者消费了队列中的某条消息后,该条数据会从队列里删除。这种模式即使有多个消费者者同时消费一个队列的数据,也能保证顺序性。生产者发送一条消息到队列中,只有一个消费者能消费数据。
- 发布订阅式传递:在发布-订阅消息系统中,消息被持久化到一个topic中。与点对点消息系统不同的是,消费者可以订阅一个或多个topic,消费者可以消费该topic中所有的数据,同一条数据可以被多个消费者消费,数据被消费后不会立马删除。在发布-订阅消息系统中,消息的生产者称为发布者,消费者称为订阅者。发布者发送到topic的消息,只有订阅了topic的订阅者才会收到消息。kafka就是一种发布订阅式消息系统。
1.2 kafka简介
Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统。具备以下特性:
-
- 通过O(1)的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能。
- 高吞吐量 [2] :即使是非常普通的硬件Kafka也可以支持每秒数百万 [2] 的消息。
- 支持通过Kafka服务器和消费机集群来分区消息。
- 支持Hadoop并行数据加载。
- Kafka中的消息仅保存一段时间,超过时间还没有被消费,则会被清除(默认保留时间为2周)。
二、kafka术语介绍
2.1 broker
-
- Kafka 集群包含一个或多个服务器,服务器节点称为broker。
- broker存储topic的数据。如果某topic有N个partition,集群有N个broker,那么每个broker存储该topic的一个partition。
2.2 topic
每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic。(物理上不同Topic的消息分开存储,逻辑上一个Topic的消息虽然保存于一个或多个broker上但用户只需指定消息的Topic即可生产或消费数据而不必关心数据存于何处)
2.3 partition
-
- 消息发送到Topic后,会被分发到多个Partition。
- 每个Partition内的消息都是有序的;每条消息在Partition里都有一个有序ID,称为offset。
- offset仅在某个Partition中有意义。比如:Partition1中的offset=3的消息仅代表它在Partition1中排第3;它和Partition2中offset=3的消息不是同一个。
- 消息有序性:仅限在某个Partition内有序,而在Partition间不一定有序。
- 消息一旦写入Partition中,消息内容就不能再被修改。
- 消息会被随机分发到Partition,除非指定了消息的key。
- 每个Topic可以包含多个Partition。
注意:如果topic有多个partition,消费数据时就不能保证数据的顺序。在需要严格保证消息的消费顺序的场景下,需要将partition数目设为1。
2.4 producer
生产者即数据的发布者,该角色将消息发布到Kafka的topic中。broker接收到生产者发送的消息后,broker将该消息追加到当前用于追加数据的segment文件中。生产者发送的消息,存储到一个partition中,生产者也可以指定数据存储的partition。
2.5 consumer
-
- 消费者可以从broker中读取数据。消费者可以消费多个topic中的数据。
- 每个Consumer属于一个特定的Consumer Group(可为每个Consumer指定group name,若不指定group name则属于默认的group)。
三、kafka优点
3.1 解耦
在项目启动之初来预测将来项目会碰到什么需求,是极其困难的。消息系统在处理过程中间插入了一个隐含的、基于数据的接口层,两边的处理过程都要实现这一接口。这允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。
3.2 冗余
有些情况下,处理数据的过程会失败。除非数据被持久化,否则将造成丢失。消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险。许多消息队列所采用的"插入-获取-删除"范式中,在把一个消息从队列中删除之前,需要你的处理系统明确的指出该消息已经被处理完毕,从而确保你的数据被安全的保存直到你使用完毕。
3.3 扩展性强
因为消息队列解耦了你的处理过程,所以增大消息入队和处理的频率是很容易的,只要另外增加处理过程即可。不需要改变代码、不需要调节参数。
3.4 灵活性&峰值处理能力
在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见;如果为以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。
3.5 可恢复性
系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。
3.6 顺序保证
在大多使用场景下,数据处理的顺序都很重要。大部分消息队列本来就是排序的,并且能保证数据会按照特定的顺序来处理。Kafka保证一个Partition内的消息的有序性。
3.7 延迟处理
很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。
3.8 写入非常快
这主要得益于它对磁盘的使用方法的不同,虽然Kafka会持久化所有数据到磁盘,但本质上每次写入操作其实都只是把数据写入到操作系统的页缓存(page cache )中,然后由操作系统自行决定什么时候把页缓存中的数据写回磁盘上。这样的设计有 个主要优势:
-
- 大量使用操作系统页缓存,操作系统页缓存是在内存中分配的,内存操作速度快且命中率高。
- Kafka不直接与底层的文件系统打交道。所有烦琐的 I/O 操作都交由操作系统来处理。
- Kafka 写入操作采用追加写入( append )的方式,摒弃了缓慢的磁盘随机读/写操作。
- 使用以 sendfile 为代表的零拷贝技术加强网络间的数据传输效率。
最后附上kafka中文文档链接。