zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

kafka 的基本概念及使用场景

2023-04-18 13:11:42 时间

本文为博主原创,未经允许不得转载:

1. Kafka 的使用场景:

  1.日志收集:一个公司可以用Kafka收集各种服务的log,通过kafka以统一接口服务的方式开放给各种 consumer,例如hadoop、Hbase、Solr等。

  2. 消息系统:解耦和生产者和消费者、缓存消息等。

  3. 用户活动跟踪:Kafka经常被用来记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后订阅者通过

    订阅这些topic来做实时的监控分析,或者装载到hadoop、数据仓库中做离线分析和挖掘。

  4. 运营指标:Kafka也经常用来记录运营监控数据。

2. 基本概念:

  kafka是一个分布式的,分区的消息(官方称之为commit log)服务。

  Broker :消息中间件处理节点,一个Kafka节点就是一个broker,一个或者多个Broker可以组成一个Kafka集群

  Topic : Kafka根据topic对消息进行归类,发布到Kafka集群的每条消息都需要指定一个topic

  Producer : 消息生产者,向Broker发送消息的客户端

  Consumer : 消息消费者,从Broker读取消息的客户端

  ConsumerGroup : 每个Consumer属于一个特定的ConsumerGroup,一条消息可以被多个不同的Consumer Group消费,

    但是一个Consumer Group中只能有一个Consumer能够消费该消息

  Partition : 物理上的概念,一个topic可以分为多个partition,每个partition内部消息是有序的

  

  producer通过网络发送消息到Kafka集群,然后consumer来进行消费,

  服务端(brokers)和客户端(producer、consumer)之间通信通过TCP协议来完成。

  

  Partition是一个有序的message序列,这些message按顺序添加到一个叫做commit log的文件中。

  每个partition中的消息都有一个唯一的编号,称之为offset,用来唯一标示某个分区中的message。

  提示:每个partition,都对应一个commit log文件。一个partition中的message的offset都是唯一的,但是不同的partition中的message的offset可能是相同的。

 

  每个consumer是基于自己在commit log中的消费进度(offset)来进行工作的。在kafka中,消费offset由consumer自己来维护

  一般情况下我们按照顺序逐条消费commit log中的消息,当然我可以通过指定offset来重复消费某些消息,或者跳过某些消息

 

  这意味kafka中的consumer对集群的影响是非常小的,添加一个或者减少一个consumer,对于集群或者其他consumer来说,都是没有影响的,

因为每个consumer维护各自的offset。所以说kafka集群是无状态的,性能不会因为consumer数量受太多影响。

  kafka还将很多关键信息记录在zookeeper里,保证自己的无状态,从而在水平扩容时非常方便。

 

  为什么要对Topic下数据进行分区存储?

    1、commit log文件会受到所在机器的文件系统大小的限制,分区之后,理论上一个topic可以处理任意数量的数据。
    2、为了提高并行度。

 

  Producers

    生产者将消息发送到topic中去,同时负责选择将message发送到topic的哪一个partition中。通过 round­robin 做简单的负载均衡。
  也可以根据消息中的某一个关键字来进行区分。通常第二种方式使用的更多。

 

  Consumers

    传统的消息传递模式有2种:队列( queue) 和(publish-subscribe)
    queue模式:多个consumer从服务器中读取数据,消息只会到达一个consumer。 所有的consumer都位于同一个consumer group 下。
    publish-subscribe模式:消息会被广播给所有的consumer。所有的consumer都有着自己唯一的consumer group

  

  消费顺序

    Kafka比传统的消息系统有着更强的顺序保证。一个partition同一个时刻在一个consumer group中只有一个consumer instance在消费,
  从而保证顺序。consumer group中的consumer instance的数量不能比一个Topic中的partition的数量多,否则,多出来的consumer消费不到消息。

    Kafka只在partition的范围内保证消息消费的局部顺序性,不能在同一个topic中的多个partition中保证总的消费顺序性。