kafka 应用详解

个人备忘

 

概述:

   在流式计算中,kafka一般用来缓存数据,Strom通过消费kafka 的数据进行计算。

 1)  Apache Kafka 是一个开源消息系统,由Scala写成。是由Apache 软件基金会开发的一个开源消息系统项目。

 2) kafka 最初是由Linkedln开发,并于2011年处开源。2012 年10月从Apache lncubator 毕业。该项目的目标是为处理实时数据提供一个统一,高通量,地等待的平台。

 3) Kafka 是一个分布式消息队列。Kafka 对消息保存时根据topic 进行归类,发送消息者称为producer, 消息接收者称为Consumer, 此外kafka 集群有多个kafka 实例组成,每个实例(server)成为broker.

 4) 无论时kafka集群,还是producer 和 consumer 都依赖与zookeeper 集群保证一些meta信息,来保证系统可用性。

 

kafka发送消息模式

1)kafka 发送消息有两种模式,一种是:点对点;还有一种是:一对多。

kafka内部组成结构

1)kafka broker 可以定义多个队列(topic), 每个topic 下可以有多个分区(parttion)。

2)发送者producer可以指定topic 发送消息,也可以指定topic 下的具体分区来发送消息。

3)所有发送的消息都存储在broker 中,在kafka集群中,每个分区上的消息数据都可以有副本,针对每个分区分为leader,副本为fllower。发送者和消费者都只会对leader进行消费,leader 挂掉后,fllower 会选举为leader 继续提供服务。

4)数据的写入顺序为,leader 拿到producer发送完的数据后,先将消息写道系统的pageCache 中,异步写入磁盘,成功后,在赋值给fllower 作为副本,因为kafka 依赖于pageCache ,这是高吞吐量的一个点。

5)消息的删除有两种,一般消息会在broker 中保存 七天,如果空间不足会将旧的数据进行清除。

6)类似activemq, rabbitmq 他们都是在消费者消费成功之后,对消息进行删除,kafka 如何保证消息不被重复消费?

7)kafka 每条消息都会有offset 去记录当前消费者消费到了那条消息,消费过的消息不会再进行消费。

8)说到kafka 的消费者,就得说一下kafka 消费者端的设计,kafka 消费者是分组来呈现的,一个topic 可以 被 多个组去订阅,我们知道消息是在 topic 的分区中,那么一对一就是,我们只有一个发送者,并且只有一个“消费者组”,这个组里可以有多个消费者,假设 topicA 有一个parttionA一个分区,我们producer指定消息发送到 topicA 中的 parttionA 中,该topicA 只被一个消费者组去订阅,这个组里有10个消费者,那么第一个去消费掉parttionA 中消息的消费者会一直对该parttionA进行消费,其他九个消费者会对其他parttion消费,如果没有就不消费,简单讲,同一个parttion 同时只能被 “同一个消费者组中某一个消费者消费”,如果想实现一对多,那么就定义多个组。由每个组的消费者去记录这些消息的offset, 而不是broker。

9)开发者可以根据以上特性,自己去定义你消息模式,理论上讲,同一条消息不会被一个组内多个消费者进行消费。

10)kafka 集群下,通过parttion 的副本可以很好的保证消息的可靠性。

 

kafka应用

1)高级API:

      优点:

          1,用起来简单。

          2,不需要自己管理offset,系统通过zookeeper自行管理。

          3,不需要管理分区,副本等情况,系统自己管理。

          4,消费者断线会自动根据上一次记录在zookeeper中的offset 去接着获取数据(默认设置 1 分钟更新一下zookeeper中存的offset)

          5,可以使用group来区分对同一个topic的不同程度访问分离开来(不同的group记录不同的offset,这样不同的程序读取同一个topic 才不会因为offset互相影响)。

       缺点:

           1,不能自己控制offset(对于默写特殊需求来说)

           2,不能细化控制如分区,副本,zk 等。

2)低级API

       优点:

            1,能够开发者自己控制offset,想从哪里读取就从哪里读取。

            2,对zookeeper的依赖性降低(如:offset不一定非要靠zk存储,自行存储offset即可,比如存在文件或者内存中)

       缺点:

            1,太过复杂,需要自行控制offset, 链接那个分区,找到分区leader等。

 

3)producer 可以指定topic 或者parttion 进行消息的发送,以及消息发送成功后的回调,也可以创建拦截器对消息发送前进行拦截,对消息结构进行处理,也可以在消费发送后进行拦截处理,比如记录一下发送成功消息个数,发送失败的个数,或者那些消息成功,那些消息失败。

 

kafka streaming

概述:kafka stream 是 开源项目kafka 的一个组成部分,是一个功能强大,易于使用的库,用于在kafka上构建可分布式,拓展性,容错的应用程序。

特点:

功能强大:高扩展性,弹性,容错。

轻量级:无需专门的集群,一个库, 非服务。

完全集成:100%的kafka1.10.0 版本兼容,易于集成到现有的应用程序

实时性:毫秒级延迟,并非微批处理,窗口允许乱序数据,允许迟到数据

 

为什么要有kafka  stream?

1,spark 和 storm 都是流式处理框架,都是需要提前搭建好server集群, 而kafka stream 是流式处理类库。其次spark ,storm,flink 在线调试成本高,使用受限制,而kafka stream 更加灵活。

2,kafka stream 作为类库,可以很方便的嵌入到 应用程序中,打包和部署基本没有任何要求。

3,就流式处理系统而言,基本都支持kafka 作为数据源。例如storm , flink , sprak , 大部分流式系统中都已部署了kafka, 此时使用kafka steam 的成本非常低。

4,storm 或者spark streaming 需要自身预留出资源,而kafka 作为类库不占系统资源。

5,因为kafka 本身提供数据持久化,因此kafka steam 提供滚动部署和滚动升级以及重新计算的能力。

6,由于kafka consumer rebalance 机制,kafka stream 可以在线动态调整并行度

 

链接: https://pan.baidu.com/s/1AwwOwLr3v70pQx_rjGaGKQ 提取码: gdpm 复制这段内容后打开百度网盘手机App,操作更方便哦

 

你可能感兴趣的:(kafka)