慌了青春,失了爱

导航

kafka简单学习

一、kafka介绍

kafka

    Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。 对于像Hadoop的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka的目的是通过Hadoop的并行加载机制来统一线上和离线的消息处理,也是为了通过集群来提供实时的消费。

特性

Kafka  是一种高吞吐量 的分布式发布订阅消息系统,有如下特性:
  • 通过磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能。
  • 高吞吐量:即使是非常普通的硬件Kafka也可以支持每秒数百万的消息。
  • 支持通过Kafka服务器和消费机集群来分区消息。
  • 支持Hadoop并行数据加载。
Kafka的使用场景

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

(2)消息系统:解耦和生产者和消费者、缓存消息等;

(3)用户活动跟踪:Kafka经常被用来记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后订阅者通过订阅这些topic来做实时的监控分析,或者装载到Hadoop、数据仓库中做离线分析和挖掘;

(4)运营指标:Kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告;

(5)流式处理:比如spark streaming和storm;

(6)事件源;

二、kafka相关术语

1.topics:《主题》

   数据存储在主题中,主题可被拆分成分区

2.partition:《分区》

   主题可能有许多的分区,因此可以处理任意数量的数据

3.replica

   partition的副本,保障partition的高可用

4.follower

   replica中的一个角色,从leader中复制数据

5.leader

    replica中的一个角色,producer和consumer只跟leader交互

6.partition offest :《分区偏移》

    每个分区消息具有称为“offest”的唯一序列标识

7.brokers:《经纪人(代理)》

   a.每个代理中的每个主题可以具有零个或者多个分区

   b.一个kafka代理实例每秒处理数十万数据的读入与写出

   c.每个kafka代理实例可以处理TB的消息,而没有性能的影响

8.kafka cluster:《kafka集群》

   a.kafka有多个代理,被称为kafka集群。可以扩展kafka集群,无需停机

   b.这些集群用于管理消息数据的持久性和复制

   c.kafka的代理是无状态的,所以他们使用zookeeper来维护他们的集群状态

   d.kafka的经纪人选举可以由zookeeper来完成

9.zookeeper

   用于管理和协调kafka代理。zookeeper服务主要用于通知生产者和消费者kafka系统中存在任何新的代理或kafka系统中的代理失败。

    根据zookeeper接收到的关于代理的存在或失败的通知,然后生产者和消费者采取决定并开始与某些代理协调他们的任务。

10.producers:《生产者》

    生产者是发送主题的发布者

    生产者将消息发送到Server端的Topic,并且有其自行决定发往哪个分区。对于分区选择算法可以简单的进行随机选取,可以基于一个分区函数来进行分区,一般基于分区函数的方式更好。

11.consumers:《消费者》

   从代理处读取数据。一次可以读取一个或者多个

   通常情况下,在消息系统中发布消息有两种方式:

         一种基于队列,在基于队列的方式下,消费者被一个消费者池统一管理,消费者从队列中顺序消费数据,并且,一条消息只能被其中一个消费者读取到。

         另一种基于发布-订阅。在发布-订阅模式下,消息被广播给所有的消费者。

         Kafka提供了一种单一的消费者抽象-消费者组(Consumer Group),它可以兼顾队列和发布-订阅两种模式。

         每个消费者会被一个消费组(Consumer group)标识,被发布到Topic中的消息会被属于同一个消费组的多个消费者中的一个消费,一个消费组中的消费者可以是不同的程序或者在不同的物理机器上运行。

         当所有消费者属于同一个消费组时,就是基于队列的消息系统的实现,当所有消费者都属于不同的消费组时,就是基于发布-订阅的消息系统的实现。

12.Consumergroup:《消费者组》

      各个consumer可以组成一个组,每个消息只能被组中的一个consumer消费,如果一个消息可以被多个consumer消费的话,那么这些consumer必须在不同的组。

三、kafka架构

四、基于队列的工作流程

    在基于队列中,消息被保留在队列中。 一个或多个消费者可以消耗队列中的消息,但是特定消息只能由最多一个消费者消费。 一旦消费者读取队列中的消息,它就从该队列中消失。 该系统的典型示例是订单处理系统,其中每个订单将由一个订单处理器处理,但多个订单处理器也可以同时工作。 下图描述了结构。

五、发布—订阅消息的工作流程

   1.生产者定期向主题发送消息

   2.kafka代理存储为该特定主题配置的分区中的所有消息。他确保消息在分区之间平等共享。如果生产者发送两个消息并且有两个分区,kafka将在第一个分区中存储一个消息,在第二个分区中存储第二个人消息

   3.消费者订阅特定主题

   4. 一旦消费者订阅主题,kafka将向消费者提供主题的当前偏移,并且还将偏移保存在zookeeper系统中

   5.消费者将定期请求kafka(如100s)新消息

   6.一旦kafka收到来自生产者的消息,它将这些消息转发给消费者

   7.消费者将收到的消息进行处理

   8.一旦消息被处理,消费者将向kafka代理发送确认

   9.一旦kafka收到确认,它将偏移量更改为新值,并在zookeeper中更新他。由于已在zookeeper中维护,消费者便可以正确的读取下一封邮件,即使在服务器暴力期间

   10.以上流程将重复,直到消费者停止请求

   11.消费者可以随时退回/跳到所需的主题偏移量,并阅读所有的后续消息

如下图:

在上图中,主题配置为三个分区。 分区1具有两个偏移因子0和1.分区2具有四个偏移因子0,1,2和3.分区3具有一个偏移因子0.副本的id与承载它的服务器的id相同。

假设,如果主题的复制因子设置为3,那么Kafka将创建每个分区的3个相同的副本,并将它们放在集群中以使其可用于其所有操作。 为了平衡集群中的负载,每个代理都存储一个或多个这些分区。 多个生产者和消费者可以同时发布和检索消息。

 

posted on 2018-02-05 17:30  慌了青春,失了爱  阅读(87)  评论(0)    收藏  举报