我是靠谱客的博主 义气蜜粉,最近开发中收集的这篇文章主要介绍Kafka初步了解原理kafka的学习之路,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

kafka的学习之路

kafka目前是很火的消息传送组件,应用在各种复杂的环境下处理数据,具有横向扩展,容错,wicked fast(变态快)等优点,并已在成千上万家公司运行。
该篇文章将说明Kafka的一些原理构造,及在大数据中的框架部分,附带案例。

在这里插入图片描述

什么是Kafka?

Apache kafka是消息中间件的一种,我发现很多人不知道消息中间件是什么,在开始学习之前,我这边就先简单的解释一下什么是消息中间件,只是粗略的讲解,目前kafka已经可以做更多的事情。

举个例子,生产者消费者,生产者生产鸡蛋,消费者消费鸡蛋,生产者生产一个鸡蛋,消费者就消费一个鸡蛋,假设消费者消费鸡蛋的时候噎住了(系统宕机了),生产者还在生产鸡蛋,那新生产的鸡蛋就丢失了。

再比如生产者很强劲(大交易量的情况),生产者1秒钟生产100个鸡蛋,消费者1秒钟只能吃50个鸡蛋,那要不了一会,消费者就吃不消了(消息堵塞,最终导致系统超时),消费者拒绝再吃了,”鸡蛋“又丢失了,这个时候我们放个篮子在它们中间,生产出来的鸡蛋都放到篮子里,消费者去篮子里拿鸡蛋,这样鸡蛋就不会丢失了,都在篮子里,而这个篮子就是”kafka“。

鸡蛋其实就是“数据流”,系统之间的交互都是通过“数据流”来传输的(就是tcp、https什么的),也称为报文,也叫“消息”。

消息队列满了,其实就是篮子满了,”鸡蛋“ 放不下了,那赶紧多放几个篮子,其实就是kafka的扩容。
各位现在知道kafka是干什么的了吧,它就是那个"篮子"。

图有点丑,别笑,认真领悟精神
在这里插入图片描述
好的,到这里我相信各位读者应该心里有点kafka的样子了,那么下面我们将更深入的去学习了解kafka。

在这里插入图片描述

Kafka用在哪?

它被用于两大类应用:

  1. 建立实时流数据管道从而能够可靠地在系统或应用程序之间的共享数据
  2. 构建实时流应用程序,能够变换或者对数据
  3. 进行相应的处理。

想要具体了解Kakfa的这些能力,必须要了解如下几个概念:

  1. Kafka是运行在一个或多个服务器的集群(Cluster)上的。
  2. Kafka集群分类存储的记录流被称为主题(Topics)。
  3. 每个消息记录包含一个键,一个值和时间戳。

Kafka有四个核心API:

  • 生产者 API 允许应用程序发布记录流至一个或多个Kafka的话题(Topics)。
  • 消费者API允许应用程序订阅一个或多个主题,并处理这些主题接收到的记录流。
  • Streams API允许应用程序充当流处理器(stream
    processor),从一个或多个主题获取输入流,并生产一个输出流至一个或多个的主题,能够有效地变换输入流为输出流。
  • Connector API允许构建和运行可重用的生产者或消费者,能够把
    Kafka主题连接到现有的应用程序或数据系统。例如,一个连接到关系数据库的连接器(connector)可能会获取每个表的变化。

Kafka的客户端和服务器之间的通信是靠一个简单的,高性能的,与语言无关的TCP协议完成的。这个协议有不同的版本,并保持向后兼容旧版本(向前兼容旧版本?)。Kafka不光提供了一个Java客户端,还有许多语言版本的客户端。

在这里插入图片描述

Kafka怎么用——主题(Topic)?

主题是一种分类或发布的一系列记录的名义上的名字。Kafka的主题始终是支持多用户订阅的; 也就是说,一个主题可以有零个,一个或多个消费者订阅写入的数据。
主题相当于我们存储数据的一种方式,对于每一个主题,Kafka集群保持一个分区日志文件,如下图:
在这里插入图片描述
由图可以看到,一个Topic中包含多个Paetition,并且每个patition会有一个偏移量,能够谓一地标识该分区中的每个记录。

Kafka集群保留所有发布的记录,不管这个记录有没有被消费过,Kafka提供可配置的保留策略去删除旧数据(还有一种策略根据分区大小删除数据)。例如,如果将保留策略设置为两天,在记录公布后两天,它可用于消费,之后它将被丢弃以腾出空间。Kafka的性能跟存储的数据量的大小无关, 所以将数据存储很长一段时间是没有问题的。
在这里插入图片描述

事实上,保留在每个消费者元数据中的最基础的数据就是消费者正在处理的当前记录的偏移量(offset)或位置(position)。这种偏移是由消费者控制:通常偏移会随着消费者读取记录线性前进,但事实上,因为其位置是由消费者进行控制,消费者可以在任何它喜欢的位置读取记录。例如,消费者可以恢复到旧的偏移量对过去的数据再加工或者直接跳到最新的记录,并消费从“现在”开始的新的记录。

这些功能的结合意味着,实现Kafka的消费者的代价都是很小的,他们可以增加或者减少而不会对集群或其他消费者有太大影响。例如,你可以使用我们的命令行工具去追随任何主题,而且不会改变任何现有的消费者消费的记录。

数据日志的分区,一举数得。首先,它们允许数据能够扩展到更多的服务器上去。每个单独的分区的大小受到承载它的服务器的限制,但一个话题可能有很多分区,以便它能够支持海量的的数据。其次,更重要的意义是分区是进行并行处理的基础单元。

在这里插入图片描述

分布式

生产者发布数据到他们所选择的主题。生产者负责选择把记录分配到主题中的哪个分区。这可以使用轮询算法( round-robin)进行简单地平衡负载,也可以根据一些更复杂的语义分区算法(比如基于记录一些键值)来完成。

消费者

消费者以消费群(consumer group )的名称来标识自己,每个发布到主题的消息都会发送给订阅了这个主题的消费群里面的一个消费者的一个实例。消费者的实例可以在单独的进程或单独的机器上。

如果所有的消费者实例都属于相同的消费群,那么记录将有效地被均衡到每个消费者实例。

如果所有的消费者实例有不同的消费群,那么每个消息将被广播到所有的消费者进程。

在这里插入图片描述
两个服务器的Kafka集群具有四个分区(P0-P3)和两个消费群。A消费群有两个消费者,B群有四个。

更常见的是,我们会发现主题有少量的消费群,每一个都是“逻辑上的订阅者”。每组都是由很多消费者实例组成,从而实现可扩展性和容错性。这只不过是发布 – 订阅模式的再现,区别是这里的订阅者是一组消费者而不是一个单一的进程的消费者。

Kafka消费群的实现方式是通过分割日志的分区,分给每个Consumer实例,使每个实例在任何时间点的都可以“公平分享”独占的分区。维持消费群中的成员关系的这个过程是通过Kafka动态协议处理。如果新的实例加入该组,他将接管该组的其他成员的一些分区; 如果一个实例死亡,其分区将被分配到剩余的实例。

Kafka只保证一个分区内的消息有序,不能保证一个主题的不同分区之间的消息有序。分区的消息有序与依靠主键进行数据分区的能力相结合足以满足大多数应用的要求。但是,如果你想要保证所有的消息都绝对有序可以只为一个主题分配一个分区,虽然这将意味着每个消费群同时只能有一个消费进程在消费。

持久化

Kafka提供了以下一些高级别的保证:

  • 由生产者发送到一个特定的主题分区的消息将被以他们被发送的顺序来追加。也就是说,如果一个消息M1和消息M2都来自同一个生产者,M1先发,那么M1将有一个低于M2的偏移,会更早在日志中出现。
  • 消费者看到的记录排序就是记录被存储在日志中的顺序。
  • 对于副本因子N的主题,我们将承受最多N-1次服务器故障切换而不会损失任何的已经保存的记录。

对这些保证的更多细节可以参考文档的设计部分。

有时间在更~

最后

以上就是义气蜜粉为你收集整理的Kafka初步了解原理kafka的学习之路的全部内容,希望文章能够帮你解决Kafka初步了解原理kafka的学习之路所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部