前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >什么是消息队列?

什么是消息队列?

作者头像
mafeifan
发布于 2019-04-18 12:14:31
发布于 2019-04-18 12:14:31
1K0
举报
文章被收录于专栏:finleyMafinleyMa

一、什么是消息队列?

消息队列不知道大家看到这个词的时候,会不会觉得它是一个比较高端的技术,反正我是觉得它好像是挺牛逼的。

消息队列,一般我们会简称它为MQ(Message Queue),嗯,就是很直白的简写。

我们先不管消息(Message)这个词,来看看队列(Queue)。这一看,队列大家应该都熟悉吧。

队列是一种先进先出的数据结构

image.png

那为什么还需要消息队列(MQ)这种中间件呢???其实这个问题,跟之前我学Redis的时候很像。Redis是一个以key-value形式存储的内存数据库,明明我们可以使用类似HashMap这种实现类就可以达到类似的效果了,那还为什么要Redis?《Redis合集

  • 到这里,大家可以先猜猜为什么要用消息队列(MQ)这种中间件,下面会继续补充。

消息队列可以简单理解为:把要传输的数据放在队列中

image.png

科普: 把数据放到消息队列叫做生产者 从消息队列里边取数据叫做消费者

二、为什么要用消息队列?

2.1 解耦

为什么要用消息队列,也就是在问:用了消息队列有什么好处。我们看看以下的场景

现在我有一个系统A,系统A可以产生一个userId

系统A可以产生一个UserId

然后,现在有系统B,C,D都需要这个userId去做相关的操作

系统A将userId写到消息队列中,系统C和系统D从消息队列中拿数据。这样有什么好处?

系统A只负责把数据写到队列中,谁想要或不想要这个数据(消息),系统A一点都不关心。

即便现在系统D不想要userId这个数据了,系统B又突然想要userId这个数据了,都跟系统A无关,系统A一点代码都不用改。 系统D拿userId不再经过系统A,而是从消息队列里边拿。系统D即便挂了或者请求超时,都跟系统A无关,只跟消息队列有关。

这样一来,系统A与系统B、C、D都解耦了。

image.png

2.2 异步

假设系统A运算出userId具体的值需要50ms,调用系统B的接口需要300ms,调用系统C的接口需要300ms,调用系统D的接口需要300ms。那么这次请求就需要50+300+300+300=950ms

并且我们得知,系统A做的是主要的业务,而系统B、C、D是非主要的业务。比如系统A处理的是订单下单,而系统B是订单下单成功了,那发送一条短信告诉具体的用户此订单已成功,而系统C和系统D也是处理一些小事而已。

那么此时,为了提高用户体验和吞吐量,其实可以异步地调用系统B、C、D的接口。所以,我们可以弄成是这样的:

image.png

2.3 削峰/限流

我们再来一个场景,现在我们每个月要搞一次大促,大促期间的并发可能会很高的,比如每秒3000个请求。假设我们现在有两台机器处理请求,并且每台机器只能每次处理1000个请求。

image.png

那多出来的1000个请求,可能就把我们整个系统给搞崩了...所以,有一种办法,我们可以写到消息队列中:

image.png

系统B和系统C根据自己的能够处理的请求数去消息队列中拿数据,这样即便有每秒有8000个请求,那只是把请求放在消息队列中,去拿消息队列的消息由系统自己去控制,这样就不会把整个系统给搞崩。

三、使用消息队列有什么问题?

经过我们上面的场景,我们已经可以发现,消息队列能做的事其实还是蛮多的。

  1. 无论是我们使用消息队列来做解耦、异步还是削峰,消息队列肯定不能是单机的。试着想一下,如果是单机的消息队列,万一这台机器挂了,那我们整个系统几乎就是不可用了。
  2. 我们将数据写到消息队列上,系统B和C还没来得及取消息队列的数据,就挂掉了。如果没有做任何的措施,我们的数据就丢了。 那存在哪呢?磁盘?数据库?Redis?分布式文件系统
  3. 消费者怎么从消息队列里边得到数据?有两种办法: 生产者将数据放到消息队列中,消息队列有数据了,主动叫消费者去拿(俗称push) 消费者不断去轮训消息队列,看看有没有新的数据,如果有就消费(俗称pull)
  4. 其他除了这些,我们在使用的时候还得考虑各种的问题:消息重复消费了怎么办啊?我想保证消息是绝对有顺序的怎么做?

最后

本文主要讲解了什么是消息队列,消息队列可以为我们带来什么好处,以及一个消息队列可能会涉及到哪些问题。希望给大家带来一定的帮助。

参考资料:

参考

https://www.cnblogs.com/Java3y/p/10695609.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.04.12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一款基于 .NET 开源、配置灵活的工作流引擎
在信息化和数字化的浪潮中,企业业务流程的自动化和智能化成为了提升管理效率、降低成本、增强竞争力的关键。然而,不同企业的业务流程千差万别,对工作流引擎的灵活性、可扩展性和易用性提出了更高的要求。
郑子铭
2025/04/30
1080
一款基于 .NET 开源、配置灵活的工作流引擎
推理演示 | 八步助你搞定tensorRT C++ SDK调用!
Hello,2020年底我安装配置好了TensorRT7,写了一篇文章总结了在Widnows10系统中如何配置与运行代码实现TensorRT开发环境的搭建。文章中详细介绍了配置的流程与步骤,文章的链接如下:
OpenCV学堂
2021/03/12
7.8K2
推理演示 | 八步助你搞定tensorRT C++ SDK调用!
推荐一个开源的 .NET 工作流引擎和审批流项目
推荐一个 .NET 开发的工作流引擎,开源免费,功能强大,项目还包含审批流功能,内置了可视化的流程设计器,开箱即用,可以非常方便的集成到项目中。
郑子铭
2024/11/26
5560
推荐一个开源的 .NET 工作流引擎和审批流项目
几大工作流引擎对比图_工作流引擎框架
纵观jBPM:从jBPM3到jBPM5以及Activiti5:http://www.infoq.com/cn/articles/rh-jbpm5-activiti5#
全栈程序员站长
2022/09/20
1.9K0
史上最全的工作流引擎 Activiti 学习教程(值得收藏)
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/05/23
2.6K0
史上最全的工作流引擎 Activiti 学习教程(值得收藏)
工作流引擎之Activiti使用总结
在第一家公司工作的时候主要任务就是开发OA系统,当然基本都是有工作流的支持,不过当时使用的工作流引擎是公司一些牛人开发的(据说是用一个开源的引擎修改的),名称叫CoreFlow;功能相对Activiti来说比较弱,但是能满足日常的使用,当然也有不少的问题所以后来我们只能修改引擎的代码打补丁。
lyb-geek
2018/07/26
4.4K0
工作流引擎之Activiti使用总结
workflow开发_php工作流引擎
WikeFlow学习版源代码下载:https://gitee.com/wikesoft/WorkFlow
全栈程序员站长
2022/11/01
8970
workflow开发_php工作流引擎
三大工作流引擎技术Activiti、Camunda、Flowable选型指南
Activiti、Camunda、Flowable它们都起源于jbpm,从jbpm4开始,随后诞生了Activiti5。然而,在Activiti5的发展过程中,核心团队成员间的分歧导致了Camunda的诞生。在Activiti5持续发展了大约四年后,Flowable作为新的分支应运而生。
公众号:码到三十五
2024/03/19
27.4K0
三大工作流引擎技术Activiti、Camunda、Flowable选型指南
开源工作流引擎 Workflow Core 的研究和使用教程
Workflow Core 中,用于构建工作流的类继承 IWorkflow,代表一条有任务规则的工作流,可以表示工作流任务的开始或者 Do() 方法,或工作流分支获取其它方法。
痴者工良
2019/08/10
8.5K4
外包精通--Argo的工作流引擎(官网入门实践)
Argo Workflows 是一个开源容器原生工作流引擎,用于在 Kubernetes 上编排并行作业。Argo Workflows 作为 Kubernetes CRD(自定义资源定义)实现。
Godev
2023/06/08
1.2K0
工作流引擎架构设计
最近开发的安全管理平台新增了很多工单申请流程需求,比如加白申请,开通申请等等。最开始的两个需求,为了方便,也没多想,就直接开发了对应的业务代码。
AlwaysBeta
2023/01/12
3.3K0
工作流引擎在有赞 DevOps 中的实践
随着有赞规模的增长, 运维的事务也日益复杂, 如何能更加高效的协调好开发, 运维, 工具与流程之间的关系, 把运维人员从低效率, 高强度, 易犯错的人工操作中彻底解放出来,让他们的能力与精力有更大程度的发挥, 是一个很大的挑战。
有赞coder
2020/08/25
1.2K0
工作流引擎在有赞 DevOps 中的实践
利用Pytorch的C++前端(libtorch)读取预训练权重并进行预测
本篇使用的平台为Ubuntu,Windows平台的请看Pytorch的C++端(libtorch)在Windows中的使用
老潘
2023/10/19
1K0
利用Pytorch的C++前端(libtorch)读取预训练权重并进行预测
工作流引擎 Activiti 万字详细入门
工作流(Workflow),就是通过计算机对业务流程自动化执行管理。它主要解决的是“使在多个参与者之间按照某种预定义的规则自动进行传递文档、信息或任务的过程,从而实现某个预期的业务目标,或者促使此目标的实现”。
全栈程序员站长
2022/09/08
3.5K0
工作流引擎 Activiti 万字详细入门
「首席架构师推荐」工作流引擎哪家强?首席架构帮你挑
原文:https://github.com/meirwah/awesome-workflow-engines
架构师研究会
2019/09/25
4.6K0
「首席架构师推荐」工作流引擎哪家强?首席架构帮你挑
CabloyJS自带工作流引擎的文档清单
## 文档清单 CabloyJS自带`工作流引擎`文档已经整理出来,欢迎大家围观、拍砖 - 介绍 - [介绍](https://cabloy.com/zh-cn/articles/flow-introduce.html) - [演示:CMS审批工作流](https://cabloy.com/zh-cn/articles/ddda3ea8638d4d2b88fb57df7ed67107.html) - [单元测试用例集](https://cabloy.com/zh-cn/articles/b8
zhennann
2021/01/18
4810
准备启动 .net 版本的 工作流引擎
在工作中学习和积累了很多工作流的知识,也在网络上写了一些个人的感想,觉得这个领域可以继续挖掘下去。
田春峰-JCJC错别字检测
2019/02/14
8120
PHP开源工作流引擎Ingenious v2正式发布
大家好!我很高兴地宣布,经过无数个日夜的努力,我们终于迎来了Ingenious v2的正式发布!🎉
Tinywan
2025/02/12
1300
PHP开源工作流引擎Ingenious v2正式发布
TensorRT + YOLOv5第六版C++部署全解
点击上方↑↑↑“OpenCV学堂”关注我 OpenCV单目相机标定,图像畸变校正 前言 之前对YOLOv5第六版分别在OpenCV DNN、OpenVINO、ONNXRUNTIME 上做了测试,因为版本兼容问题,一直无法在TensorRT上做测试,我当时跑CUDA11.0 + cuDNN8.4.x时候给我报的错误如下: Could not load library cudnn_cnn_infer64_8.dll. Error code 126Please make sure cudnn_cnn_infe
OpenCV学堂
2022/04/08
5.7K2
TensorRT + YOLOv5第六版C++部署全解
「首席架构师推荐」精选的开源工作流引擎列表,
原文:https://github.com/meirwah/awesome-workflow-engines
架构师研究会
2019/09/25
2.7K0
「首席架构师推荐」精选的开源工作流引擎列表,
推荐阅读
相关推荐
一款基于 .NET 开源、配置灵活的工作流引擎
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档