消息队列-什么是MQ?何时使用MQ?怎么选择MQ?

什么是MQ?

MessageQueue:就是消息 + 队列,任务+队列,指令 + 队列。
功能:应用程序之间(生产者与消费者)的通信方式。

使用场景

从下面这个场景来感受MQ 的诞生
如果我们有很多任务需要处理,任务会不停的发送过来,我们需要进行处理,没有MQ我们就普通开发这个功能可能会有下面这几种思路

  1. 单线程
  2. 单线程 + 单队列
  3. 多线程 + 单队列
  4. 多线程 + 多队列
    在这里插入图片描述
    从上面的例子其实我们可以有下面这几个思考:
    1)我们使用队列排队的方式,是不是其实任务处理的实时性没有那么高呢?是不是其实是异步处理。那么比如有这样一个例子,用户注册。注册完自动登录,但是这个系统比较复杂,比如需要向用户发送短信欢迎用户成为一员,又如积分制度,或者针对新用户有一些优惠卷或者其它特权。如果系统够大,一般肯定积分系统和优惠卷系统都会作为一个独立的模块,那用户在注册这个动作的时候需要关心这些吗?其实不需要,先只完成核心的注册逻辑,这些附加的功能就可以进行异步处理,比如我们把初始化积分和优惠卷赠送这样的任务进行异步处理分别向积分系统和优惠卷系统发送一个消息,当前我们完成用户系统的信息初始化后就立即响应用户,这样对用户来说体验是很好的, 也能提升系统的QPS。
    2)那基于1的思考,我们拆分成了不同的系统,向不同的系统发送消息,这个时候其实MQ充当一个通信的角色。那这些不同的系统是不是被解耦了呢?同时是不是可以通过主系统向不同的系统分发数据呢。

其实我们我们上面的思考远远不够,比如消息如果不持久化岂不是服务重启后就没有了吗,任务处理过程中发生异常怎么办,怎么路由到不同的队列,如果我们有点对点的处理或广播处理这种需求呢。那么MQ就是解决了这些问题的一个方案,MQ考虑的比我们更多,也提供了不同问题的解决方式。

基于上面的一些简单的思考我们可以总结出MQ的应用场景:

  • 异步:侧重的处理流程,流程上将以前的一些同步逻辑,改造成为异步的逻辑流程。
  • 解耦:侧重的功能设计,在做一些业务架构分析的时候,可以有力度有重点的区分主干流程、分支流程。
  • 削峰限流:侧重在数量级的问题,相比于未接入MQ时能再次抗上几倍甚至几十倍、几百倍…的流量。
  • 延迟调用(准实时、一定延时):侧重定制化诉求,在 db 与 MQ 之间做了一个抉择。

MQ的选择

Rocketmq官方网网
Why choose RocketMQ 有个各个MQ的对比。
那么我们在选型的时候需要考虑不同的维度,这些维度可以参考下面这张图
图片来源:https://time.geekbang.org/column/article/540810
在这里插入图片描述

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

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

相关文章

Logstash相关问题及答案(2024)

1、什么是Logstash? Logstash是Elastic Stack(曾被称为ELK Stack,即Elasticsearch、Logstash、Kibana三者的组合)的一部分,是一个开源的服务器端数据处理管道,可以同时从多个来源采集数据,转换数…

Mac打包Unix可执行文件为pkg

Mac打包Unix可执行文件为pkg 方式一:通过packages页面打包 1.下载packages app Distribution:自定义化更高,包括修改安装页面的内容提示 我这里主要演示Distribution模式的项目:通过unix可执行文件postinstall.sh脚本实现通过ma…

听GPT 讲Rust源代码--compiler(31)

File: rust/compiler/rustc_ast_passes/src/node_count.rs 在Rust源代码的rust/compiler/rustc_ast_passes/src/node_count.rs文件中,它定义了Rust编译器中的AST节点计数器。该文件的作用是统计不同类型的AST节点在程序中的数量,以便在优化和调试过程中能…

【Python】Excel多sheet逐行合并为一个sheet

我有一个excel,内含多个sheet,我要将不同sheet合并在一个sheet中,依然保存在这个excel文件中,命名为合并,要求列名依次对应,逐行合并,请为我写出python代码 import pandas as pd# 读取 Excel 文…

acwing KMP算法

【数据结构】KMP算法&#xff08;详解&#xff09; #include <iostream> #include <string> #include <vector>using namespace std; const int N 1e6 10; int n1, n2; char s1[N], s2[N]; vector<int> next_val(N);void get_next() {// next数组中…

详解Keras:keras.preprocessing.image

keras.preprocessing.image Keras 库中的一个模块&#xff0c;用于处理和增强图像数据&#xff0c;它提供了一些实用的函数&#xff0c;如图像的加载、预处理、增强等。 常用函数 1、load_img 用于加载图像文件&#xff0c;并返回一个 NumPy 数组表示该图像 示例 from ker…

unity编辑器Scene界面输出位置及路径

工程Asset下新建Editor文件夹&#xff1b; Editor文件夹下新建脚本LogPosition using System.Collections; using System.Collections.Generic; using UnityEditor; using UnityEngine; public class LogPosition : EditorWindow {//最终输出的数据.static string logtext;//增…

@PathVariable详解

PathVariable 用于获取URL路径中的参数值 通过 PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中&#xff1a;URL 中的 {xxx} 占位符可以通过PathVariable(“xxx”) 绑定到操作方法的入参中。 一般与RequestMapping(method RequestMethod.GET)一起使用 …

K8S-应用访问

1 service对象定位 2 Service 实践 手工创建Service 根据应用部署资源对象&#xff0c;创建SVC对象 kubectl expose deployment nginx --port80 --typeNodePortyaml方式创建Service nginx-web的service资源清单文件 apiVersion: v1 kind: Service metadata:name: sswang-ngi…

04 帧 Frame

文章目录 04 帧 Frame4.1 相机相关信息4.2 特征点提取4.2.1 特征点提取 ExtractORB()4.3 ORB-SLAM2对双目/RGBD特征点的预处理4.3.1 双目视差公式4.3.2 双目图像特征点匹配 ComputeStereoMatches()4.3.3 根据深度信息构造虚拟右目图像&#xff1a;ComputeStereoFromRGBD() 4.4 …

静态网页设计——环保网(HTML+CSS+JavaScript)(dw、sublime Text、webstorm、HBuilder X)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 感谢大佬的视频&#xff1a; https://www.bilibili.com/video/BV1BC4y1v7ZY/?vd_source5f425e0074a7f92921f53ab87712357b 使用技术&#xff1a;HTMLCSSJS&#xff08;…

【教学类-45-02】X-Y之间的三连减题(a-b-c=)

作品展示&#xff1a; 背景需求&#xff1a; 【教学类-45-01】X-Y之间的三连加题(abc)-CSDN博客文章浏览阅读5次。【教学类-45-01】X-Y之间的三连加题(abc)https://blog.csdn.net/reasonsummer/article/details/135436915 有了三连加怎么能没有三连减&#xff0c;修改参数&am…

移动通信原理与关键技术学习(第四代蜂窝移动通信系统)

前言&#xff1a;LTE 标准于2008 年底完成了第一个版本3GPP Release 8的制定工作。另一方面&#xff0c;ITU 于2007 年召开了世界无线电会议WRC07&#xff0c;开始了B3G 频谱的分配&#xff0c;并于2008 年完成了IMT-2000&#xff08;即3G&#xff09;系统的演进——IMT-Advanc…

shell 正则表达式RE 正则符号拓展源 以及脚本中的正则匹配 递归查找文件内容 sed过滤文件内容

目录 正则表达式拓展元字符正则判断数据类型递归查找文件内容sed 的使用 正则表达式 # 支持扩展正则表达式&#xff0c;即o{3}表示匹配3个字母"o"。 grep -E "o{3}" /etc/passwd # 指定使用Perl兼容的正则表达式&#xff0c;即\s表示匹配一个空格。 grep…

python协程asyncio的应用,async,await,loop

关于协程&#xff0c;asyncio&#xff0c;async&#xff0c;await&#xff0c;loop的概念&#xff0c;参照上一篇文章可迭代对象&#xff0c;迭代器&#xff0c;生成器&#xff0c;协程-CSDN博客 上一章我们详细的讲解了上述各个名词的概念&#xff0c;但是这些东西实际上该怎…

mybatisPlus CodeGenerator 代码生成

在 test 目录下新建 CodeGenerator 类&#xff0c;用于 mybatis-plus 自动生成 java 代码 package com.edward;import com.baomidou.mybatisplus.generator.FastAutoGenerator; import com.baomidou.mybatisplus.generator.config.OutputFile; import com.baomidou.mybatisplu…

【linux】Ubuntu 22.04.3 LTS截屏

一、快捷键 交互式录屏 ShiftCtrltAltR 交互式截图 Print 对窗口进行截图 AltPrint 截图 ShiftPrint 快捷键可能取决于使用的桌面环境和个人的键盘快捷键设置。如果上述快捷键不起作用&#xff0c;可能需要检查系统设置中的键盘快捷键部分&#xff0c;以了解系统中截图的…

Hive精选10道面试题

1.Hive内部表和外部表的区别&#xff1f; 内部表的数据由Hive管理&#xff0c;外部表的数据不由Hive管理。 在Hive中删除内部表后&#xff0c;不仅会删除元数据还会删除存储数据&#xff0c; 在Hive中删除外部表后&#xff0c;只会删除元数据但不会删除存储数据。 内部表一旦…

【大数据】Zookeeper 数据写入与分布式锁

Zookeeper 数据写入与分布式锁 1.数据是怎么写入的2.基于 Zookeeper 实现分布式锁 1.数据是怎么写入的 无论是 Zookeeper 自带的客户端 zkCli.sh&#xff0c;还是使用 Python&#xff08;或者其它语言&#xff09;实现的客户端&#xff0c;本质上都是连接至集群&#xff0c;然…

Redis 键中冒号的用途是什么?可以使匹配查询更快吗?

Redis 键中冒号的用途是什么在Redis中&#xff0c;冒号&#xff08;:&#xff09;用作键的分隔符&#xff0c;它的主要作用是创建层次结构和命名空间。通过在键中使用冒号&#xff0c;可以将键分为多个部分&#xff0c;从而更好地组织和管理数据。 以下是冒号在Redis键中的用途…