什么是Kafka最原始的消息模型

发布时间:2021-10-15 10:04:35 作者:iii
来源:亿速云 阅读:171

本篇内容介绍了“什么是Kafka最原始的消息模型”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

01 为什么从 Kafka 开始?

《吃透 MQ 》的开篇 围绕 MQ 「一发一存一消费」的本质展开,讲解了 MQ 的通用知识,同时系统性地回答了:如何着手设计一个 MQ?

从这篇文章开始,我会讲解具体的消息中间件,之所以选择从 Kafka 开始,有 3 点考虑:

第一,RocketMQ 和 Kafka 是目前最热门的两种消息中间件,互联网公司应用最为广泛,将作为本系列的重点。

第二,从 MQ 的发展历程来看,Kafka 先于 RocketMQ 诞生,并且阿里团队在实现 RocketMQ 时,充分借鉴了 Kafka  的设计思想。掌握了 Kafka 的设计原理,后面再去理解 RocketMQ 会容易很多。

什么是Kafka最原始的消息模型

第三,Kafka 其实是一个轻量级的 MQ,它具备 MQ 最基础的能力,但是在延迟队列、重试机制等高级特性上并未做支持,因此降低了实现复杂度。从  Kafka 入手,有利于大家快速掌握 MQ 最核心的东西。

交代完背景,下面请大家跟着我的思路,一起由浅入深地分析下 Kafka。

02 扒开 Kafka 的面纱

在深入分析一门技术之前,不建议上来就去了解架构以及技术细节,而是先弄清楚它是什么?它是为了解决什么问题而产生的?

掌握这些背景知识后,有利于我们理解它背后的设计考虑以及设计思想。

在写这篇文章时,我查阅了很多资料,关于 Kafka 的定义可以说五花八门,不仔细推敲很容易懵圈,我觉得有必要带大家捋一捋。

我们先看看 Kafka 官网给自己下的定义:

翻译成中文就是:Apache Kafka 是一个开源的分布式流处理平台。

Kafka 不是一个消息系统吗?为什么被称为分布式的流处理平台呢?这两者是一回事吗?

一定有读者会有这样的疑问,要解释这个问题,需要先从 Kafka 的诞生背景说起。

Kafka 最开始其实是 Linkedin 内部孵化的项目,在设计之初是被当做「数据管道」,用于处理以下两种场景:

可以看到这两种数据都属于日志范畴,特点是:数据实时生产,而且数据量很大。

Linkedin 最初也尝试过用 ActiveMQ 来解决数据传输问题,但是性能无法满足要求,然后才决定自研 Kafka。

所以从一开始,Kafka 就是为实时日志流而生的。了解了这个背景,就不难理解 Kafka 与流数据的关系了,以及 Kafka  为什么在大数据领域有如此广泛的应用?也是因为它最初就是为解决大数据的管道问题而诞生的。

接着再解释下:为什么 Kafka 被官方定义成流处理平台呢?它不就提供了一个数据通道能力吗,怎么还和平台扯上关系了?

这是因为 Kafka 从 0.8 版本开始,就已经在提供一些和数据处理有关的组件了,比如:

可见 Kafka 的野心不仅仅是一个消息系统,它早就在往「实时流处理平台」方向发展了。

这时候,再回来看 Kafka 的官网介绍提到的 3 种能力,也不难理解了:

这样,kafka 的发展历史和定义基本缕清了。当然,这个系列仅仅关注 Kafka 的前两种能力,因为这两种能力都和 MQ 强相关。

03 从 Kafka的消息模型说起

理解了 Kafka 的定位以及它的诞生背景,接着我们分析下 Kafka 的设计思想。

上篇文章中我提到过:要吃透一个MQ,建议从「消息模型」这种最核心的理论层面入手,而不是一上来就去看技术架构,更不要直接进入技术细节。

所谓消息模型,可以理解成一种逻辑结构,它是技术架构再往上的一层抽象,往往隐含了最核心的设计思想。

下面我们尝试分析下 Kafka 的消息模型,看看它究竟是如何演化来的?

首先,为了将一份消息数据分发给多个消费者,并且每个消费者都能收到全量的消息,很自然的想到了广播。

什么是Kafka最原始的消息模型

紧接着问题出现了:来一条消息,就广播给所有消费者,但并非每个消费者都想要全部的消息,比如消费者 A 只想要消息1、2、3,消费者 B  只想要消息4、5、6,这时候该怎么办呢?

什么是Kafka最原始的消息模型

这个问题的关键点在于:MQ 不理解消息的语义,它根本无法做到对消息进行分类投递。

此时,MQ 想到了一个很聪明的办法:它将难题直接抛给了生产者,要求生产者在发送消息时,对消息进行逻辑上的分类,因此就演进出了我们熟知的 Topic  以及发布-订阅模型。

什么是Kafka最原始的消息模型

这样,消费者只需要订阅自己感兴趣的 Topic,然后从 Topic 中获取消息即可。

但是这样做了之后,仍然存在一个问题:假如多个消费者都对同一个 Topic 感兴趣(如下图中的消费者 C),那又该如何解决呢?

什么是Kafka最原始的消息模型

如果采用传统的队列模式(单播),那当一个消费者从队列中取走消息后,这条消息就会被删除,另外一个消费者就拿不到了。

这个时候,很自然又想到下面的解决方案:

什么是Kafka最原始的消息模型

也就是:当 Topic 每增加一个新的消费者,就「复制」一个完全一样的数据队列。

这样问题是解决了,但是随着下游消费者数量变多,将引发 MQ 性能的快速退化。尤其对于 Kafka  来说,它在诞生之初就是处理大数据场景的,这种复制操作显然成本太高了。

这时候,就有了 Kafka 最画龙点睛的一个解法:它将所有消息进行了持久化存储,由消费者自己各取所需,想取哪个消息,想什么时候取都行,只需要传递一个消息的  offset 即可。

什么是Kafka最原始的消息模型

这样一个根本性改变,彻底将复杂的消费问题又转嫁给消费者了,这样使得 Kafka 本身的复杂度大大降低,从而为它的高性能和高扩展打下了良好的基础。(这是  Kafka 不同于 ActiveMQ 和 RabbitMQ 最核心的地方)

最后,简化一下,就是下面这张图:

什么是Kafka最原始的消息模型

“什么是Kafka最原始的消息模型”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

推荐阅读:
  1. 什么是Kafka?
  2. Kafka是如何处理Netflix每天2万亿条消息的

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

kafka

上一篇:Guava和Spring怎么抽象观察者模式

下一篇:CORS实现模型有哪些

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》