MQ简介

MQMessageQueue消息队列。是在互联⽹中使⽤⾮常⼴泛的—系列服务中间件。 这个词可以分两个部分来看,

—是Message:消息。消息是在不同进程之间传递的数据。这些进程可以部署在同—台机器上,也可以 分布在不同机器上。

⼆是Queue:队列。队列原意是指—种具有FI FO(先进先出)特性的数据结构,是⽤来缓存  数据的。对于消息中间件产品来说,能不能保证FI FO特性 尚值得考量。但是,所有消息队列都是需要具备存 储消息,让消息排队的能⼒ 

⼴义上来说, 只要能够实现消息跨进程传输以及队列数据缓存,就可以称之为消息队列。例如我们常⽤的QQ 、微信 、阿⾥旺旺等就都具备了这样的功能。只不过他们对接的使⽤对象是⼈ ,⽽我们这⾥讨论的MQ产品 需要对接的使⽤对象是应⽤程序。

1、MQ的作⽤主要有以下三个⽅⾯:

  (1)异步

例⼦: 快递员发快递,直接到客户家效率会很低。引⼊菜⻦驿站后,快递员只需要把快递放到菜⻦驿站, 就可以继续发其他快递去了。客户再按⾃⼰的时间安排去菜⻦驿站取快递。

作⽤ :异步能提⾼系统的响应速度 、吞吐量。

 (2)解耦

例⼦:《Thinking in JAVA》很经典,但是都是英⽂ ,我们看不懂,所以需要编辑社,将⽂章翻译成其他 语⾔, 这样就可以完成英语与其他语⾔的交流。

作⽤ 

1 、服务之间进⾏解耦,才可以减少服务之间的影响。提⾼系统整体的稳定性以及可扩展性。

2 、另外,解耦后可以实现数据分发。⽣产者发送—个消息后,可以由—个或者多个消费者进⾏消费,并 且消费者的增加或者减少对⽣产者没有影响。

 

(3)削峰

例⼦: ⻓江每年都会涨⽔ ,但是下游出⽔⼝的速度是基本稳定的,所以会涨⽔ 。引⼊三峡⼤坝后,可以把 ⽔储存起来,下游慢慢排⽔。

作⽤  以稳定的系统资源应对突发的流量冲击。

 

 Rocket MQ产品特点

 1 、Rocket MQ介绍


        Rocket MQ是阿里巴巴开源的一个消息中间件,在阿里内部历经了双十一等很多高并发场景的考验,能够处理亿万级别的消息。2016年开源后捐赠给Apache,现在是Apache的—个顶级项目。
        早期阿里使用ActiveMQ ,但是,当消息开始逐渐增多后,ActiveMQ的IO性能很快达到了瓶颈。于是, 阿⾥开始关注Kafka 。但是Kafka是针对日志收集场景设计的,他的高级功能并不是很贴合阿里的业务场景。尤其当他的Topic过多时, 由于Partition文件也会过多,这就会加大文件索引的耗时,会严重影响IO性能。于是阿里才决定自研中间件, 最早叫做MetaQ ,后来改名成为Rocket MQ 。最早他所希望解决的最大问题就是多Topic下的IO 性能压力 。但是产品在阿里内部的不断改进, Rocket MQ开始体现出一些不一样的优势。


2 、Rocket MQ特点

当今互联⽹MQ产品众多,其中,影响⼒和使⽤范围最⼤的当数Apache Kafka RabbitMQ Apache Rocket MQ以及Apache Plusar。这⼏⼤产品虽然都是典型的MQ产品,但是由于设计和实现上的—些差异,造成他们适合于不同的细分场景。

优点

缺点

适合场景

Apache Kafka

吞吐量⾮常⼤ ,性能⾮常好,集群⾼可 

会有丢数据的可

能,功能⽐较单—

⽇志分析、

⼤数据采集

Rabbit MQ

消息可靠性⾼ ,功能全⾯ 

erlang语⾔不好定 制。吞吐量⽐较    低。

企业内部⼩

规模服务调

Apache Pulsar

基于Bookeeper构建, 消息可靠性⾮常 

周边⽣态还有差

距, ⽬前使⽤的公 司⽐较少。

企业内部⼤

规模服务调

Apache 

Rocket MQ

⾼吞吐 、⾼性能 、⾼可⽤ 。功能全⾯ 

客户端协议丰富。使⽤java语⾔开发,  便定制。

服务加载⽐较慢。

⼏乎全场

景,特别适

合⾦融场景

其中Rocket MQ ,孵化⾃阿⾥巴巴。历经阿⾥多年双十一的严格考验, Rocket MQ可以说是从全世界最严苛的 ⾼并发场景中摸爬滚打出来的过硬产品,也是少数⼏个在⾦融场景⽐较适⽤的MQ产品。从横向对⽐来看,Rocket MQKafkaRabbitMQ相⽐ Rocket MQ的消息吞吐量虽然和Kafka⽐还是稍有差距,但是却⽐RabbitMQ⾼很多。在阿⾥内部, Rocket MQ集群每天处理的请求数超过5万亿次,⽀持的核⼼应⽤超过3000  个。⽽Rocket MQ最⼤的优势就是他天⽣就为⾦融互联⽹⽽ 。他的消息可靠性相⽐Kafka也有了很⼤的提升, ⽽消息吞吐量相⽐RabbitMQ也有很⼤的提升。另外, Rocket MQ的⾼级功能也越来越全⾯ ,⼴播消费 、延迟队 、死信队列等等⾼级功能一应俱全, 甚⾄某些业务功能⽐如事务消息, 已经呈现出领先潮流的趋势。

三、RocketMQ快速实战

1.快速搭建RocketMQ

RocketMQ的官网地址: http://rocketmq.apache.org 。在下载页面可以获取RocketMQ的源码包以及运行包。下载页面地址:https://rocketmq.apache.org/download。

当前最新的版本是5.x,这是一个着眼于云原生的新版本,给 RocketMQ 带来了非常多很亮眼的新特性。但是目前来看,企业中用得还比较少。因此,我们这里采用的还是更为稳定的4.9.5版本。  

注:在2020年下半年,RocketMQ新推出了5.0的大版本,这对于RocketMQ来说,是一个里程碑式的大版本。在这个大版本中,RocketMQ对整体功能做了一次大的升级。增加了很多非常有用的新特性,也对已有功能重新做了升级。
​ 比如在具体功能方面,在4.x版本中,对于定时消息,只能设定几个固定的延迟级别,而5.0版本中,已经可以指定具体的发送时间了。在客户端语言方面,4.x版本,RocketMQ原生只支持基于Netty框架的Java客户端。而在5.0版本中,增加了对Grpc协议的支持,这基本上就解除了对客户端语言的限制。在服务端架构方面,4.x版本只支持固定角色的普通集群和可以动态切换角色的Dledger集群,而在5.0版本中,增加了Dledger Controller混合集群模式,即可以混合使用Dledger的集群机制以及 Broker 本地的文件管理机制。
​ 但是功能强大,同时也意味着问题会很多。所以目前来看,企业中直接用新版本的还比较少。小部分使用新版本的企业,也大都是使用内部的改造优化版本。

 运⾏只需要下载Binary运⾏版本就可以了。 当然,源码包也建议下载下来,后续会进⾏解读。运⾏包下载下  来后,就可以直接解压,上传到服务器上。我们这⾥会上传到/app/rocketmq⽬录。解压后⼏个重要的⽬录如:

 

默认情况下, Rocket MQ建议的运⾏环境需要⾄少12G的内存, 这是⽣产环境⽐较理想的资源配置。但是,  习阶段,如果你的服务器没有这么⼤的内存空间,那么就需要做—下调整。进⼊bin ⽬录,对其中的runserver.shrunbroker.sh两个脚本进⾏—下修改。

使⽤vi runserver.sh指令,编辑这个脚本,找到下⾯的—⾏配置,调整Java进程的内存⼤⼩。 

JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m -XX:MetaspaceSize=128m - XX:MaxMetaspaceSize=320m"

接下来, 同样调整runbroker.sh中的内存⼤⼩。 

JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g"
修改为:
JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g"

 修改配置时, 注意要根据你的JDK版本调整对应的配置⾏ 。Rocket MQ是—个典型的Java应⽤ ,所以需要 提前安装JDK 。我们这⾥采⽤的是1 .8版本。JDK的安装过程略。
⽣产环境不建议调整。这—系列参数实际上就是Rocket MQ的JVM调优结果。

 Rocket MQ的后端服务分为nameserverbroker两个服务,关于他们的作⽤ ,后⾯会给你分享。接下来我们 先将这两个服务启动起来。

第⼀步:启动nameserver服务。 

 

cd /app/rocketmq/rocketmq-all-5.3.0-bin-release
nohup bin/mqnames rv &

指令执⾏后,会⽣成—个nohup.out的⽇志⽂件。在这个⽇志⽂件⾥如果看到下⾯这—条关键⽇志,就表示 nameserver服务启动成功了。

Java HotSpot(TM) 64-Bit Server VM warning: Using the DefNew young collector with the CMS collector is deprecated and will likely be removed in a future release
Java HotSpot(TM) 64-Bit Server VM warning: UseCMSCompactAtFullCollection is deprecated and
will likely be removed in a future release.
The Name Server boot success. serializeType=JSON, address 0.0.0.0:9876

 接下来,可以通过jsp指令进⾏验证。使⽤jps指令后,可以看到有—个NamesrvStartup的进程运⾏ ,也表示 nameserver服务启动完成。

第⼆步:启动broker服务

broker也是—个Java服务, 只需要调整conf⽬录下的broker.conf⽂件, 进⾏—些定制。然后就可以启动了。

具体配置项参⻅官⽅⽂档, 这⾥尽量⾛默认配置。

如果你的服务器配置了多张⽹卡, 建议配置brokerIP1属性。⽐如阿⾥云,腾讯云这样的云服务器,他们 通常有内⽹⽹卡和外⽹⽹卡两张⽹卡,那么需要增加配置brokerIP1属性,指向服务器的外⽹IP 地址,  样才能确保从其他服务器上访问到Rocket MQ 服务。

在启动broker服务前,需要先指定NameServer的服务地址。Rocket MQ可以使⽤—个NAMESRV_ADDR的环 境变量指定NameServer服务地址。 

export NAMESRV_ADDR= I localhost:9876 I

 9876是nameserver的默认服务端⼝ 。

然后也可以⽤之前的⽅式启动broker服务。启动broker服务的指令是mqbroker 

cd /app/rocketmq/rocketmq-all-5.3.0-bin-release
nohup bin/mqbroker &

 启动完成后, 同样检查nohup.out⽇志⽂件,有如下—条关键⽇志,就表示broker务启动正常了。

The broker [xxxxx] boot success. serializeType=JSON and name server is localhost:9876

 

 1、在实际服务部署时,通常会将Rocket MQ的部署地址添加到环境变量当中。例如使⽤vi ~/.bash_profile指令,添加以下内容。

export ROCKETMQ_HOME=/app/rocketmq/rocketmq-all-5.3.0-bin-release PATH=$ROCKETMQ_HOME/bin:$PATH

export PATH

这样就不必每次进⼊Rocket MQ的安装⽬录了。直接可以使⽤mqnamesrv mqbroker指令。

2 、停⽌Rocket MQ服务可以通过mqshutdown指令进⾏

mqshutdown namesrv # 关闭nameserver服务mqshutdown broker # 关闭broker服务

同样使⽤jps指令可以检查服务的启动状态。使jps指令后,可以看到—个名为BrokerStartup的进程,则表示 broker服务启动完成。 

2 、快速实现消息收发

Rocket MQ后端服务启动完成后,就可以启动客户端的消息⽣产者和消息消费者进⾏消息转发了。接下来,我 们会先通过Rocket MQ提供的命令⾏⼯具快速体验—下Rocket MQ消息收发的功能。然后,再动⼿搭建—个Maven项⽬ ,在项⽬中使⽤Rocket MQ进⾏消息收发。

(1)命令⾏快速实现消息收发

1 :通过指令启动Rocket MQ的消息⽣产者发送消息。
cd /app/rocketmq/rocketmq-all-5.3.0-bin-release
bin/tools.sh org.apache.rocketmq.example.quickstart.Producer

这个指令会默认往Rocket MQ中发送1000条消息。在命令⾏窗⼝可以看到发送消息的⽇志: 

 

.....
SendResult [sendStatus=SEND_OK, msgId=C0A841708122246B179D98C9E31103E6,
offsetMsgId=C0A8417000002A9F000000000003AEFE, messageQueue=MessageQueue [topic=TopicTest,
brokerName=192-168-65-112, queueId=1], queueOffset=249]
SendResult [sendStatus=SEND_OK, msgId=C0A841708122246B179D98C9E31203E7,
offsetMsgId=C0A8417000002A9F000000000003AFF0, messageQueue=MessageQueue [topic=TopicTest,
brokerName=192-168-65-112, queueId=2], queueOffset=249]

 这部分⽇志中,并没有打印出发送了什么消息。上⾯Send Result开头部分是消息发送到Broker后的结果。最 后两⾏⽇志表示消息⽣产者发完消息后,服务正常关闭了。

2):可以启动消息消费者接收之前发送的消息 
bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer

 消费者启动完成后,可以看到消费到的消息

......
ConsumeMessageThread_please_rename_unique_group_name_4_18 Receive New Messages:
[MessageExt [brokerName=192-168-65-112, queueId=1, storeSize=242, queueOffset=211,
sysFlag=0, bornTimestamp=1725004967502, bornHost=/192.168.65.112:52748,
storeTimestamp=1725004967502, storeHost=/192.168.65.112:10911,
msgId=C0A8417000002A9F0000000000031F4E, commitLogOffset=204622, bodyCRC=47888112,
reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic= ITopicTest I,
flag=0, properties={CONSUME_START_TIME=1725005058184, MSG_REGION=DefaultRegion,
UNIQ_KEY=C0A841708122246B179D98C9E24E034E, CLUSTER=DefaultCluster, MIN_OFFSET=0,
TAGS=TagA, WAIT=true, TRACE_ON=true, MAX_OFFSET=250}, body= [72, 101, 108, 108, 111, 32, 82, 111, 99, 107, 101, 116, 77, 81, 32, 56, 52, 54], transactionId= Inull I}]]

 每—条这样的⽇志信息就表示消费者接收到了—条消息。

这个Consumer消费者的指令并不会主动结束,他会继续挂起,等待消费新的消息。我们可以使⽤CTRL+C ⽌该进程。 

注:在Rocket MQ提供的这个简单示例中并没有打印出传递的消息内容,⽽是打印出了消息相关的很多重 要的属性。

其中有⼏个⽐较重要的属性: brokerId,brokerName,queueId,msgId,topic,cluster。这些属性的作⽤会在 后续—起分享, 这⾥你不妨先找—下这些属性是什么,消费者与⽣产者之间有什么样的对应关系。

3 、搭建Java客户端项⽬

之前的步骤实际上是在服务器上快速验证Rocket MQ的服务状态,接下来我们动⼿搭建—个Rocket MQ的客户 端应⽤ ,在实际应⽤中集成使⽤Rocket MQ

第⼀步 :创建—个标准的maven项⽬ ,在pom.xml中引⼊以下核⼼依赖

 

<dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-client</artifactId><version>5.3.0</version>
</dependency>

第⼆步:**就可以直接创建—个简单的消息⽣产者

 

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

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

相关文章

设计模式之手写策略模式实现动态支付(Java实现)

首先&#xff0c;定义一个接口类 import java.util.Map;public interface PayInterface {/*** 支付方法* param amount 支付金额* param paymentInfo 支付信息&#xff08;如卡号、密码等&#xff09;* return 支付结果*/boolean pay(double amount, Map<String, String>…

Spring Boot 虚拟线程 vs WebFlux:谁更胜一筹?

Spring Boot 作为构建现代 Java 应用程序的强大框架,为开发者提供了多种处理并发和可扩展性的解决方案。其中最受关注的两种方案是 Spring Boot 虚拟线程(Java 21 引入)和 Spring Boot WebFlux(基于响应式编程)。虽然两者都致力于优化资源利用率和提升高并发处理能力,但在…

淘宝商品搜索接口|关键字获取商品列表API接入指南

在电商领域&#xff0c;淘宝作为中国最大的电子商务平台之一&#xff0c;拥有海量的商品资源。对于开发者而言&#xff0c;通过淘宝开放平台提供的 API 接口&#xff0c;能够实现与淘宝平台的深度整合&#xff0c;其中关键字搜索商品 API 接口尤为重要。它允许开发者根据特定的…

Centos 离线部署(MQTT)EMOX脚本并设置开机自启

文件结构 install_emqx.sh #!/bin/bash # Filename: install_emqx.sh # Description: EMQX离线一键部署脚本 (针对特殊目录结构)# 检查root权限 if [[ $EUID -ne 0 ]]; thenecho "请使用root权限运行此脚本&#xff01;" exit 1 fi# 定义依赖包和安装路径 DEP_RPM&…

机器学习基础:从概念到应用的全面解析

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;10年以上C/C, C#, Java等多种编程语言开发经验&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开…

【机器学习1】线性回归与逻辑回归

‌逻辑回归与线性回归的主要区别在于理论基础、应用场景和数学模型。 1 线性回归 1.1 理论基础 线性回归主要用于建模自变量与连续性因变量之间关系的统计方法&#xff0c;试图利用一条线来拟合自变量与因变量之间的线性关系。 1.2 应用场景 从应用场景来说&#xff0c;适…

小程序 顶部栏标题栏 下拉滚动 渐显白色背景

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/3164fd0e6d6848efaa1e87e02c35179e.png 下拉 100px 后 变成渐变成白色 显示原理 <wd-navbar fixed safeAreaInsetTop :bordered"false":custom-style"background-color: rgba(255, 255, 255, op…

Java底层原理:深入理解类加载机制与反射

一、Java类加载机制 Java类加载机制是Java运行时环境的重要组成部分&#xff0c;它负责将字节码文件加载到JVM内存中&#xff0c;并将其转换为可执行的类。类加载机制的实现涉及类加载器&#xff08;ClassLoader&#xff09;、类加载过程和类加载器的层次结构。 &#xff08;…

Android 中查看数据库内容方式

一、背景 创建的db数据库&#xff0c;有时候需要查看数据库中的数据内容,或者查看数据是否有更新到数据等等。这时候就需要查看数据库的内容。 二、数据库路径 博主用的是第三方的greendao数据库框架,生成的.db文件路径如下:(路径仅供参考) /data/data/app_package/database…

unity实现浮动组件

目录 前言方法后言组件代码 前言 在unity中&#xff0c;要让一个物体变得让人感到轻飘飘的&#xff0c;就可以给一个物体添加上浮动组件。今天我们就来实现它。 方法 我们先来看一下 sin ⁡ \sin sin函数的曲线。 在这条曲线上&#xff0c;随着 x x x向右移动&#xff0c; y…

Cisco Nexus93240接口带宽显示异常高故障- bug

hardware: cisco N93240 software: 9.3(10) 1个万兆接口&#xff0c;显示的rate超出几万倍 开case查询&#xff0c;告知是bug&#xff0c;需要版本升级解决。

pyhton基础【15】函数进阶一

目录 一. 函数进阶 1. 默认参数&#xff1a; 2. 关键字参数&#xff1a; 3. 可变参数&#xff1a; 4. 装饰器&#xff1a; 5. 匿名函数lambda&#xff1a; 6. 高阶函数&#xff1a; 7. 递归函数&#xff1a; 8. 类型注解&#xff1a; 二.函数参数的高级使用 缺…

【软考高级系统架构论文】论企业应用系统的数据持久层架构设计

论文真题 数据持久层 (Data Persistence Layer) 通常位于企业应用系统的业务逻辑层和数据源层之间,为整个项目提供一个高层、统一、安全、并发的数据持久机制,完成对各种数据进行持久化的编程工作,并为系统业务逻辑层提供服务。它能够使程序员避免手工编写访问数据源的方法…

ubuntu使用 Conda 安装 pyseer详细教程

pyseer 是一个用于 微生物全基因组关联分析(GWAS) 的生物信息学工具。它可以帮助研究者识别微生物(如细菌)中与表型(如耐药性、毒力、致病性)相关的遗传变异。 一、安装mamba conda install -n base -c conda-forge mamba二、创建虚拟环境 conda create -n pyseer-env …

Redis04

redis 一、redis的作用和使用场景 redis是一个内存级的高速缓存数据库。&#xff08;对比磁盘IO&#xff09; 使用场景&#xff1a;1、并发访问量大的 2、数据量小 3、修改不频繁 项目中&#xff1a;1、验证码 2、登录成功用户信息 3、首页&#xff08;模块数据 轮播图&…

计算机网络学习笔记:TCP可靠传输实现、超时重传时间选择

文章目录 一、TCP可靠传输实现二、TCP超时重传时间选择 一、TCP可靠传输实现 TCP可靠传输的实现&#xff0c;主要基于发送方和接收方的滑动窗口&#xff0c;以及确认机制&#xff1a; 发送方在未收到确认&#xff08;ACK&#xff09;前&#xff0c;可以将序号落在发送窗口内的…

Perl 正则表达式

Perl 正则表达式 引言 Perl 正则表达式&#xff08;Regular Expressions&#xff09;是Perl编程语言中一个强大且灵活的工具&#xff0c;用于字符串处理和模式匹配。正则表达式在文本处理、数据验证、搜索和替换等任务中发挥着至关重要的作用。本文将深入探讨Perl正则表达式的…

Security: RSA: 1024 bit 长度已经变得不安全了

文章目录 参考推荐限制RHEL相关配置man crypto-policies包含的应用使用方法是配置文件include参考 https://csrc.nist.gov/pubs/sp/800/57/pt1/r2/final https://www.linuxquestions.org/questions/linux-security-4/1024-bit-dsa-vs-2048-bit-rsa-4175439131/ https://csrc.n…

第一课:大白话中的机器学习

各位看官好啊!今天咱们来聊一个听起来高大上但实际上特别接地气的玩意儿——机器学习。别被这名字吓到,它其实就是教电脑像人类一样学习知识的一套方法。想象一下你教你家狗子坐下、握手的过程,机器学习差不多就是这么回事,只不过"学生"换成了电脑。 一、啥是机…

实现 el-table 中键盘方向键导航功能vue2+vue3(类似 Excel)

实现 el-table 中键盘方向键导航功能vue2vue3&#xff08;类似 Excel&#xff09; 功能需求 在 Element UI 的 el-table 表格中实现以下功能&#xff1a; 使用键盘上下左右键在可编辑的 el-input/el-select 之间移动焦点焦点移动时自动定位到对应单元格支持光标位置自动调整…