Kafka学习(1)——kafka综述

在公司做数据推送时,开始接触kafka。由于那一套kafka数据推送的框架并不是笔者本人搭建的,因此只是停留在浅显的使用上。

学技术就是这样,不会、没见过、看不懂,官方英文文档就像婆娘的裹脚布又臭又长等等,这些困难都别怕。技术就像一个工具,先浅显的用,用的大致熟了,再去了解这个工具,等深入了解了,再去总结归纳这个工具,最后有能力者,改进这个工具。

本次关于kafka学习的笔记,将分为四个部分进行:

  1. kafka综述:简要归纳kafka是什么
  2. 本地运行:从github上把kafka项目拉下来,本地命令行运行
  3. Kafka Manager: github上开源的kafka管理工具,为kafka消息的发送接收提供可视化操作界面
  4. write demo:写自己的producerconsumer,并简单地应用kafka

kafka是什么呢?

kafka是一个分布式、可分区的消息系统。之前看过一篇博客,比喻的很好。发消息的系统是生产者(producer),而接收消息的系统是消费者(consumer),如果把消息比喻为鸡蛋,那么生产者就是母鸡,而消费者可以理解为吃鸡蛋的人。母鸡下一个蛋,人就吃一个蛋,很和谐。如果人吃鸡蛋的时候噎住了(系统宕机了),那母鸡后面下的蛋就会丢失(数据丢失了),而如果母鸡下蛋速度超过人吃鸡蛋的速度,那人就会吃不消,消息就会堵塞,导致系统超时,鸡蛋又会丢失。这个时候就需要一个篮子,把鸡蛋周转一下。kafka就是这样一个篮子。

好吧,具体先根据我自己在做的业务来分析吧。“数据推送”是企业级应用比较常见一个功能,将数据从一个系统中推送到另一个系统中,可以用spring 的Integration来实现,而应用kafka是一个更好的解决方案。

我们把要推送数据的主键(id)、操作类型(update、delete等)、关键字(key:表示是哪个实体对应的数据)封装为一个model,把这个model当做消息发送给kafka,而消费者从kafka主动pull这个model,消费者拿到model后,解析它,并根据解析的model直接、主动从生产者那儿读取所要推送的数据。

这样做的好处显而易见,生产者那边推送会非常快,因为只需要推送一个model即可,用户就可以去做其他事情了。此外,要推送的数据也不会丢失,因为消息(model)被安全的保存在kafka中,如果消费者没有成功保存数据,那么再去读这个消息即可。这得益于kafka的优良设计。

kafka名词解释
  • producer 生产者,主动发消息的系统(下蛋的母鸡)
  • consumer 消费者,主动向kafka读消息的系统(吃蛋的人)
  • topic 主题,可以理解为向鸡蛋上贴一个标签,吃蛋的人不是每个鸡蛋都吃,它只吃某个topic的鸡蛋。
    -broker可以理解为篮子
  • partition 分区,kafka对于一个topic会有多个分区去保存消息。
  • offset偏移量,是一个整数,就像指针,这个偏移量是消费者去控制的,偏移量指着几,就去读分区上的对应数字的消息。一个分区、一个消费者对应一个offset。
Kafka学习(1)——kafka综述_第1张图片
一个topic有多个分区,这里有三个,每个分区存储很多消息

分区可以处理更多的消息,不受单台服务器的限制;分区可以作为并行处理的单元

kafka 分布式(Distribution)

一个topic的分区被分布到集群中的多个服务器上。每个服务器处理它分到的分区。 根据配置每个分区还可以复制到其它服务器作为备份容错。 每个分区有一个leader,零或多个follower。Leader处理此分区的所有的读写请求,而follower被动的复制数据。如果leader宕机,其它的一个follower会被推举为新的leader。 一台服务器可能同时是一个分区的leader,另一个分区的follower。 这样可以平衡负载,避免所有的请求都只让一台或者某几台服务器处理。

生产者往某个Topic上发布消息。生产者也负责选择发布到Topic上的哪一个分区。最简单的方式从分区列表中轮流选择。也可以根据某种算法依照权重选择分区。开发者负责如何选择分区的算法。

通常来讲,消息模型可以分为两种, 队列和发布-订阅式。 队列的处理方式是 一组消费者从服务器读取消息,一条消息只有其中的一个消费者来处理。在发布-订阅模型中,消息被广播给所有的消费者,接收到消息的消费者都可以处理此消息。Kafka为这两种模型提供了单一的消费者抽象模型: 消费者组 (consumer group)。 消费者用一个消费者组名标记自己。 一个发布在Topic上消息被分发给此消费者组中的一个消费者。 假如所有的消费者都在一个组中,那么这就变成了queue模型。 假如所有的消费者都在不同的组中,那么就完全变成了发布-订阅模型。 更通用的, 我们可以创建一些消费者组作为逻辑上的订阅者。每个组包含数目不等的消费者, 一个组内多个消费者可以用来扩展性能和容错。正如下图所示:

Kafka学习(1)——kafka综述_第2张图片
一个集群包含两个server,每个server包含两个分区;两个消费者组

通过并行topic的parition —— kafka提供了顺序保证和负载均衡。每个partition仅由同一个消费者组中的一个消费者消费到。并确保消费者是该partition的唯一消费者,并按顺序消费数据。每个topic有多个分区,则需要对多个消费者做负载均衡,但请注意,相同的消费者组中不能有比分区更多的消费者,否则多出的消费者一直处于空等待,不会收到消息。

也就是说,在一个消费者组中,消费者与分区是一对多的关系。

关于kafka更多的信息,请参见这里。

你可能感兴趣的:(Kafka学习(1)——kafka综述)