【RocketMQ】MQ与RocketMQ介绍

news2024/11/18 11:24:20

🎯 导读:本文介绍了消息队列(MQ)的基本概念及其在分布式系统中的作用,包括实现异步通信、削峰限流和应用解耦等方面的优势,并对ActiveMQ、RabbitMQ、RocketMQ及Kafka四种MQ产品进行了对比分析,涵盖了它们的开发语言、吞吐量、时效性和可用性等特点。此外,文章还特别介绍了RocketMQ,包括其架构设计、高可用性实现方式以及消费模式等内容,突出了RocketMQ在消息顺序消费、拉取模式、扩展性等方面的优势。

文章目录

  • MQ简介
    • MQ定义
    • MQ作用
      • `作用一:异步`
      • `作用二:削峰限流`
      • `作用三:解耦`
    • 为什么要使用MQ
    • MQ使用流程
      • 实际业务
  • 不同 MQ 产品对比
  • RocketMQ简介
    • 相关重要概念
    • RocketMQ为何高可用
    • Broker内部结构
    • 生产和消费理解
    • 消费模式

MQ简介

MQ即Message Queue

  • Message消息:消息可以是一句话、一个短信、一份邮件、一份业务数据
  • Queue队列:用来存放消息
  • 生产者将消息发送到队列中,消费者到队列中获取消息进行消费

MQ定义

  • MQ是一个消息中间件(如缓存中间件有redis、memcache;数据库中间件有mycat、canal)
  • 利用高效可靠的消息传递机制进行与平台无关(跨平台)的数据交流,并基于数据通信来进行分布式系统的集成。
  • 通过提供消息传递和消息排队模型在分布式环境下提供应用解耦,弹性伸缩,冗余存储,流量削峰,异步通信,数据同步等

MQ作用

为什么要用消息队列来存储消息,生产者为什么不直接发给消费者?

作用一:异步

生产者发给消费者,消费者在忙其他事,当前没时间处理,咋办?生产者等着吗,显然不合理。使用异步的方式,生产者发完消息之后,就去做自己的事情,后续消费者有空再去队列中获取数据来执行业务即可;

案例:假如系统 A 希望发送一个消息给系统 B 去处理,但系统 A 不关注系统 B 到底怎么处理或者有没有处理完,系统 A 把消息发送给 MQ ,就不管这条消息的死活了,接着系统 B 从MQ里面消费出来处理即可。至于怎么处理,是否处理完毕,什么时候处理,都是系统 B 的事,与系统 A 无关。

在这里插入图片描述

这样的一种通信方式,就是所谓的“异步”通信方式,对于系统A来说,只要把消息发给MQ,然后系统B就会异步处去进行处理了,系统A不需要“同步”的等待系统B处理完。这样的好处是什么呢?解耦

作用二:削峰限流

消费者的业务执行能力是有限的,例如一个业务执行需要花费3秒。假如大量请求同时过来,tomcat线程池的线程被占用完了,后续的请求会报错(503服务不可用)。如果请求过来之后,直接放到消息队列就返回,这样就可以大大降低服务不可用的概率,后续消费者再去消息队列里面慢慢获取业务信息去执行即可;

作用三:解耦

取消应用之间、模块之间的强耦合关系,让程序更加健壮、高可用。如果模块都直接耦合在一块,一个模块出问题,很容易影响到其他模块。通过使用A模块->消息队列->B模块模式将A、B模块解耦

【应用系统解耦的好处】

  • 发送者和接收者不必了解对方,只需要确认消息
  • 发送者和接收者不必同时在线

为什么要使用MQ

1、做系统解耦,当新的模块进来时,可以做到代码改动最小; 解耦

2、让后端系统按自身吞吐能力进行消费,不被瞬时流量冲垮; 削峰限流

3、通过强弱依赖梳理,把非关键调用链路的操作异步化,提升整体系统的吞吐能力; 异步处理

MQ使用流程

  • 发送者把消息发给消息服务器,消息服务器把消息存放在若干队列/主题中,在合适的时候,消息服务器会把消息转发给接收者。在这个过程中,发送和接受是异步的,发送无需等待,发送者和接受者的生命周期没有必然关系。
  • 在发布pub/订阅sub模式下,也可以完成一对多的通信,即让一个消息有多个接受者(例如微信订阅号)

在这里插入图片描述

实际业务

在这里插入图片描述

不同 MQ 产品对比

MQ主要关注两个性能:

  • 吞吐量:单位时间内可以处理多少条消息(用消息大小来描述更准确,因为消息内存越小,数量会越大)
  • 时效性:生产者发消息,MQ多久才收到消息

【对比】

特性ActiveMQRabbitMQRocket MQkafka
开发语言javaerlangjavascala
单机吞吐量万级万级10万级10万级
时效性ms级us级ms级ms级以内
可用性高(主从架构)高(主从架构)非常高(分布式架构)非常高(分布式架构)
功能特性成熟的产品,在很多公司得到应用;有较多的文档;各种协议支持较好基于Erlang开发,所以并发能力很强,性能极其好,延时很低;管理界面较丰富MQ功能比较完备,扩展性佳只支持主要的MQ功能,像一些消息查询,消息回溯等功能没有提供,毕竟是为大数据准备的,在大数据领域应用广。

【总结】

  • activeMQ:使用java实现(jms 协议),性能一般,出现早,功能单一,吞吐量低
  • rabbitmq:使用erlang实现(amqp 协议),性能好,功能丰富,吞吐量一般
  • rocketmq:使用java实现,性能好,功能最丰富,吞吐量高
  • kafka:使用scala实现,吞吐量最大,功能单一(专注读、写),主要用于大数据领域(数据又多又大)

RocketMQ简介

官网: http://rocketmq.apache.org/

在这里插入图片描述

RocketMQ是阿里巴巴2016年MQ中间件,使用Java语言开发,是一款开源的分布式消息系统(可以做集群),基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。同时,广泛应用于多个领域,包括异步通信解耦、企业解决方案、金融支付、电信、电子商务、快递物流、广告营销、社交、即时通信、移动应用、手游、视频、物联网、车联网等。

具有以下特点:

  1. 能够严格保证消息按照顺序消费
  2. 提供丰富的消息拉取模式
  3. 高效的订阅者水平扩展能力
  4. 实时的消息订阅机制
  5. 亿级消息堆积能力

相关重要概念

  • Producer(生产者):消息的发送者;举例:发件人
  • Consumer(消费者):消息的接收者;举例:收件人
  • Broker:暂存和传输消息的通道;举例:快递公司
  • NameServer:管理Broker,相当于broker的注册中心,保留了broker的信息;举例:各个快递公司的管理机构
  • Queue(队列):消息真实存放的位置,一个Broker中可以有多个队列
  • Topic(主题):消息的分类(虚拟的结构,用来区分不同类型的消息)
  • ProducerGroup(生产者组)
  • ConsumerGroup(消费者组):多个消费者组可以同时消费一个主题的消息

【单机版本结构】

在这里插入图片描述

【消息发送流程】

  • Producer 询问 NameServer,NameServer 分配一个 broker,Producer 将消息发给 broker
  • Consumer 询问 NameServer,得到消息所在具体的broker,然后消费消息

RocketMQ为何高可用

如何设计高可用消息队列?

光是这样设置,不是高可用的,一旦broker挂了,业务就中断

在这里插入图片描述

  • 使用broker集群实现写的高可用

在这里插入图片描述

  • 使用主从同步实现读的高可用。读可以去主节点读,也可以去从节点读(负载均衡)

在这里插入图片描述

Broker内部结构

一个Broker里面可以存放多个Topic,一个Topic里面可以存放多个队列

在这里插入图片描述

生产和消费理解

在这里插入图片描述

消费模式

MQ的消费模式可以大致分为两种

  • 推 Push :服务端【MQ】主动推送消息给客户端,优点是**及时性较好,**但如果客户端没有做好流控,一旦服务端推送大量消息到客户端时,就会导致客户端消息堆积甚至崩溃(客户端压力大
  • 拉 Pull :客户端需要主动到服务端【MQ】拉取数据,优点是客户端可以依据自己的消费能力进行消费,拉取的频率需要用户自己控制(压力可控,可以一次性拉取一批数据,效率更高),拉取频繁容易造成服务端和客户端的网络传输压力,拉取间隔长又容易造成消费不及时(实时性不强
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("test-consumer-group");
DefaultMQPushConsumer consumer = new DefaultMQPullConsumer("test-consumer-group");

Push模式也是基于pull模式的(不管是push还是pull,实际底层都是pull),只能客户端内部封装了api(每隔一段时间去pull一次)

  • 一般场景下,上游消息生产量小或者均速的时候,选择push模式
  • 在特殊场景下,例如电商大促,抢优惠券等场景可以选择pull模式

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

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

相关文章

【Canvas与诗词】秋夕.杜牧(银烛秋光冷画屏......)

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>金六边形外圈绿色底录杜牧秋夕诗</title><style type"…

Unity实战案例全解析:RTS游戏的框选和阵型功能(1) 基础要素

本案例来源于unity唐老狮&#xff0c;有兴趣的小伙伴可以去泰克在线观看该课程 【唐老狮】Unity实现 即时战略游戏 阵型功能 - 泰课在线 -- 志存高远&#xff0c;稳如泰山 - 国内专业的在线学习平台|Unity3d培训|Unity教程|Unity教程 Unreal 虚幻 AR|移动开发|美术CG - Powered…

【CTF Web】Pikachu 反射型xss(get) Writeup(反射型XSS+GET请求)

XSS&#xff08;跨站脚本&#xff09;概述 Cross-Site Scripting 简称为“CSS”&#xff0c;为避免与前端叠成样式表的缩写"CSS"冲突&#xff0c;故又称XSS。一般XSS可以分为如下几种常见类型&#xff1a; 1.反射性XSS; 2.存储型XSS; 3.DOM型XSS; XSS漏洞一直被评估…

Java基于easyExcel的自定义表格格式

这里用的到easyExcel版本为3.3.4 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.4</version></dependency> 效果 代码部分 package com.tianyu.test;import com.alibaba.exc…

全网最适合入门的面向对象编程教程:54 Python字符串与序列化-字符串格式化与format方法

全网最适合入门的面向对象编程教程&#xff1a;54 Python 字符串与序列化-字符串格式化与 format 方法 摘要&#xff1a; 在 Python 中&#xff0c;字符串格式化是将变量插入到字符串中的一种方式&#xff0c;Python 提供了多种字符串格式化的方法&#xff0c;包括旧式的 % 格…

BFS之最短路径模型

当一个图的每个边的权重都一样的时候&#xff0c;会有一个最短路径模型。不需要考虑边的影响。 1076. 迷宫问题 - AcWing题库 #include<iostream> #include<queue> #include<utility> #include<algorithm> #include<stack> using namespace std…

C语言课程设计题目七:学生成绩管理系统设计

题目七&#xff1a;学生成绩管理系统设计 学生成绩信息包括&#xff1a;学期&#xff0c;学号&#xff0c;班别&#xff0c;姓名&#xff0c;四门课程成绩(语文、数学、英语和计算机)等。 主要功能&#xff1a; 能按学期、按班级完成对学生成绩的录入、修改。能按班级统计学生…

力扣最热一百题——颜色分类

目录 题目链接&#xff1a;75. 颜色分类 - 力扣&#xff08;LeetCode&#xff09; 题目描述 示例 提示&#xff1a; 解法一&#xff1a;不要脸用sort Java写法&#xff1a; 运行时间 解法二&#xff1a;O1指针 Java写法&#xff1a; 重点 运行时间 C写法&#xff1a;…

Python库matplotlib之二

Python库matplotlib之二 figureAxessubplot figure matplotlib.pyplot.figure(numNone, figsizeNone, dpiNone, facecolorNone, edgecolorNone, frameonTrue, FigureClass<class ‘matplotlib.figure.Figure’>, clearFalse, **kwargs) num&#xff0c;int 或 str 或 fi…

Starfyre:一款使用纯 Python 创建响应式前端应用的 Python Web 框架

Starfyre 是一款基于 WebAssembly (WASM) 的 Python Web 框架&#xff0c;它允许你使用纯 Python 创建响应式前端应用。这意味着你可以轻松地构建交互式、实时应用程序&#xff0c;无需繁琐的 JavaScript 代码。Starfyre 基于 Pyscript 实现客户端功能&#xff0c;并通过 pyxid…

【每天学个新注解】Day 9 Lombok注解简解(八)—@Synchronized、@Locked

Synchronized 通过锁代码块的方式实现同步锁。 当synchronized修饰类属性时&#xff0c;通常用于定义同步代码块&#xff0c;此时需要指定一个锁对象。这个锁对象通常是类的某个私有静态成员变量&#xff0c;因为类属性是静态的&#xff0c;所以锁也应该是静态的&#xff0c;以…

【Python】YOLO牛刀小试:快速实现视频物体检测

YOLO牛刀小试&#xff1a;快速实现视频物体检测 在深度学习的众多应用中&#xff0c;物体检测是一个热门且重要的领域。YOLO&#xff08;You Only Look Once&#xff09;系列模型以其快速和高效的特点&#xff0c;成为了物体检测的首选之一。本文将介绍如何使用YOLOv8模型进行…

二叉搜索树的介绍、模拟实现二叉搜索树、leetcode---根据二叉树创建字符串、leetcode---二叉树的最近公共祖先等的介绍

文章目录 前言一、二叉搜索树的介绍二、模拟实现二叉搜索树三、leetcode---根据二叉树创建字符串四、leetcode---二叉树的最近公共祖先总结 前言 二叉搜索树的介绍、模拟实现二叉搜索树、leetcode—根据二叉树创建字符串、leetcode—二叉树的最近公共祖先等的介绍 一、二叉搜索…

57 长短期记忆网络(LSTM)_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录长短期记忆网络&#xff08;LSTM&#xff09;门控记忆元输入门、忘记门和输出门候选记忆元 (相当于RNN中计算 H t H_t Ht​)记忆元隐状态 从零开始实现初始化模型参数定义模型训练和预测 简洁实现小结练习 长短期记忆网络&#xff08;LSTM&a…

0基础学习CSS(六)字体

CSS 字体 CSS字体属性定义字体&#xff0c;加粗&#xff0c;大小&#xff0c;文字样式。 serif和sans-serif字体之间的区别 在计算机屏幕上&#xff0c;sans-serif字体被认为是比serif字体容易阅读 CSS字型 在CSS中&#xff0c;有两种类型的字体系列名称&#xff1a; 通用字体…

Java | Leetcode Java题解之第443题压缩字符串

题目&#xff1a; 题解&#xff1a; class Solution {public int compress(char[] chars) {int n chars.length;int write 0, left 0;for (int read 0; read < n; read) {if (read n - 1 || chars[read] ! chars[read 1]) {chars[write] chars[read];int num read …

解读文本嵌入:语义表达的练习

【引子】近来在探索并优化AIPC的软件架构&#xff0c;AI产品经理关于语义搜索的讨论给了自己较多的触动&#xff0c;于是重新梳理嵌入与语义的关系&#xff0c;遂成此文。 文本转换成机器可理解格式的最早版本之一是 ASCII码&#xff0c;这种方法有助于渲染和传输文本&#xff…

win10系统K8S安装教程

准备工作 电脑硬件&#xff1a;支持虚拟化的CPU&#xff0c;内存最好在32G以上&#xff0c;16G也可以操作系统&#xff1a;window10 专业版 1 开启虚拟化 1.1 BIOS 由于主板和CPU的品牌不太一样&#xff0c;这里的操作仅供参考&#xff0c;以Intel的平台为例&#xff1a; …

【刷点笔试面试题试试水】有符号变量与无符号变量的值的转换

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: 注意无符号类型与有符合类型参与计算会做类型提升,有符合的变为无符号…

加法器以及标志位

加法器的结构&#xff1a; OF&#xff08;溢出标志位&#xff09;&#xff0c;SF&#xff08;符号标志位&#xff09;&#xff0c;ZF&#xff08;0标志位&#xff09;&#xff0c;ZF&#xff08;进位/借位标志位&#xff09; 有符号数看标志位&#xff1a;OF&#xff0c;SF 无符…