分布式消息中间件(六)——Kafka核心组件详解

来源:互联网 发布:九州通网络销售平台 编辑:程序博客网 时间:2024/06/04 03:38

一、Kafka发布订阅消息系统基础

     Kafka 是分布式发布-订阅消息系统。它最初由 LinkedIn 公司开发,使用 Scala语言编写,之后成为 Apache 顶级项目框架。Kafka 是一个分布式的,可划分的,多订阅者,冗余备份的持久性的服务。

     在Kafka生态架构实战中已经介绍了Kafka生态系统,伴随大数据计算,kafka作为重要的数据缓冲者,将flume收集的数据缓冲,提供给storm进行实时计算。同于storm框架,针对实时性、流式计算系统也是kafka的主要应用。它主要用于处理活跃的流式数据。

二、Kafka的特点

1、同时为发布和订阅提供高吞吐量。统计Kafka 每秒可以生产约 25 万消息(50 MB),每秒处理 55 万消息(110 MB)。

2、可持久化操作。将消息持久化到磁盘,因此可用于批量消费,通过将数据持久化到硬盘以及 replication 防止数据丢失。

3、分布式系统,易于向外扩展。所有的 producer、broker 和 consumer 都会有多个,均为分布式的。无需停机即可扩展机器。

4、kafka每个实例(broker)是无状态的,只管消息的增减,不管谁来消费,消息被处理的状态是由consumer主动从topic分区中pull消息,也就是说消息由谁消费由 consumer 决定,而不是由 server的broker决定。

三、Kafka性能测试  

 

     数据大量堆积导致broker卡死,这里就将使用到topic的分区,分散broker中的日志存储大小。

四、Kafka核心

1、Kafka核心组件

     Producer:消息的生产者

     Consumer:特指消息的消费者

     Consumer Group:消费者组,可以并行消费Topic中partition的消息

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

     Topic:特指 Kafka 处理的消息源(feeds of messages)的不同分类。

     Partition:Topic 物理上的分组,一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列。partition 中的每条消息都会被分配一个有序的 id(offset)。         Message:消息,是通信的基本单位,每个 producer 可以向一个 topic(主题)发布一些消息。

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

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

2、Kafka消息流程


(1)消息生产者Producer将消息发送到kafka broker 的Topic中(每个topic中有多个消息)

(2)每个topic中消息增多,topic中的消息进行分区,使得consumer可快速定位消费消息,也可同时消费多个分区中的数据,提高了传输速率。

(3)Consumer Group:消费者组里有多个消费者,每个消费者对应着不同partition分区中的数据处理。例如partition1的数据给Consumer 1,2给2,使得多个分区组成的topic由group中的多个consumer消费,也就是数据内部对相同message的并发处理。

3、核心组件分析

Producers

(1)消息生产者向kafka的一个topic中分布消息的过程kafka称为Producers

(2)变相的负载均衡:把消息发给topic的哪个partition里,实现对消息的均衡分发

(3)批量异步发送:producer和broker 两端(消息的客户端和服务端),不在一台服务器中,如果每产生一条消息就进行发送,建立一次网络连接,势必影响效率。Kafka的消息发送过程采取批量,异步发送。

Broker

(1)支持消息持久化:Broker没有副本备份,但kafka将消息进行持久化操作,以免丢失。当Consumer到kafka的broker中获取数据时,broker不会直接给consumer消费,而是把数据先保存到broker本地日志文件中(具体路径可配),每个Partition都会有一个log文件。另外日志的添加采用追加方式进行持久化,达到一个消息有序持久化效果。写入日志文件:缓存到一定阈值之后,再读写磁盘进行IO操作,提高性能

(2)谁消费了message,由消费者确定和维护这类信息(具体有zookeeper记录维护),broker不保存。

(5)消费时发生故障,kafka可快速定位到故障时没消费的那条数据。 consumer如何确定哪些消息是它没有消费的?zk来记录哪条消息消费情况,如何快速的找到没有消费的消息就涉及到kafka的稀疏索引机制。接下来再继续研究。

Messge

消息的3个属性: 

(1)Offset  偏移量   消息的唯一标识,通过该标识找到消息。

(2)MessageSize 消息大小

(3)data   消息本身

Partition

分区的目的:

(1)减缓日志文件占用磁盘空间

大量消息,broker都要持久化到文件中,硬盘占用空间增大。分区将消息颗粒细分,每个partition可以存放在不同的硬盘空间中,避免单个broker中的topic文件侵占内存空间

(2)不同的consumer同时处理partition中的数据

Kafka中consumer与partition为 1:n的关系,即1个分区仅由1个消费者消费;1个消费者可以同时消费多个不同分区。分区细化消息粒度,消费者同时处理多个分区的越多,达到高效的消息并发处理。

3 0