怎么去选消息队列? Kafka vs. RabbitMQ

在上周,我们讨论了使用消息队列的好处。然后我们回顾了消息队列产品的发展历史。如今,在项目中需要使用消息队列时,Apache Kafka似乎是首选产品。然而,考虑到特定需求时,它并不总是最佳选择。

基于数据库的队列

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

•异步处理,使收银员可以在不等待的情况下接下一个订单。•持久性,以防出现问题时错过顾客的订单。

在这里,消息的顺序不太重要,因为咖啡师经常批量制作相同的饮料。可扩展性也不是很重要,因为队列受限于每个星巴克门店。

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

416376551366a899547ebd43c79f2b2b.jpeg

当收银员接受一个订单时,在数据库支持的队列中创建一个新订单。然后收银员可以继续接受另一个订单,而咖啡师则会批量获取新的订单。一旦订单完成,咖啡师会在数据库中标记为已完成。然后顾客可以在柜台上取走他们的咖啡。

每天结束时可以运行一个维护作业来删除已完成的订单(即“DONE”状态的订单)。

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

基于Redis的队列

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

有三种使用Redis作为消息队列的方法:

1.发布/订阅(Pub/Sub)2.列表(List)3.流(Stream)

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

62f83b8eb1f5eb41349196b623535990.jpeg

发布/订阅是方便的,但有一些传递限制。消费者订阅一个键,当生产者向相同的键发布数据时,消费者会接收数据。限制在于数据最多只会传递一次。如果消费者关闭并且未接收到已发布的数据,则该数据会丢失。此外,数据不会持久保存在磁盘上。如果Redis宕机,所有发布/订阅数据都会丢失。发布/订阅适用于度量监视等情况,其中可以接受一些数据丢失。

Redis中的列表数据结构可以构建FIFO(先进先出)队列。消费者使用BLPOP以阻塞模式等待消息,因此应该应用超时。等待相同列表的消费者形成一个消费者组,每个消息只由一个消费者消费。作为Redis数据结构,列表可以持久保存在磁盘上。

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

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

RabbitMQ vs. Kafka

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

•功能•性能•可扩展性•生态系统

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

289dbea28782741ce70b8cd05c53b9b1.jpeg

工作原理

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

Kafka最初是为大规模日志处理而构建的。它会保留消息直到过期,并允许消费者以自己的速度拉取消息。

语言和API

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

Kafka使用Scala和Java,但也有针对流行语言(如Python、Ruby 和Node.js)的客户端库和API。

性能和可扩展性

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

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

生态系统

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

消息队列用例

既然我们已经介绍了不同消息队列的特点,让我们看一些如何选择正确产品的示例。

日志处理与分析

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

下面的图表显示了使用“ELK”堆栈的典型架构:

•ElasticSearch - 为全文搜索索引日志•LogStash - 日志收集代理•Kibana - 用于搜索和可视化日志的用户界面•Kafka - 分布式消息队列

2c2a65851718a3c870350c55835368bd.jpeg 希望这篇文章对你们有所帮助~ 日更不易,喜欢的话欢迎点赞、收藏、关注哈

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

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

相关文章

springboot引入druid解析sql

一、前言 在开发中&#xff0c;有时我们可能会需要获取SQL中的表名&#xff0c;那么因为不同的数据源类型SQL会存在部分差异&#xff0c;那么我们就可以使用alibaba 的druid包实现不同的数据源类型的sql解析。 二、引入相关maven依赖 <dependency><groupId>com.a…

R语言02-R语言中的向量

概念 在R语言中&#xff0c;向量&#xff08;Vector&#xff09;是最基本的数据结构之一&#xff0c;用于存储相同类型的多个元素。向量可以包含数值、字符、逻辑值等&#xff0c;但其中的所有元素必须具有相同的数据类型。向量可以通过c()函数创建&#xff0c;也可以通过其他…

【核磁共振成像】傅里叶重建

目录 一、傅里叶重建二、填零三、移相四、数据窗函数五、矩形视野六、多线圈数据重建七、图像变形校正八、缩放比例九、基线校准 长TR&#xff0c;长TE&#xff0c;是T2加权像&#xff1b; 短TR&#xff0c;短TE&#xff0c;是T1加权像&#xff1b; 长TR&#xff0c;短TE&#…

从零开始学习 Java:简单易懂的入门指南之爬虫(十六)

爬虫 1.1 本地数据爬取1.2 网络数据爬取1.3 爬取数据练习1.4 按要求爬取1.5 贪婪爬取和非贪婪爬取1.6 String的split方法中使用正则表达式1.7 String类的replaceAll方法中使用正则表达式1.8 正则表达式-分组括号( )1.9 分组练习1.10 忽略大小写的写法1.11 非捕获分组1.12 正则表…

Debootstrap 教程

文章目录 Debootstrap 教程安装 debootstrap使用 debootstrap运行 debootstrap进入新的系统结束语 Debootstrap 教程 debootstrap 是一个用于在 Debian-based 系统上创建一个基本的 Debian 系统的工具。它可以用于创建 chroot 环境、容器或者为新的系统安装做准备。 安装 deb…

Mongodb Ubuntu安装

Mongodb Ubuntu安装 1.更新软件源导入MongoDB的GPG密钥 sudo apt update sudo apt install -y dirmngr wget gnupg apt-transport-https ca-certificates software-properties-common gnupgwget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add…

oracle警告日志\跟踪日志磁盘空间清理

oracle警告日志\跟踪日志磁盘空间清理 问题现象&#xff1a; 通过查看排查到alert和tarce占用大量磁盘空间 警告日志 /u01/app/oracle/diag/rdbms/orcl/orcl/alert 跟踪日志 /u01/app/oracle/diag/rdbms/orcl/orcl/trace 解决方案&#xff1a; 用adrci清除日志 确定目…

模板编程——类模板

模板概述 模板的意义是可以对类型进行参数化 相关关键字&#xff1a;template、typename、class template用于定义模板&#xff0c;typename或class用于定义模板类型参数

item_search_img-按图搜索淘宝商品(拍立淘)

一、接口参数说明&#xff1a; item_search_img-按图搜索淘宝商品&#xff08;拍立淘&#xff09;&#xff0c;点击更多API调试&#xff0c;请移步注册API账号点击获取测试key和secret 公共参数 请求地址: https://api-gw.onebound.cn/taobao/item_search_img 名称类型必须描…

OpenAI推出GPT-3.5Turbo微调功能并更新API;Midjourney更新局部绘制功能

&#x1f989; AI新闻 &#x1f680; OpenAI推出GPT-3.5Turbo微调功能并更新API&#xff0c;将提供GPT-4微调功能 摘要&#xff1a;OpenAI宣布推出GPT-3.5Turbo微调功能&#xff0c;并更新API&#xff0c;使企业和开发者能够定制ChatGPT&#xff0c;达到或超过GPT-4的能力。通…

Ribbon 源码分析

Ribbon 源码分析 Ribbon Debug 分析 断点 LoadBalancerInterceptor LoadBalancerInterceptor 实现了 ClientHttpRequestInterceptor 接口&#xff0c;重写了其中的 intercept 方法&#xff0c;用来拦截请求&#xff1b; 获取原始的 uri 和 服务名&#xff0c;调用 LoadBalanc…

Docker Compose

一、Docker-Compose使用场景二、Docker-Compose简介三、Docker-Compose 部署四、YAML 文件格式及编写注意事项五、Docker-Compose配置常用字段六、Docker-Compose 常用命令七、Docker-Compose 文件结构八、Docker-Compose 撰写nginx8.1 准备依赖文件8.2 编写配置文件docker-com…

基于串口透传模块,单片机无线串口空中下载测试

基于串口透传模块&#xff0c;单片机无线串口空中下载测试 ✨无线串口下载&#xff0c;其本质还是串口下载方式&#xff0c;只不过省去了单片机和ISP上位机工具之间的物理有线连接&#xff0c;中间的数据通过无线串口透传模块进行数据中转&#xff0c;传递到单片机串口上。串口…

爬虫借助代理会让网速快点吗?

亲爱的程序员朋友们&#xff0c;你曾经遇到过爬虫网速慢的情况吗&#xff1f;别着急&#xff01;今天我将和你一起探讨一下使用代理是否可以加速爬虫&#xff0c;让我们一起进入这个轻松又专业的知识分享。 一、原因和机制的解析 1.IP限制 某些网站为了保护资源和防止爬虫行…

认识Redis

1. 前置操作 以下内容基于CentOS 1.1. 安装 yum -y install redis 1.2. 启动 redis-server /etc/redis.conf & 1.3. 打开 redis-cli 1.4. 停止 redis-cli shutdown 1.5. 设置远程连接 修改 /etc/redis/redis.conf 修改 bind 127.0.0.1为 bind 0.0.0.0 1.6. 使用…

rk3568 适配以太网(千兆)

rk3568 适配以太网——RTL8211 千兆以太网(Gigabit Ethernet)的传输速度为1 Gbps(千兆位每秒),而百兆以太网(Fast Ethernet)的传输速度为100 Mbps(百兆位每秒)。因此,在相同的网络条件下,千兆网可以提供更高的数据传输速率,比百兆网快10倍。千兆网的更高传输速度使…

持续的搬运资源第七十四次

持续的搬运资源第七十四次&#xff0c;一天两次&#xff0c;提升原力值&#xff0c;搜罗更好的资源

适合国内用户的五款ChatGPT插件

众所周知使用ChatGPT3.5需要使用魔法且不稳定&#xff0c;订阅ChatGPT4.0每月需要支付20美元&#xff0c;并且使用次数有限制。对于那些不想每年花费240美元&#xff08;超过1500元人民币&#xff09;来使用GPT4.0的朋友们来说&#xff0c;还有别的办法吗&#xff1f; 答案是&…

PHP pdf 自动填写表单

一、下载github上的项目&#xff0c;地址 二、下载pdftk 地址 // 转化PDF模板 pdftk modele.pdf output modele2.pdf# 填充pdf文件中的表单 require(fpdm.php); $fields array(name > My name,address > My address,city > My city,phone > My phone nu…

web基础+HTTP协议+httpd详细配置

目目录录 一、Web基础1.1 HTML概述1.1.1 HTML的文件结构1.1.2 HTML中的部分基本标签 1.3 MIME1.4 URI 和 URL1.4 定义1.4.2 URI 和 URL 的区别 二、静态资源和动态资源2.1 静态资源2.2 动态资源 三、HTTP协议3.1 HTTP协议简介3.2 HTTP协议版本3.2 HTTP方法3.3 HTTP请求访问的完…