Kafka-简介(1)

本文是参照官方文档翻译,加上一些自己的理解,记录一下

Apache Kafka是一个分布式流媒体平台,可以进行消息存储,消息传递和流处理。

流媒体平台有三个关键功能:

  • 发布和订阅记录流,类似于消息队列或企业消息传递系统。

  • 以容错的持久方式存储记录流。

  • 记录流出现时进行处理。

Kafka通常用于两大类应用:

  • 构建可在系统或应用程序之间可靠获取数据的实时流数据管道

  • 构建转换或响应数据流的实时流应用程序

  • 几个概念:

    • Kafka是运行在一个集群上,所以它可以拥有一个或多个服务节点;

    • Kafka集群将消息存储在特定的文件中,对外表现为Topics,以topic为类别存储记录流。

    • 每条消息记录都包含一个key,消息内容value以及时间戳;

Kafka提供了四大核心接口:

  • Producer API:允许应用可以向Kafka中的一个或多个topics发布消息;

  • Consumer API:允许应用可以订阅Kafka中的一个或多个topics,并消费订阅的消息;

  • Streams API:允许应用可以作为消息流的处理者,从一个或多个topics消费一个输入流,然后产生一个输出流 发布到一个或多个topics,有效把输入流转换为输出流。比如可以从topicA中消费消息,处理的结果发布到topicB中;

  • Connector API:提供Kafka与现有的应用或系统适配功能,比如与数据库连接器可以捕获表结构的变化;

它们与Kafka集群的关系可以用下图表示:
在这里插入图片描述
在Kafka中,客户端和服务器之间的通信是通过简单,高性能,语言无关的TCP协议完成的。

kafka主要组成

1. Topics - Kafka为记录流提供的核心抽象

Topics是发布记录的类别或订阅源名称,更通俗的说Topic就像一个消息队列,生产者可以向其写入消息,消费者可以从中读取消息,一个Topic支持多个生产者或消费者同时订阅它,所以其扩展性很好。Topic又可以由一个或多个partition(分区)组成,比如下图:
在这里插入图片描述

  • 每个分区都是一个有序的,不可变的记录序列,记录不断附加到结构化的提交日志中。
  • 分区中的记录每个都被分配一个称为偏移offset的顺序ID号,它唯一地标识分区中的每个记录。
  • 每个partition中的消息是有序的,但相互之间的顺序就不能保证了
  • 若Topic有多个partition,生产者的消息可以指定或者由系统根据算法分配到指定分区
  • Kafka集群使用可配置的保留期,持久地保留所有已发布的记录 ,无论它们是否已被消耗 。例如,如果保留策略设置为两天,则在发布记录后的两天内,它可供使用,之后将被丢弃以释放空间。
    在这里插入图片描述

事实上,**基于每个消费者保留的唯一元数据是该消费者在日志中的偏移或位置。**这种偏移由消费者控制:通常消费者在读取记录时会线性地提高其偏移量。

由上图可以看出,不同消费者对同一分区的消息读取互不干扰,消费者可以通过设置消息位移(offset)来控制自己想要获取的数据,比如可以从头读取,最新数据读取,重读读取等功能。

2,Distribution

日志的分区分布在Kafka集群中的服务器上,每个服务器处理数据并请求分区的共享。每个分区都在可配置数量的服务器上进行复制,以实现容错。

每个分区都有一个服务器充当"leader",零个或多个服务器充当 “followers”。"leader"处理分区的所有读取和写入请求,而 “followers"被动地复制领导者。如果"leader"失败,其中一个"followers"将自动成为新的"leader”。每个服务器都充当其某些分区的领导者和其他服务器的追随者,因此负载在群集中很平衡。

3,Geo-Replication

异地备份是作为主流分布式系统的基础功能,用于集群中数据的备份和恢复,Kafka利用MirrorMaker来实现这个功能,用户只需简单的进行相应配置即可。

4,Producers

Producers作为消息的生产者,将数据发布到他们选择的Topic中的指定分区。为了平衡负载,这可以通过循环方式完成,或者可以根据一些语义分区功能(例如基于记录中的某些键)来完成。

5,Consumers

  • consumer group 是一群消费者的集合,可以称之为消费者组,是一种更高层次的的抽象,向Topic订阅消费消息的单位是consumer group,当然它其中也可以只有一个消费者(consumer)。
  • 假如所有消费者都在同一个消费者组中,那么它们将协同消费订阅的消息(根据分区与消费者的数量分配), 保持负载平衡;
  • 假如所有消费者都在不同的消费者组中,那么消息记录会被广播给每个消费者;
    如下图:
    在这里插入图片描述

上图中的一个Topic有四个分区,P0和P1分布在server1,P2和P3分布在server2,此外,有消费组A和B,A中有两个消费者实例,B中有四个消费者实例。

从图中我们可以看出,订阅Topic的单位是消费者组,Topic中的消息推送给具体消费者,有以下情况:

  • 若消费者组里消费者数为一个,那么它就消费所有订阅的消息;
  • 若消费者组里消费者数小于分区数,假设消费者数为N,分区数为M,那么每个消费者能消费的分区数为M/N或M/N+1;
  • 若消费者数等于分区数,那么每个消费者都会均等分配到一个分区的消息;
  • 若消费者数大于分区数,则将会出现部分消费者得不到消息分区,需要排队等待的情况;

总的来说,Kafka会根据消费者组的情况均衡分配消息,比如有消息着实例宕机,亦或者有新的消费者加入等情况。

6,Guarantees

高级别kafka提供了以下的保证:

  • 消息的添加是有序的,生产者较早向特定Topic发送的消息,会更早的被添加到Topic中,具有更小的偏移,在日志中出现的更早;

  • 消费者在消费Topic分区中的消息时是有序的,可以按在日志中存储顺序查看;

  • 对于有复制因子N的Topic,系统可以最多容忍N-1个节点发生故障,而不丢失任何提交到日志的记录;

7,Kafka as a Messaging System

Kafka相比其他的消息系统优势具体在哪里?

  • 传统的消息系统模型主要有两种:

    1.消息队列

  • 表现形式:一组消费者从消息队列中获取消息,消息会被推送给组中的某一个消费者

    • 优势:水平扩展,可以将消息数据分开处理
  • 劣势:消息队列不是多用户的,当一条消息记录被一个进程读取后,消息便会丢失

    2.发布/订阅

  • 表现形式:消息会广播发送给所有消费者

  • 优势 :可以多进程共享消息

  • 劣势: 每个消费者都会获得所有消息,无法通过添加消费进程提高处理效率

  • Kafka

  • 通过Topic方式来达到消息队列的功能,使用消费者组允许您将处理划分为一组进程(消费者组的成员)。通过将主题中的分区分配给消费者组中的消费者来实现的,以便每个分区仅由该组中的一个消费者使用。

  • 与发布 - 订阅一样,Kafka允许您向多个消费者组广播消息,通过消费者组这种方式来达到发布/订阅的功能。

  • 通过在主题中实现并行性概念 - 分区 ,Kafka能够在消费者流程池中提供订购保证和负载平衡。但请注意,消费者组中的消费者实例不能超过分区。

8,Kafka for Stream Processing

存储消息也是消息系统的一大功能,Kafka相对普通的消息队列存储来说,它的表现实在好的太多。

  • 首先Kafka支持写入确认,保证消息写入的正确性和连续性
  • 同时Kafka还会对写入磁盘的数据进行复制备份,来实现容错,
  • 另外Kafka对磁盘的使用结构是一致的,不管你的服务器目前磁盘存储的消息数据有多少,它添加消息数据的效率是相同的。
  • Kafka的存储机制很好的支持消费者可以随意控制自身所需要读取的数据,也可以将Kafka作为一个高性能,低延迟的分布式文件系统。

9,Kafka for Stream Processing

仅仅读取,写入和存储数据流是不够的,目的是实现流的实时处理。
很多时候原始的数据并不是我们想要的,我们想要的是经过处理后的数据结果,比如通过一天的搜索数据得出当天的搜索热点等,你可以利用Streams API来进行复杂转换,这允许构建执行非平凡处理的应用程序,这些应用程序可以计算流的聚合或将流连接在一起。比如从输入Topic中获取数据流进行处理,然后再发布输出流到具体的输出Topic中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值