RabbitMQ在国内为什么没有那么流行?

MQ(消息队列)的世界。MQ,就像是一个巨大的邮局,负责在不同服务或应用间传递消息。它可以帮助我们解耦系统,提高性能,还能做到异步处理和流量削峰。

基本使用

RabbitMQ是一个开源的消息代理和队列服务器,可以在分布式系统中促进消息的接收、传输和处理。它支持多种消息协议,易于使用和部署,被广泛应用于多个场景,比如系统解耦、负载均衡、流量削峰等。

ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost"); // 设置MQ服务器地址
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();channel.queueDeclare("hello", false, false, false, null); // 创建队列
String message = "Hello World!";
channel.basicPublish("", "hello", null, message.getBytes()); // 发送消息
System.out.println(" [x] Sent '" + message + "'");channel.close();
connection.close();

上面这段代码就是用Java发送一个简单消息到RabbitMQ的示例。不难吧!

最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。

这是大佬写的, 7701页的BAT大佬写的刷题笔记,让我offer拿到手软

性能优化

RabbitMQ的性能优化可以从多个方面入手,比如合理配置队列、消息持久化、负载均衡、合理利用交换机和路由等。但是,相比于Kafka、RocketMQ这些,RabbitMQ在高吞吐量场景下的表现可能稍逊一筹。

开源生态

RabbitMQ有着成熟的社区和广泛的用户基础。但在国内,随着阿里巴巴的RocketMQ和Apache的Kafka的崛起,这些基于大数据背景,对高吞吐量和高可靠性有着更强需求的系统,逐渐成为主流。

使用场景

RabbitMQ擅长于低延迟、确保消息顺序、复杂路由等场景。但当面对超大规模消息处理需求时,它可能就显得力不从心了。而Kafka和RocketMQ在这方面就表现得更加出色。

真实案例比较

小到中型企业:对于不需要处理海量消息的公司,RabbitMQ是一个很好的选择。它简单易用,部署方便,适合快速迭代和开发。

大型企业/高吞吐量需求:这里就得说Kafka和RocketMQ了。

比如在电商、金融等行业,面对巨量数据和消息,他们的性能和可扩展性就显得尤为重要。

RabbitMQ的特点和实际应用案例

轻量级和易于部署:对于初创公司或小型项目来说,RabbitMQ是一个非常好的选择。举个例子,假设有个初创电商公司,他们的订单系统、库存系统和用户通知系统需要解耦合。RabbitMQ就可以在这些系统间高效地传递消息,而且部署和维护成本相对较低。

channel.queueDeclare("OrderQueue", true, false, false, null); // 创建一个持久化队列
channel.basicPublish("", "OrderQueue", MessageProperties.PERSISTENT_TEXT_PLAIN, orderMessage.getBytes()); // 发送订单消息

确保消息顺序:在需要保证消息严格顺序的系统中,RabbitMQ是一个不错的选择。例如,银行的交易系统,每笔交易的顺序都是至关重要的。RabbitMQ可以保证同一个队列中消息的顺序。

Kafka和RocketMQ的优势及应用案例

高吞吐量:Kafka和RocketMQ都非常擅长处理大规模数据流。以视频直播平台为例,需要处理成千上万的用户消息和互动,Kafka能够承担起这种高并发、高吞吐量的需求。

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");Producer<String, String> producer = new KafkaProducer<>(props);
producer.send(new ProducerRecord<String, String>("UserMessages", userId, message)); // 发送用户消息

高可靠性和可扩展性:对于大型互联网公司,比如电商平台,在大促期间,系统需要处理巨量的订单和交易。RocketMQ不仅可以处理高吞吐量的消息,还能保证消息的高可靠性和服务的高可用性。

DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name");
producer.setNamesrvAddr("localhost:9876");
producer.start();
producer.send(new Message("TopicTest", "OrderTag", ("Hello RocketMQ " + orderId).getBytes(RemotingHelper.DEFAULT_CHARSET))); // 发送订单消息

推荐一个学习 RabbitMQ 的专栏

  • 01、RabbitMQ 实战 - RabbitMQ简介
  • 02、RabbitMQ 实战 - Linux安装RabbitMQ
  • 03、RabbitMQ 实战 - 创建RabbitMQ的Java项目
  • 04、RabbitMQ 实战 - 使用Java实现RabbitMQ的生产者发送消息
  • 05、RabbitMQ 实战 - 使用Java实现RabbitMQ的消费者接收消息
  • 06、RabbitMQ 实战 - RabbitMQ模式之工作队列(Work queues)的简介及实现
  • 07、RabbitMQ 实战 - RabbitMQ消息应答及消息未应答后重新入队
  • 08、RabbitMQ 实战 - 实现RabbitMQ队列持久化及消息持久化
  • 09、RabbitMQ 实战 - RabbitMQ预取值及利用预取值实现不公平分发
  • 10、RabbitMQ 实战 - RabbitMQ发布确认模式的概念及实现
  • 11、RabbitMQ 实战 - RabbitMQ交换机(Exchange)简介
  • 12、RabbitMQ 实战 - Fanout交换机的简介与实现
  • 13、RabbitMQ 实战 - Direct交换机的简介与实现
  • 14、RabbitMQ 实战 - Topics交换机的简介与实现
  • 15、RabbitMQ 实战 - 死信队列的简介与死信队列和死信消费者的实现
  • 16、RabbitMQ 实战 - 用SpringBoot整合RabbitMQ
  • 17、RabbitMQ 实战 - 延迟队列的简介与实现
  • 18、RabbitMQ 实战 - RabbitMQ基于插件实现延迟队列
  • 19、RabbitMQ 实战 - 实现在RabbitMQ宕机的情况下对消息进行处理
  • 20、RabbitMQ 实战 - RabbitMQ备份交换机
  • 21、RabbitMQ 实战 - RabbitMQ幂等性
  • 22、RabbitMQ 实战 - RabbitMQ优先级队列
  • 23、RabbitMQ 实战 - RabbitMQ惰性队列
  • 24、RabbitMQ 实战 - RabbitMQ集群搭建
  • 25、RabbitMQ 实战 - RabbitMQ搭建镜像队列
  • 26、RabbitMQ 实战 - RabbitMQ实现高可用负载均衡
  • 27、RabbitMQ 实战 - RabbitMQ使用解决异地访问延迟问题
  • 28、RabbitMQ 实战 - RabbitMQ使用解决异地访问延迟问题
  • 29、RabbitMQ 实战 - RabbitMQ搭建Shovel

RabbitMQ在轻量级、易于部署、消息顺序保证方面表现优秀,但在面对大规模数据处理的场景时,可能就不太适用。而Kafka和RocketMQ在高吞吐量、高可靠性方面更有优势。

结论

RabbitMQ在国内之所以不如Kafka或RocketMQ流行,主要是因为随着互联网企业对数据处理能力的需求日益增长,更适合高吞吐量、高可靠性场景的Kafka和RocketMQ逐渐成为首选。而RabbitMQ虽然在某些场景下表现优秀,但在这波“大数据潮流”中显得略显不足。

最后,技术的选择永远都是多方面权衡的结果。每种技术都有它的优势和最适合的应用场景,关键在于找到最适合你当前业务需求的那一款。嘿,说不定哪天RabbitMQ又会因为某些独特的优势重新火起来呢!

最后说一句(求关注,求赞,别白嫖我)

最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。

这是大佬写的, 7701页的BAT大佬写的刷题笔记,让我offer拿到手软

项目文档&视频:

项目文档 & 视频

本文,已收录于,我的技术网站 ddkk.com,有大厂完整面经,工作技术,架构师成长之路,等经验分享

求一键三连:点赞、分享、收藏

点赞对我真的非常重要!在线求赞,加个关注我会非常感激

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

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

相关文章

spring boot + uniapp 微信公众号 jsapi 支付

后端支付类 package com.ruoyi.coupon.payment;import com.google.gson.Gson; import com.ruoyi.coupon.payment.dto.PayParamJsapiDto; import com.ruoyi.coupon.payment.dto.RefundParam; import com.ruoyi.coupon.service.ICouponConfigService; import com.wechat.pay.jav…

FFmpeg抽取视频h264数据重定向

根据视频重定向技术解析中的 截获解码视频流的思路&#xff0c;首先需要解决如何输出视频码流的问题。 目前只针对h264码流进行获取&#xff0c;步骤如下&#xff1a; 打开mp4文件并创建一个空文件用于存储H264数据 提取一路视频流资源 循环读取流中所有的包(AVPacket),为…

redis中使用pipeline批量处理请求提升系统性能

在操作数据库时&#xff0c;为了加快程序的执行速度&#xff0c;在新增或更新数据时&#xff0c;可以通过批量提交的方式来减少应用和数据库间的传输次数&#xff1b;在redis中也有这样的技术实现批量处理&#xff0c;也就是管道——Pipeline。它也是通过批量提交数据的方式来实…

线程安全3--wait和notify

文章目录 wait and notify&#xff08;等待通知机制notify补充 wait and notify&#xff08;等待通知机制 引入wait notify就是为了能够从应用层面上&#xff0c;干预到多个不同线程代码的执行顺序&#xff0c;这里说的干预&#xff0c;不是影响系统的线程调度策略&#xff08…

uni-app应用设置 可以根据手机屏幕旋转进行 (横/竖) 屏切换

首先 我们打开项目的 manifest.json 在左侧导航栏中找到 源码视图 然后找到 app-plus 配置 在下面加上 "orientation": [//竖屏正方向"portrait-primary",//竖屏反方向"portrait-secondary",//横屏正方向"landscape-primary",//横屏…

第57天:django学习(六)

模版之过滤器 语法&#xff1a; {{obj|filter__name:param}} 变量名字|过滤器名称&#xff1a;变量 default 如果一个变量是false或者为空&#xff0c;使用给定的默认值。否则&#xff0c;使用变量的值。例如&#xff1a; {{ value|default:"nothing"}} length …

IDEA启动应用时报错:错误: 找不到或无法加载主类 @C:\Users\xxx\AppData\Local\Temp\idea_arg_filexxx

IDEA启动应用时报错&#xff0c;详细错误消息如下&#xff1a; C:\devel\jdk1.8.0_201\bin\java.exe -agentlib:jdwptransportdt_socket,address127.0.0.1:65267,suspendy,servern -XX:TieredStopAtLevel1 -noverify -Dspring.output.ansi.enabledalways -Dcom.sun.management…

基于以太坊的智能合约开发Solidity(事件日志篇)

//声明版本号&#xff08;程序中的版本号要和编译器版本号一致&#xff09; pragma solidity ^0.5.17; //合约 contract EventTest {//状态变量uint public Variable;//构造函数constructor() public{Variable 100;}event ValueChanged(uint newValue); //事件声明event Log(…

ElasticSearch之cat plugins API

命令样例如下&#xff1a; curl -X GET "https://localhost:9200/_cat/plugins?vtrue&pretty" --cacert $ES_HOME/config/certs/http_ca.crt -u "elastic:ohCxPHQBEs5*lo7F9"执行结果输出如下&#xff1a; name component version…

class064 Dijkstra算法、分层图最短路【算法】

class064 Dijkstra算法、分层图最短路【算法】 算法讲解064【必备】Dijkstra算法、分层图最短路 code1 743. 网络延迟时间 // Dijkstra算法模版&#xff08;Leetcode&#xff09; // 网络延迟时间 // 有 n 个网络节点&#xff0c;标记为 1 到 n // 给你一个列表 times&…

法律服务网站建设效果如何

律师事务所及法律知识咨询机构等往往是众多人群需求的服务&#xff0c;服务多样化及内容多元化&#xff0c;市场中也有大量品牌&#xff0c;在实际消费服务中大多以本地事务所为主&#xff0c;而线上咨询服务则一般没有区域限制&#xff0c;同行增多及人们知识获取渠道增加&…

C++-引用和指针区别

文章目录 1.变量的组成2.指针2.1 定义2.2 使用指针操作变量2.3 为什么使用指针 3.引用3.1 定义3.2 引用注意事项 4.引用和指针的区别 1.变量的组成 变量的组成&#xff1a;变量地址&#xff0c;变量名&#xff0c;变量值 例&#xff1a; int i 12;2.指针 2.1 定义 指针用于存…

如何为游戏角色3D模型设置纹理贴图

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 当谈到游戏角色的3D模型风格时&#xff0c;有几种不同的风格&#xf…

Mybatis中的查询操作

单表查询 单表查询在《初始Mybatis》中已经介绍过&#xff0c;这里就不在介绍了。咱们这里只说单表查询中的“like查询”。like查询单独使用#{}报错 <select id"selectByKeyword" resultType"com.example.demo.entity.Userinfo">select * from use…

计网Lesson8 - NAT技术与链路层概述

文章目录 NAT 技术1. 因特网的接入方式2. 公网和私网3. NAT 技术 链路层1. 数据链路层概述2. 数据链路层的三个问题2.1 封装成帧2.2 透明传输2.3 差错检测 NAT 技术 1. 因特网的接入方式 光猫将电信号转换为数字信号发送给路由器 光纤入户 光纤传递的就是数字信号&#xff0c…

python+pytest接口自动化(12)-自动化用例编写思路 (使用pytest编写一个测试脚本)

经过之前的学习铺垫&#xff0c;我们尝试着利用pytest框架编写一条接口自动化测试用例&#xff0c;来厘清接口自动化用例编写的思路。 我们在百度搜索天气查询&#xff0c;会出现如下图所示结果&#xff1a; 接下来&#xff0c;我们以该天气查询接口为例&#xff0c;编写接口测…

错题总结(三)

1.写代码将三个整数数按从大到小输出。 例如&#xff1a; 输入&#xff1a;2 3 1 输出&#xff1a;3 2 1 int main() {int a 0;int b 0;int c 0;int tep 0;scanf("%d%d%d", &a, &b, &c);if (a < b){tep a;a b;b tep;}if (b < c){tep b…

每日一练2023.12.9—— 矩阵A乘以B【PTA】

题目链接&#xff1a;L1-048 矩阵A乘以B 题目要求&#xff1a; 给定两个矩阵A和B&#xff0c;要求你计算它们的乘积矩阵AB。需要注意的是&#xff0c;只有规模匹配的矩阵才可以相乘。即若A有Ra​行、Ca​列&#xff0c;B有Rb​行、Cb​列&#xff0c;则只有Ca​与Rb​相等时&a…

Linux Shell 基础命令

Linux 是一个开源的操作系统&#xff0c;其命令行界面是它的重要组成部分。在这个界面下&#xff0c;Shell 是一个能够与操作系统进行交互的工具。Shell 是一种程序&#xff0c;它能够接收用户输入的命令&#xff0c;并将这些命令发送到操作系统中进行处理。 在 Linux 中&…

Docker实战笔记 三 Docker私有库

1.拉取私有库image rootcenots-7.5:/root#docker pull registry Using default tag: latest latest: Pulling from library/registry c926b61bad3b: Pull complete 5501dced60f8: Pull complete e875fe5e6b9c: Pull complete 21f4bf2f86f9: Pull complete 98513cca25bb: P…