如何选择消息队列?Kafka 与 RabbitMQ

在上一期中,我们讨论了使用消息队列的好处。然后,我们回顾了消息队列产品的历史。现在看来,当我们需要在项目中使用消息队列时,Kafka 是首选产品。但是,当我们考虑特定要求时,它并不总是最佳选择。

数据库支持的队列

让我们再次使用我们的星巴克示例。最重要的两个要求是:

  • 异步处理,因此收银员无需等待即可接受下一个订单。

  • 坚持不懈,以便在出现问题时不会错过客户的订单。

消息订购在这里并不重要,因为咖啡机经常制作成批的相同饮料。可扩展性也不那么重要,因为队列仅限于每个星巴克门店。

星巴克队列可以在数据库表中实现。下图显示了它是如何工作的:

当收银员接受订单时,将在数据库支持的队列中创建一个新订单。然后,收银员可以接受另一个订单,而咖啡机则分批接取新订单。订单完成后,咖啡机会在数据库中将其标记为完成。然后,顾客在柜台领取咖啡。

内务管理作业可以在每天结束时运行,以删除已完成的订单(即那些状态为“完成”的订单)。

对于星巴克的用例,一个简单的数据库队列就可以满足要求,而不需要 Kafka。具有 CRUD(创建-读取-更新-删除)操作的订单表工作正常。

Redis支持的队列

数据库支持的消息队列仍然需要开发工作来创建队列表并从中读取/写入。对于预算有限且已经使用 Redis 进行缓存的小型初创公司,Redis 还可以用作消息队列。

有 3 种方法可以将 Redis 用作消息队列:

1.Pub/Sub 发布/订阅

2.List 列表

3.Stream 流

下图显示了它们的工作原理。

Pub/Sub 很方便,但有一些交付限制。当生产者将数据发布到同一密钥时,消费者订阅密钥并接收数据。限制是数据最多传递一次。如果使用者关闭且未收到已发布的数据,则该数据将丢失。此外,数据不会保留在磁盘上。如果 Redis 出现故障,则所有 Pub/Sub 数据都将丢失。Pub/Sub 适用于可以接受某些数据丢失的指标监控。

Redis 中的 List 数据结构可以构造 FIFO(先进先出)队列。使用者使用 BLPOP 在阻塞模式下等待消息,因此应应用超时。等待同一列表的消费者形成一个消费者组,其中每条消息仅由一个消费者使用。作为 Redis 数据结构,List 可以持久化到磁盘上。

Stream 解决了上述两种方法的限制。使用者选择从何处读取消息 - “$”表示新消息,“id”表示特定消息 ID,“0-0”表示从头开始读取。

总之,数据库支持和 Redis 支持的消息队列易于维护。如果它们不能满足我们的需求,专用的消息队列产品会更好。接下来我们将比较两个流行的选项。

对于需要可靠、可扩展和可维护系统的大型公司,请在以下方面评估消息队列产品:

  • 功能性

  • 性能

  • 可扩展性

  • 生态系统

下图比较了两种典型的消息队列产品:RabbitMQ 和 Kafka。

它们是如何工作的

RabbitMQ 的工作方式类似于消息传递中间件 - 它将消息推送给消费者,然后在确认时删除它们。这避免了 RabbitMQ 认为有问题的消息堆积。

Kafka 最初是为大规模日志处理而构建的。它会将消息保留到过期,并允许使用者按照自己的节奏拉取消息。

语言和 API

RabbitMQ 是用 Erlang 编写的,这使得修改核心代码具有挑战性。但是,它提供了非常丰富的客户端 API 和库支持。

Kafka 使用 Scala 和 Java,但也具有适用于 Python、Ruby 和 Node.js 等流行语言的客户端库和 API。

性能和可扩展性

RabbitMQ 每秒处理数万条消息。即使在更好的硬件上,吞吐量也不会高得多。

Kafka 每秒可以处理数百万条消息,具有很高的可扩展性。

生态系统

默认情况下,许多现代大数据和流式处理应用程序都集成了 Kafka。这使得它非常适合这些用例。

Message Queue使用案例

现在我们已经介绍了不同消息队列的功能,让我们看一些如何选择正确产品的示例。

日志处理和分析

对于具有购物车、订单和付款等服务的电子商务网站,我们需要分析日志以调查客户订单。

下图显示了使用“ELK”堆栈的典型体系结构:

  • ElasticSearch - 为全文搜索的日志编制索引

  • LogStash - 日志收集代理

  • Kibana - 用于搜索和可视化日志的 UI

  • Kafka - 分布式消息队列

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/602035.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Kubernetes】认证授权RBAC (一)

认证授权RBAC 一、k8s安全管理:认证、授权、准入控制概述1.1、简介【1】认证基本介绍【2】授权基本介绍【3】准入控制基本介绍 1.2、认证【1】客户端认证【2】Bearertoken【3】Serviceaccount【4】拓展:kubeconfig文件 1.3、授权【1】什么是RBAC&#xf…

rust 注释文档生成 cargo doc

rust的cargo文档生成 只需要在每个函数写清楚注释,就可以自动生成文档,很方便 即不用写文档,又可以快速查看,是开发rust的必备技能 rust安装和开发环境配置,可以参考:链接 1.写注释的方法 连续三个 \ 即…

uniapp---安卓真机调试提示检测不到手机【解决办法】

最近在做APP,由于华为手机更新过系统,再次用来调试APP发现就不行了。下面给出具体的解决方法: 第一步:打开【允许开发人员选项】 找到【设置】点击【关于手机】找到【版本号】点击7次或多次,允许开发人员选项。 第二…

首次引入大模型!Bert-vits2-Extra中文特化版40秒素材复刻巫师3叶奈法

Bert-vits2项目又更新了,更新了一个新的分支:中文特化,所谓中文特化,即针对中文音色的特殊优化版本,纯中文底模效果百尺竿头更进一步,同时首次引入了大模型,使用国产IDEA-CCNL/Erlangshen-Megat…

Python中的@abstractmethod

abstractmethod 是 Python 中 abc 模块(Abstract Base Classes)提供的一个装饰器,用于声明抽象方法。抽象方法是指在抽象类中声明但没有提供具体实现的方法,而是由其子类提供具体实现。 使用 abstractmethod 装饰器可以使得子类在…

【ASP.NET Core 基础知识】--环境设置

一、简介 1.1 .NET Core SDK 概述 .NET Core SDK(Software Development Kit)是Microsoft推出的一个开源跨平台框架,用于开发和部署.NET应用程序。它是.NET Core平台的核心组件之一,为开发者提供了在多个操作系统上构建高性能、可…

YOLOv5改进 | 2023 | SCConv空间和通道重构卷积(精细化检测,又轻量又提点)

一、本文介绍 本文给大家带来的改进内容是SCConv,即空间和通道重构卷积,是一种发布于2023.9月份的一个新的改进机制。它的核心创新在于能够同时处理图像的空间(形状、结构)和通道(色彩、深度)信息,这样的处理方式使得SCConv在分析图像时更加精细和高效。这种技术不仅适…

一文详解 Java 限流接口实现

作者:非有 一、限流 1.1 为什么要进行限流? 1.瞬时流量过高,服务被压垮? 2.恶意用户高频光顾,导致服务器宕机? 3.消息消费过快,导致数据库压力过大,性能下降甚至崩溃&#xff1f…

[C]jupyter中使用C

[C]jupyter中使用C 安装使用用处 安装 https://github.com/brendan-rius/jupyter-c-kernel 下拉找到3条命令,装就可以了 mac和linux可用 python3可用, 2不可以 第二条命令可以改为 : python3 install_c_kernel 小总结:如果有问题&#xff0…

Vite scss 如何引入本地 字体

Vite scss 如何引入本地 字体 最近在用 Vite 改造一个旧项目 Diary,遇到了好多从 Vue 转到 Vite 的问题。 这次这个问题是: scss 里本地字体引入的问题。 一、问题描述 可以看到下面的卡片字体,本来应该是 impact 的,但现在无法…

第二部分 离散型随机变量

目录 求分布律里的未知数 例1 例2 根据X的分布律写Y的分布律 例3 根据(X,Y)的分布律写Z的分布律 例4 根据(X,Y)的分布律写边缘分布律 例5 X与Y相互独立时的联合分布律 例6 根据分布律求期望、方差 例7 求分布律里的未知数 例1 已知X的分布律为 X-202P0.40.3k ,试求k 解 0.40…

8 单链表---带表头节点

上节课所学的顺序表的缺点 顺序表的最大问题:插入和删除时需要移动大量元素 链式存储的定义 链式存储的逻辑结构 链表中的基本概念: 注意:表头节点并不属于数据元素 单链表图示: 把3个需要的结构体定义出来: typdef …

docker - 常用容器部署命令大全(MySQL、Redis、RabbitMQ、ES、Kibana、Nacos、Sentinel)

目录 一、常用容器运行指令 MySQL Redis RabbitMQ ElasticSearch & kibana Nacos Sentinel 一、常用容器运行指令 MySQL docker run -d --name mysql -p 3306:3306 -e TZAsia/Shanghai -e MYSQL_ROOT_PASSWORD1111 mysql:5.7 -e TZAsia/Shanghai:指定…

响应式开发

响应式开发的原理Bootstrap前端开发框架Bootstrap栅格系统阿里百秀首页案例 响应式开发原理 1 响应式需要一个父级做为布局容器,来配合子级元素来实现变化效果。 2 在不同屏幕下,通过媒体查询来改变这个布局容器的大小,再改变里面子元素的排…

MySQL数据库期末知识点总结(复习版)

一、数据库基本知识 数据库中的数据有什么特点 1、数据是按某种结构组织的 2、数据有整体性、共享性和较高的独立性 数据管理技术经历了哪三个阶段 1、手工管理 2、文件管理 3、数据库管理 数据库管理系统的主要功能有哪些 数据库管理系统的主要功能包括数据定义、数据…

红帽Redhat安装教程及安装出错(Liunx)

一、红帽5安装 1.打开vmware,新建虚拟机。或者文件→新建虚拟机 2.自定义,下一步 3.下一步 4.稍后安装操作系统,下一步 5.linux 红帽5 64位,下一步 6.给虚拟机取名字,选择安装路径。下一步 7.下一步(可以根据自己的电脑配置稍微增加数量) 8.4GB 下一步 9.仅主机(根据需…

五步解决Ubuntu界面太小的问题

名人说:莫听穿林打叶声,何妨吟啸且徐行。—— 苏轼《定风波莫听穿林打叶声》 Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder) 对于20版本及以上的unbuntu我们可以通过安装open-vm-tools来解决界面大小的问题,具体步骤如…

内存 vs 硬盘:固态硬盘代替内存可以工作吗?

使用固态硬盘代替内存可以吗? 答案是​:不可以​。 ​这个问题看似复杂,其实包含很多方面的原因。 一、存储结构方面 固态硬盘和内存在存储结构上就完全不同。 1.1 固态硬盘采用的是3D闪存单元阵列来存储数据 这些存储单元被一层层地堆…

【ONE·MySQL || 数据类型 表的约束】

总言 主要内容:介绍MySQL中的常见数据类型(数值类型、文本二进制类型、时间日期、字符串类型),以及对表的约束(非空约束、默认约束、列描述、零填充约束、自增长约束、主键约束、唯一键约束、外键约束)。  …

es集群安装及优化

es主节点 192.168.23.100 es节点 192.168.23.101 192.168.23.102 1.安装主节点 1.去官网下载es的yum包 官网下载地址 https://www.elastic.co/cn/downloads/elasticsearch 根据自己的需要下载对应的包 2.下载好之后把所有的包都传到从节点上,安装 [rootlocalho…