首页 > 代码库 > kafka学习1

kafka学习1

1.kafka介绍

Kafka 是分布式发布-订阅消息系统。Kafka 是一个分布式的,可划分的,多订阅者,冗余备份的持久性的日志服务。它主要用于处理活跃的流式数据。
为了已在同时搞定在线应用(消息)和离线应用(数据文件,日志)Kafka 就出现了。Kafka 可以起到两个作用:
降低系统组网复杂度
降低编程复杂度,各个子系统不在是相互协商接口,各个子系统类似插口插在插座上,Kafka 承担高速数据总线的作用。

同时为发布和订阅提供高吞吐量。据了解,Kafka 每秒可以生产约 25 万消息(50 MB),每秒处理 55 万消息(110 MB)。
可进行持久化操作。将消息持久化到磁盘,因此可用于批量消费,例如 ETL,以及实时应用程序。通过将数据持久化到硬盘以及 replication 防止数据丢失。
分布式系统,易于向外扩展。所有的 producer、broker 和 consumer 都会有多个,均为分布式的。无需停机即可扩展机器。
消息被处理的状态是在 consumer 端维护,而不是由 server 端维护。当失败时能自动平衡。
支持 online 和 offline 的场景。

设计关注重点:
为生产者和消费者提供一个通用的API
消息的持久化
高吞吐量,可以满足百万级别消息处理
对分布式和高扩展性的支持
kafka最基本的架构是生产者发布一个消息到Kafka的一个主题(topic),这个主题即是由扮演KafkaServer角色的broker提供,消费者订阅这个主题,然后从中获取消息.

 

2.kafka提供效率的保证

  2.1数据文件的分段:
    Kafka解决查询效率的手段之一是将数据文件分段;

  2.2为数据文件建索引:

    为了进一步提高查找的效率,Kafka为每个分段后的数据文件建立了索引文件,文件名与数据文件的名字是一样的,只是文件扩展名为.index。

    索引文件中包含若干个索引条目,每个条目表示数据文件中一条Message的索引。
    索引包含两个部分(均为4个字节的数字),分别为相对offset和position。
    索引优化:稀疏存储,每隔一定字节的数据建立一条索引。(二分查找法)

3.消息队列分类
  点对点:

  消息生产者生产消息发送到queue中,然后消息消费者从queue中取出并且消费消息。

  注意:
  消息被消费以后,queue中不再有存储,所以消息消费者不可能消费到已经被消费的消息。

  Queue支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费。


  发布/订阅:

  消息生产者(发布)将消息发布到topic中,同时有多个消息消费者(订阅)消费该消息。和点对点方式不同,发布到topic的消息会被所有订阅者消费。


4.Kafka部署架构
技术分享

 

5.Kafka的基本概念
Topic:特指 Kafka 处理的消息源(feeds of messages)的不同分类。

Partition:Topic 物理上的分组,一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列。partition 中的每条消息都会被分配一个有序的 id(offset)。

Message:消息,是通信的基本单位,每个 producer 可以向一个 topic(主题)发布一些消息。

Producers:消息和数据生产者,向 Kafka 的一个 topic 发布消息的过程叫做 producers。

Consumers:消息和数据消费者,订阅 topics 并处理其发布的消息的过程叫做 consumers。

Broker:缓存代理,Kafka 集群中的一台或多台服务器统称为 broker。

Kafka的Producers
Producer将消息发布到指定的Topic中,同时Producer也能决定将此消息归属于哪个partition;比如基于"round-robin"方式或者通过其他的一些算法等.
消息和数据生产者,向 Kafka 的一个 topic 发布消息的过程叫做 producers。
异步发送
批量发送可以很有效的提高发送效率。Kafka producer的异步发送模式允许进行批量发送,先将消息缓存在内存中,然后一次请求批量发送出去。

 

Kafka的Broker
Broker:缓存代理,Kafka 集群中的一台或多台服务器统称为 broker。
为了减少磁盘写入的次数,broker会将消息暂时buffer起来,当消息的个数(或尺寸)达到一定阀值时,再flush到磁盘,这样减少了磁盘IO调用的次数。


Kafka的broker无状态机制
1.  Broker没有副本机制,一旦broker宕机,该broker的消息将都不可用。
2.  Broker不保存订阅者的状态,由订阅者自己保存。
3.  无状态导致消息的删除成为难题(可能删除的消息正在被订阅),kafka采用基于时间的SLA(服务水平保证),消息保存一定时间(通常为7天)后会被删除。
4.  消息订阅者可以rewind back到任意位置重新进行消费,当订阅者故障时,可以选择最小的offset(id)进行重新读取消费消息。

Kafka的Consumers
消息和数据消费者,订阅 topics 并处理其发布的消息的过程叫做 consumers。
本质上kafka只支持Topic.每个consumer属于一个consumer group;反过来说,每个group中可以有多个consumer.发送到Topic的消息,只会被订阅此Topic的每个group中的一个consumer消费.
在 kafka中,我们 可以认为一个group是一个"订阅"者,一个Topic中的每个partions,只会被一个"订阅者"中的一个consumer消费,不过一个 consumer可以消费多个partitions中的消息.kafka只能保证一个partition中的消息被某个consumer消费时,消息是顺 序的.事实上,从Topic角度来说,消息仍不是有序的.
注: kafka的设计原理决定,对于一个topic,同一个group中不能有多于partitions个数的consumer同时消费,否则将意味着某些consumer将无法得到消息.
一个partition中的消息只会被group中的一个consumer消费;
每个group中consumer消息消费互相独立;


Kafka的Consumer group
1. 允许consumer group(包含多个consumer,如一个集群同时消费)对一个topic进行消费,不同的consumer group之间独立订阅。
2. 为了对减小一个consumer group中不同consumer之间的分布式协调开销,指定partition为最小的并行消费单位,即一个group内的consumer只能消费不同的partition。

Kafka的partitions
设计目的:
kafka基于文件存储.通过分区,可以将日志内容分散到多个server上,来避免文件尺寸达到单机磁盘的上限,每个partiton都会被当前server(kafka实例)保存;
可以将一个topic切分多任意多个partitions,来消息保存/消费的效率.
越多的partitions意味着可以容纳更多的consumer,有效提升并发消费的能力.

Kafka的Message
Message消息:是通信的基本单位,每个 producer 可以向一个 topic(主题)发布一些消息。
Kafka中的Message是以topic为基本单位组织的,不同的topic之间是相互独立的。每个topic又可以分成几个不同的partition(每个topic有几个partition是在创建topic时指定的),每个partition存储一部分Message。
partition中的每条Message包含了以下三个属性:
offset        对应类型:long
MessageSize    对应类型:int32
data        是message的具体内容
技术分享

Kafka的offset
每条消息在文件中的位置称为offset(偏移量)。offset 为一个long型数字,它是唯一标记一条消息。它唯一的标记一条消息。kafka并没有提供其他额外的索引机制来存储offset,因为在kafka中几 乎不允许对消息进行“随机读写”。

Partition中的每条Message由offset来表示它在这个partition中的偏移量,这个offset不是该Message在partition数据文件中的实际存储位置,而是逻辑上一个值,它唯一确定了partition中的一条Message。因此,可以认为offset是partition中Message的id。


怎样记录每个consumer处理的信息的状态?在Kafka中仅保存了每个consumer已经处理数据的offset。这样有两个好处:
1)保 存的数据量少
2)当consumer出错时,重新启动

consumer处理数据时,只需从最近的offset开始处理数据即可。




 

kafka学习1