消息中间件 - RocketMQ基础

  • 一个进程内能够创建的线程数量是有限的。 
所有中间件的目的:
  1. 性能效率上的一个提升
  2. 代理:帮你去完成一些额外的事情

MQ介绍

MQ概述

  • MQ全称Message Queue(消息队列),是在消息的传输过程中保存消息的容器多用于分布式系统之间进行通信。
  • 在计算机领域,消息指的就是数据(跟业务整合的)!
  • 消息队列是应用程序和应用程序之间的通信方法,主要应用在多个工程之间,相互的传递消息,消息由生产者发送到MQ进行排队,然后按原来的顺序由消费者从MQ当中来拉取消息进行处理。
  • 队列:数据结构的一种,特征为"先进先出" - FIFO,意思是有序的。

为什么使用MQ?

  • 在项目中,可将一些无需即时返回且耗时的操作提取出来,进行异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高系统的吞吐量。 

Tomcat的并发量大约是500个请求左右/s!(500个请求就意味着有500个线程) 

MQ的优势和劣势

优势:

  1. 应用解耦
  2. 异步提速
  3. 削峰填谷

劣势:

  1. 系统的可用性降低
  2. 系统复杂度提高
  3. 一致性问题 

1. 应用解耦:消费者存活与否不影响生产方

应用解耦意思就是消费者无论挂掉没有,都不影响生产者在这里发消息,MQ就相当于是一个中介,生产者通过MQ与消费者进行交互!

应用解耦 / 使用MQ使得应用间解耦  可以提高系统的容错性和可维护性!

  • 一个程序和另一个程序它们的耦合度要降低!(高内聚,低耦合)
  • 系统的耦合度越高,容错性就越低,可维护性就越低!

2. 异步提速:生产方发完消息,可以继续进行下一步的业务逻辑  

同步:一个一个来/走,你走完了我才能走 ⇒ 一个动作做完以后才能进行下一个动作。

异步:各来/走各的 ⇒ 两个动作可以同时做。

  • 将不需要同步处理并且耗时长的操作由消息队列来通知消息接收方进行异步处理,从而提高应用程序的响应时间,提升系统的吞吐量。
  • 异步调用能够提高系统的响应速度以及吞吐量。

3. 削峰填谷

  • TPS:每秒事务数 
  • 削峰填谷指的是通过消息队列平滑、缓和的处理高峰期突发产生的高并发流量,从而减少对后端服务的冲击,避免因突发流量而导致应用崩溃或系统瘫痪。
  • 这种技术的实现方式是将突发的请求放入到消息队列当中,这样一来,高峰期产生的数据就会被积压在MQ当中,高峰就被"削"掉了,然后通过异步或定时任务的方式,从消息队列当中取出消息,并以匀速的方式发送到后端服务中,直到消费完积压的消息,这就叫做"填谷",这样就可以平滑的处理高并发流量,在避免请求过多、并发过高的同时,保障了后端服务的正常工作。
  • 削峰填谷技术在一些高并发的场景下被广泛应用,比如秒杀、抢购等大规模的并发场景。
  • 削峰填谷后,可以提高系统的稳定性。
     

MQ的劣势

1. 系统的可用性降低(降低系统的可用性)

  • 因为你在系统当中引入了一个MQ这样的组件,你只要引入组件的话,这个组件万一坏了,我们整个系统不就全崩掉了,所以说只要是引入了新的一些组件,那么必然会造成系统的可用性降低!
  • 系统引入的外部依赖越多,系统稳定性越差,一旦MQ宕机,就会对业务造成影响。

如何保证MQ的高可用?

2. 系统复杂度提高

  • MQ的加入大大增加了系统的复杂度,以前系统间是同步的远程调用,现在是通过MQ进行异步调用。 

如何保证消息没有被重复消费?如何处理消息丢失情况?如何保证消息传递的顺序性呢?

3. 一致性问题 

  • A系统处理完业务,通过MQ给B、C、D三个系统发消息数据,B、C、D都要处理完才算事务的一致,如果B系统、C系统处理成功,D系统处理失败,那么整个事务的处理也算是失败的!

所以如何保证消息数据处理的一致性呢? 

MQ产品介绍

1. ActiveMQ
  • 纯Java语言实现,并发量较低,万级数据吞吐量,处理速度比较慢,处理速度达到毫秒ms级,成熟度高
2. RabbitMQ
  • 底层由erlang语言实现,erlang语言比较底层,直接和物理硬件进行交互,因此处理速度会非常快,处理速度是微秒us级别的,
3. RocketMQ
  • Java语言实现,高吞吐,万亿级吞吐保证,处理速度毫秒级别,分布式架构,功能强大,扩展性强
4. Kafka
  • scala语言实现,scala是运行在我们的Java虚拟机上的一门语言,吞吐量高,处理速度也比较快,处理速度达到毫秒级,但是功能比较单一,应用于日志分析、大数据采集较多,所以在大数据的技术当中,用Kafka是最多的。

RocketMQ概述

  • RocketMQ是阿里开源的一款非常优秀的中间件产品,脱胎于阿里的另一款队列技术MetaQ,后捐赠给Apache基金会作为一款孵化技术仅仅经历了一年多的时候就成为了Apache基金会的顶级项目,它现在已经在阿里内部被广泛的应用,并且经受住了多次双十一的这种极致场景的压力!(2017年的双十一,RocketMQ流转的消息量达到了万亿级,峰值TPS达到了5600万) 

RocketMQ解决了MQ的所有缺点~!

RocketMQ的工作原理

  • 生产者集群来进行发消息 
  • Broker:部署着RocketMQ的机器就叫一台Broker。
  • 生产者发消息到RocketMQ当中,然后RocketMQ还能返回一个接收结果。
  • 消息的消费者就会从RocketMQ当中来拉取消息。

我们的消息达到了RocketMQ之后,我们的消费者它怎么就知道消息队列当中就有了消息了呢?

有两种模式:

1. 拉取模式(拉取消费):消费者这里可以起一个线程之类的,每隔一秒钟问一下RocketMQ,队列当中有消息吗?

  • 拉取模式很不好,很占用我们消费者的资源,因为每秒钟它都要发一次请求去拉取数据。

2. 监听器模式或推送模式(推送消费 - 常用):我们的消费者和RocketMQ建立一个长连接,建立好了长连接之后,一旦RocketMQ当中有了消息并且有某一个消费者监听着某一个队列,那么RocketMQ就会把这个消息推送给消息的消费者,这就是一个推送模式或者叫我们的消费者起一个监听器。

这就是最基础的消息的发送与接收!

它就是专门来存储一些元数据。

JMS:就是消息领域的JDBC

 

RocketMQ安装启动

消息发送

消息类别

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ArcGIS小技巧|四种计算图斑面积的方法

ArcGIS中有多种方法可计算出图斑面积,本文总结了四种方法,是否可堪称史上最全? 1、计算几何 这是最适合非专业人士的方法,直接利用ArcGIS中的计算几何功能进行计算。 a、首先添加一double类型字段,用来存储面积数值。…

论文阅读——Detection Hub(cvpr2023)

Detection Hub: Unifying Object Detection Datasets via Query Adaptation on Language Embedding 一、要解决的问题 大规模数据集可以提高模型性能,但是当训练多类别单一模型时,大规模数据集不能用在目标检测任务上,因为两个困难&#xff1…

【qemu逃逸】XCTF 华为高校挑战赛决赛-pipeline

前言 虚拟机用户名: root 无密码 设备逆向与漏洞分析 程序没有去符合, 还是比较简单. 实例结构体如下: 先总体说一下流程: encode 为 base64 编码函数, decode 为 base64 解码函数. 然后 encPipe 和 decPipe 分别存放编码数据和解码数据, 分别有四个: 其中 EncPipeLine 中…

简单选择排序(c语言代码实现)

选择排序:简单选择排序(不稳定的排序) 简单选择排序是一种基础的排序算法,它的基本思路是在未排序的序列中选择最小(或最大)的元素,将其与序列的第一个元素进行交换,然后在剩余的未…

解决idea启动tomcat控制台中文乱码

#1.tomcat日志中文乱码# 如图这种情况,一般在idea用tomcat跑一个web项目启动后tomcat日志在控制台打印出来会出现中文乱码的情况 解决方案1:tomcat的日志配置文件的编码修改,找到tomcat安装目录conf下的logging.properties,encod…

2022年06月 Python(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 有如下Python程序,包含lambda函数,运行该程序后,输出的结果是?( ) g = lambda x,y:x*y print(g(2,3)

【数据结构】树与二叉树(七):二叉树的遍历

文章目录 5.1 树的基本概念5.1.1 树的定义5.1.2 森林的定义5.1.3 树的术语5.1.4 树的表示 5.2 二叉树5.2.1 二叉树1. 定义2. 特点3. 性质引理5.1:二叉树中层数为i的结点至多有 2 i 2^i 2i个,其中 i ≥ 0 i \geq 0 i≥0。引理5.2:高度为k的二叉…

从0到1的Springcloud Alibaba项目,一篇入门!!!

1、新建项目 我们用maven管理项目 第一步:选择maven 第二步:项目命名,项目路径 第三步:进入项目,把src文件夹删掉(不删也没事,主要是用不到这个文件夹) 2、引入项目依赖 在父项目…

【vue会员管理系统】篇六之退出系统功能

一、效果图 点击之后跳转到登陆界面 二、实现步骤 2.1Easy Mock新增接口 打开Easy Mock新建接口 方法:post URL:user/logout 描述:退出系统 2.2新增api 在api/login.js下添加以下代码 export function logout(token) {return request({url: /user/logout,method:…

小白学安全-KunLun-M静态白盒扫描工具

一、KunLun-M简介 KunLun-M是一个完全开源的静态白盒扫描工具,支持PHP、JavaScript的语义扫描,基础安全、组件安全扫描,Chrome Ext\Solidity的基础扫描。开源地址:https://github.com/LoRexxar/Kunlun-M Cobra是一款源代码安全审计…

板刷codeforces 1000分

练习 1.Problem - 1A - Codeforces AC代码: #include <bits/stdc.h> #define endl \n #define int long long using namespace std; int n,m,a; void solve() {cin>>n>>m>>a;cout<<(n/a(n%a!0))*(m/a(m%a!0))<<endl; } signed main() {…

两数相加 js

道阻且长&#xff0c;行而不辍&#xff0c;未来可期 两数相加 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 …

ElementUI的Dialog弹窗实现拖拽移动功能

实现ElementUI的Dialog弹窗可以拖拽移动 实现步骤&#xff1a; 1.创建自定义指令 在utils文件夹下新建文件夹 utils/directive/el-dragDialog/index.js import drag from ./dragconst install function(Vue) {Vue.directive(el-drag-dialog, drag) }if (window.Vue) {windo…

操作系统·进程管理

2.1 前趋图和程序执行 2.1.1 前趋图 前趋图是一个有向无循环图&#xff0c;记为DAG&#xff0c;可用于描述程序/进程之间执行的前后关系&#xff0c;无循环关系可实现顺序执行。 2.1.2 程序的顺序执行 在计算机系统中只有一个程序在运行&#xff0c;这个程序独占系统中所有资…

【面试经典150 | 】颠倒二进制位

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;逐位颠倒方法二&#xff1a;分治 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于…

判断sparse matrix是否是对称矩阵

参考&#xff1a; https://stackoverflow.com/questions/48798893/error-in-checking-symmetric-sparse-matrix import scipy.sparse as sp import numpy as np np.random.seed(1)a sp.random(5, 5, density0.5)a结果如下 sym_err a - a.T sym_check_res np.all(np.abs(s…

汉诺塔 --- 递归回溯算法练习一

目录 1. 什么叫汉诺塔 2. 分析算法原理 2.1. 当盘子的数量为1 2.2. 当盘子的数量为2 2.3. 当盘子的数量为3时 3. 编写代码 3.1. 挖掘重复子问题 3.2. 只关心某一个子问题如何处理 3.3. 递归的结束条件 3.4. 代码的编写 4. 递归展开图分析 1. 什么叫汉诺塔 力扣上的原…

iOS代码混淆----自动

先大致解释一下“编译"、"反编译": 编译&#xff1a;就是把千千万万行字符串(也叫代码&#xff0c;或者源文件)&#xff0c;变成010101010101(机器码&#xff0c;也叫目标代码) 编译过程&#xff1a;预处理-编译-汇编-链接 我的脚本运行在预处理阶段。 反编…

【自动控制原理】时域分析法:稳定性分析(稳)、误差分析和计算(准)

文章目录 第3章 时域分析法3.1 基本概念3.2~4 一阶、二阶、高阶系统的时间响应及动态性能3.6 稳定性分析——稳3.6.1. 稳定性的定义3.6.2 稳定性的条件3.6.3 劳斯稳定判据首列出现0&#xff0c;但该行不全为0首列出现0&#xff0c;且该行全为0 3.5 误差分析和计算——准3.5.1稳…

栈的顺序存储实现(C语言)(数据结构与算法)

栈的顺序存储实现通常使用数组来完成。实现方法包括定义一个固定大小的数组&#xff0c;以及一个指向栈顶的指针。当元素入栈时&#xff0c;指针加一并将元素存储在相应位置&#xff1b;当元素出栈时&#xff0c;指针减一并返回相应位置的元素。 1. 顺序栈定义 #define MaxSi…