4年前 (2021-03-15)  相关技术 |   抢沙发  989 
文章评分 0 次,平均分 0.0

本文的目的是让大家快速了解Kafka消息队列的关系,以及为什么会考虑使用它。

Kafka是Linkedin最初开发的一项技术。简而言之,它有点像一个消息队列系统,有一些曲折,使它能够支持pub/sub,扩展到多个服务器,并重放消息。

当您想要采用反应式编程风格而不是命令式编程风格时,这些都是您需要考虑的问题。

命令式编程与反应式编程的区别

命令式编程是一种我们都开始使用的编程类型。有些事情发生了,换句话说就是一个事件发生了,并且您的代码会收到该事件的通知。例如,用户单击了一个按钮,您在代码中处理事件的位置决定了该操作对系统的意义。您可以将记录保存到数据库、呼叫其他服务、发送电子邮件或所有这些的组合。这里重要的一点是,事件直接与正在发生的特定操作相耦合。

反应式编程使您能够响应经常以流的形式发生的事件。多个关注点可以订阅同一事件,并让该事件在其域中发挥作用,而不管其他域中发生了什么。换句话说,它允许松散耦合的代码,这些代码可以很容易地用更多的功能进行扩展。在不同的堆栈中编码的各种大型下游系统可能会受到一个事件的影响,甚至会受到云中某个地方执行的一大堆serverless functions(无服务器函数)的影响。

从队列到Kafka

为了理解Kafka将给您的体系结构带来什么,让我们从讨论消息队列开始。我们将从这里开始,因为我们将讨论它的局限性,然后看看Kafka如何解决它们。

消息队列允许一组订阅者从队列的末尾提取一条消息或一批消息。队列通常允许在提取消息时执行某种级别的事务,以确保在删除消息之前执行所需的操作。

并非所有排队系统都具有相同的功能,但一旦消息被处理,它就会从队列中删除。仔细想想,这和命令式编程非常相似,发生了一些事情,原始系统决定某个动作应该在下游系统中发生。

即使您可以扩展队列中的多个使用者,它们都将包含相同的功能,这样做只是为了并行处理加载和处理消息,换句话说,它不允许您基于同一事件启动多个独立操作。队列消息的所有处理器将在同一域中执行相同类型的逻辑。这意味着队列中的消息实际上是适用于命令式编程的命令,而不是适用于反应式编程的事件。

简单明了的介绍Kafka与消息队列的区别

同一域中为队列中的每条消息执行相同的逻辑

另一方面,使用Kafka,可以将消息/事件发布到主题中,并将它们持久化。当消费者收到它们时,它们不会被移除。这允许您重放消息,但更重要的是,它允许多个使用者基于相同的消息/事件处理逻辑。

您仍然可以扩展以在同一个域中获得并行处理,但更重要的是,您可以添加基于同一事件执行不同逻辑的不同类型的使用者。换句话说,使用Kafka,您可以采用一种反应式的pub/sub架构

简单明了的介绍Kafka与消息队列的区别

基于相同的事件,不同的系统可以执行不同的逻辑

这在Kafka上是可能的,因为信息被保留,而且消费者群体的概念。Kafka的消费者群体在询问某个主题的信息时,会向Kafka表明身份。Kafka将记录哪些消息(偏移量)被传递给了哪个消费群体,这样它就不会再发送了。事实上,这比这要复杂一些,因为你有很多配置选项可以控制这一点,但是我们不需要完全探究这些选项,仅仅是为了从更高的层次理解Kafka。

小结

Kafka还有很多内容,例如它如何管理扩展(分区)、可靠消息传递的配置选项等等。但我希望这篇文章足够好,可以让您理解为什么您会考虑在好的消息队列上采用Kafka。

 

除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/1717.html

关于

发表评论

表情 格式

暂无评论

登录

忘记密码 ?

切换登录

注册