RocketMQ的使⽤

初识MQ

1.1.同步和异步通讯

微服务间通讯有同步和异步两种⽅式:
同步通讯:就像打电话,需要实时响应。
异步通讯:就像发邮件,不需要⻢上回复。
两种⽅式各有优劣,打电话可以⽴即得到响应,但是你却不能跟多个⼈同时通话。发送邮件可以同
时与多个⼈收发邮件,但是往往响应会有延迟。
1.1.1.同步通讯
Feign调⽤就属于同步⽅式,虽然调⽤可以实时得到结果,但存在下⾯的问题

 

 

 

总结:
同步调⽤的优点:
  • 时效性较强,可以⽴即得到结果
同步调⽤的问题:
  • 耦合度⾼
  • 性能和吞吐能⼒下降
  • 有额外的资源消耗
  • 有级联失败问题(由于⼀个故障导致了连锁反应,使得系统中的其他组件或节点也相继失败)
 1.1.2.异步通讯

异步调⽤则可以避免上述问题:
我们以购买商品为例,⽤户⽀付后需要调⽤订单服务完成订单状态修改,调⽤物流服务,从仓库分配响应的库存并准备发货。
在事件模式中,⽀付服务是事件发布者(publisher),在⽀付完成后只需要发布⼀个⽀付成功的事件 (event),事件中带上订单id。
订单服务和物流服务是事件订阅者(Consumer),订阅⽀付成功的事件,监听到事件后完成⾃⼰业务即可。

 

为了解除事件发布者与订阅者之间的耦合,两者并不是直接通信,⽽是有⼀个中间⼈(Broker)。发布者发布事件到Broker,不关⼼谁来订阅事件。订阅者从Broker订阅事件,不关⼼谁发来的消息

 

 

Broker 是⼀个像数据总线⼀样的东⻄,所有的服务要接收数据和发送数据都发到这个总线上,这
个总线就像协议⼀样,让服务间的通讯变得标准和可控。
好处:
吞吐量提升:⽆需等待订阅者处理完成,响应更快速
故障隔离:服务没有直接调⽤,不存在级联失败问题
调⽤间没有阻塞,不会造成⽆效的资源占⽤
耦合度极低,每个服务都可以灵活插拔,可替换
流量削峰:不管发布事件的流量波动多⼤,都由Broker接收,订阅者可以按照⾃⼰的速度去处理
事件
缺点:
架构复杂了,业务没有明显的流程线,不好管理
需要依赖于Broker的可靠、安全、性能
好在现在开源软件或云平台上 Broker 的软件是⾮常成熟的,⽐较常⻅的⼀种就是我们今天要学习
的MQ技术。

 1.2.技术对⽐

MQ,中⽂是消息队列(MessageQueue),字⾯来看就是存放消息的队列。也就是事件驱动架构
中的Broker。
⼏种常⻅MQ的对⽐:

 

 

追求可⽤性:Kafka、 RocketMQ 、RabbitMQ
追求可靠性:RabbitMQ、RocketMQ
追求吞吐能⼒:RocketMQ、Kafka
追求消息低延迟:RabbitMQ、Kafka
不同的消息队列系统在不同场景下有各⾃的优势和适⽤性。以下是各个消息队列系统在不同场合下的最佳选择:

 Kafka:

最佳场合:⼤规模数据处理、实时⽇志收集和分析、流式处理。

优势:⾼吞吐量、低延迟、⽔平扩展能⼒强、⻓期消息存储,适合构建⼤规模的实时数据流处理平台,如实时⽇志收集和分析、事件流处理等。
RabbitMQ:
最佳场合:传统的企业级应⽤、轻量级的消息传递场景。
优势:简单易⽤、⽀持多种消息协议、适合点对点和发布/订阅模式,对于传统的企业应⽤和中⼩规模的消息传递需求,是⼀种可靠的选择
ActiveMQ:
最佳场合:中⼩规模的企业应⽤、Java⽣态系统中的集成需求。
优势:Java开发环境友好、⽀持多种消息协议,适合与Java⽣态系统的其他组件集成,如Spring框架等。
RocketMQ:
最佳场合:⼤规模的分布式系统、互联⽹应⽤、⾦融领域的消息处理。
优势:⾼吞吐量、低延迟、丰富的消息存储模式,适⽤于处理⼤规模的消息传递场景,特别是在互联⽹
和⾦融领域。
综合考虑以上因素,可以做如下简单总结:
如果需要处理⼤规模的实时数据流、⽇志收集和分析等⾼吞吐量场景,⾸选Kafka。
如果对于消息传递的简单性和易⽤性有较⾼要求,适合中⼩规模的企业应⽤和轻量级消息传递需求,可以选择RabbitMQ或ActiveMQ。
如果在⼤规模的分布式系统、互联⽹应⽤或⾦融领域需要处理消息传递,RocketMQ是⼀个较好的选择。

2.RocketMQ简介

官⽹: http://rocketmq.apache.org/
RocketMQ是阿⾥巴巴2016年MQ中间件,使⽤Java语⾔开发,RocketMQ 是⼀款开源的分布式消息系 统,基于⾼可⽤分布式集群技术,提供低延时的、⾼可靠的消息发布与订阅服务。同时,⼴泛应⽤于多个领域,包括异步通信解耦、企业解决⽅案、⾦融⽀付、电信、电⼦商务、快递物流、⼴告营销、社交、即时通信、移动应⽤、⼿游、视频、物联⽹、⻋联⽹等。
RocketMQ的设计⽬标是⽀持⼤规模消息处理,具有⾼并发、⾼可⽤和容错能⼒。它在多个⽅⾯提供了强⼤的功能和特性:
分布式架构:RocketMQ采⽤分布式架构,⽀持在多个节点之间进⾏消息的发送和接收,实现了⽔平扩展能⼒。
⾼吞吐量:RocketMQ可以在⼤规模并发场景下实现⾼吞吐量的消息处理,适⽤于⾼并发的业务场景。
低延迟:RocketMQ具有较低的消息传递延迟,适⽤于需要实时性的应⽤场景。
消息可靠性:RocketMQ提供了多种消息存储模式,可以确保消息的可靠传递,包括同步刷盘和异步刷盘等⽅式。
消息顺序性:RocketMQ⽀持消息的顺序传递,可以确保同⼀消息队列中的消息按照发送顺序被消费。
⽀持多种消息模式:RocketMQ⽀持发布/订阅模式和点对点模式,可以根据业务需求选择合适的消息模式。
灵活的部署⽅式:RocketMQ⽀持多种部署⽅式,可以在单机上运⾏,也可以搭建集群部署。
丰富的监控和管理⼯具:RocketMQ提供了丰富的监控和管理⼯具,⽅便管理员对消息队列进⾏监控和管理。
核⼼概念
Producer:消息的发送者,⽣产者;举例:发件⼈。
Consumer:消息接收者,消费者;举例:收件⼈。
Broker:消息队列的中间服务器,负责存储消息并将消息传递给消费者;举例:快递。
NameServer:可以理解为是⼀个注册中⼼,主要是⽤来保存topic路由信息,管理Broker。在 NameServer的集群中,NameServer与NameServer之间是没有任何通信的;举例:各个快递公司的管理机构相当于broker的注册中⼼,保留了broker的信息。
Queue:队列,消息存放的位置,⼀个Broker中可以有多个队列。
Topic:消息的逻辑分类,⽣产者发送消息到指定的Topic,消费者从指定的Topic订阅消息。⼀个Topic可以有多个Producer和多个Consumer。
ProducerGroup:⽣产者组 。
ConsumerGroup:消费者组,多个消费者组可以同时消费⼀个主题的消息。
⼯作流程
Broker启动的时候,会往每台NameServer(因为NameServer之间不通信,所以每台都得注册)注册⾃⼰的信息,这些信息包括⾃⼰的ip和端⼝号,⾃⼰这台Broker有哪些topic等信息。
Producer在启动之后会跟会NameServer建⽴连接,定期从NameServer中获取Broker的信息,当发送消息的时候,会根据消息需要发送到哪个topic去找对应的Broker地址,如果有的话,就向这台Broker发送请求;没有找到的话,就看根据是否允许⾃动创建topic来决定是否发送消息。
Broker在接收到Producer的消息之后,会将消息存起来,持久化,如果有从节点的话,也会主动同步给从节点,实现数据的备份
Consumer启动之后也会跟会NameServer建⽴连接,定期从NameServer中获取Broker和对应topic的信息,然后根据⾃⼰需要订阅的topic信息找到对应的Broker的地址,然后跟Broker建⽴连接,获取消息,进⾏消费

3.RocketMQ安装

本⽂档所涉及的是单机版的RocketMQ安装教程,能够满⾜基本的学习使⽤,属于⼊⻔级的教程,
如果想要搭集群部署,可以参考其他资料,进⾏配置即可
进⼊[RocketMQ官⽹下载](下载 | RocketMQ (apache.org))
1、选择Binary 下载
 2、将压缩包解压⾄⾃定路径

 3、配置系统中的环境变量

 4.启动RocketMQ

4.启动RocketMQ 

 

 

若出现如上图所示的命令框,说明启动成功,保留窗⼝切勿关闭
继续启动broker
与上述同样的路径下呼出cmd,执⾏如下命令:
Start-Process "mqbroker.cmd" -ArgumentList "-n 127.0.0.1:9876",
"autoCreateTopicEnable=true"

 

 5.配置可视化⻚⾯

下载可视化插件源码
github下载地址:https://github.com/apache/rocketmq-dashboard
复制下载链接后使⽤git下载
可⾃建⽂件夹,进⼊后使⽤git bash下载

 git clone https://github.com/apache/rocketmq-dashboard.git

 

 下载完成后,进⼊ application.yml 中查看配置

 

 

 

yarn-v1.22.10.tar.gz 下载超时了
Downloading https://github.com/yarnpkg/yarn/releases/download/v1.22.10/yarn-v1.22.10.tar.gz to
D:\Maven\mvn_resp\com\github\eirslett\yarn\1.22.10\yarn-1.22.10.tar.gz [INFO] No proxies configured
[INFO] No proxy was configured, downloading directly
这⾥直接去github拉去就⾏,存⼊你的maven仓库

 

 

在该⽬录下打开cmd,输⼊指令==(请保证已经运⾏NameServer和broker)==:
java -jar rocketmq-dashboard-2.0.1-SNAPSHOT.jar

 

 6.集成springboot

SpringBoot集成RocketMQ
⾸先,在pom.xml中添加RocketMQ的依赖,具体如下所示:

 

< dependency >
< groupId > org . apache . rocketmq < /groupId>
< artifactId > rocketmq - spring - boot - starter < /artifactId>
< version > 2.1 . 1 < /version>
< /dependency>

 然后,在application.yml中添加RocketMQ的基本配置:

 

# RocketMq
rocketmq:
        name - server : 127.0.0 . 1 : 9876
        producer:
                group: producer - group
        consumer:
                group: consumer - group

 然后,在application.yml中添加RocketMQ的基本配置:

# RocketMq
rocketmq:
        name - server : 127.0.0 . 1 : 9876
        producer:
                group: producer - group
        consumer:
                group: consumer - group

 创建消息⽣产者

import org.apache.rocketmq.client.producer.SendCallback;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Service;
@Service
public class RocketMQProducer {@Autowiredprivate RocketMQTemplate rocketMQTemplate;private final String topic = "demo-topic";// 1.同步发送消息// 同步发送是指发送⽅发送⼀条消息后,会等待服务器返回确认信息后再进⾏后续操作。这种⽅式适⽤于需要可靠性保证的场景。public void sendSyncMessage(String message){rocketMQTemplate.syncSend(topic, MessageBuilder.withPayload(message).build());System.out.printf("同步发送结果: %s\n", message);}// 2.异步发送消息// 异步发送是指发送⽅发送消息后,不等待服务器返回确认信息,⽽是通过回调接⼝处理返回结果。这种⽅式适⽤于对响应时间要求较⾼的场景。public void sendAsyncMessage(String message){rocketMQTemplate.asyncSend(topic, MessageBuilder.withPayload(message).build(),     new SendCallback() {@Overridepublic void onSuccess(SendResult sendResult) {System.out.printf("异步发送成功: %s\n", sendResult);}@Overridepublic void onException(Throwable throwable) {System.out.printf("异步发送失败: %s\n", throwable.getMessage());}});}// 3.单向发送消息// 单向发送是指发送⽅只负责发送消息,不关⼼服务器的响应。该⽅式适⽤于对可靠性要求不⾼的场景,如⽇志收集。public void sendOneWayMessage(String message){rocketMQTemplate.sendOneWay(topic, MessageBuilder.withPayload(message).build());System.out.println("单向消息发送成功");}
}

 创建消息消费者

import org.apache.rocketmq.spring.annotation.MessageModel;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Service;
@Service
@RocketMQMessageListener(topic = "demo-topic", consumerGroup = "consumer-g
roup", messageModel = MessageModel.CLUSTERING)
public class RocketMQConsumer implements RocketMQListener<String> {@Overridepublic void onMessage(String s) {System.out.printf("收到消息: %s\n", s);}
}

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

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

相关文章

初试无监督学习 - K均值聚类算法

文章目录 1. K均值聚类算法概述2. k均值聚类算法演示2.1 准备工作2.2 生成聚类用的样本数据集2.3 初始化KMeans模型对象&#xff0c;并指定类别数量2.4 用样本数据训练模型2.5 用训练好的模型生成预测结果2.6 输出预测结果2.7 可视化预测结果 3. 实战小结 1. K均值聚类算法概述…

JSON,事件绑定

文章目录 JSON事件绑定输入框input和div的内容返回获取dom元素数组还是单个对象for循环为什么要写const那一行&#xff0c;直接写 hobbys[index].checked true;可以吗const不是常量吗&#xff0c;为什么用const声明的element的属性值可以改变&#xff1f; 黑马学习笔记 JSON 定…

学习HTML第三十一天

学习文章目录 七. 普通按钮八. 文本域九.下拉框 七. 普通按钮 注意点&#xff1a;普通按钮的 type 值为 button &#xff0c;若不写 type 值是 submit 会引起表单的提交 八. 文本域 常用属性如下&#xff1a; rows 属性&#xff1a;指定默认显示的行数&#xff0c;会影响文…

基于Multisim的汽车尾灯控制电路设计与仿真

1、电路由四个按键控制&#xff0c;分别对应左转、右转、刹车和检查。 2、当左转或右转键按下时,左侧或右侧的 3个汽车尾灯按照左循环或右循环的顺!2/3 点亮&#xff0c;点亮时间为 1秒。 3、当刹车时&#xff0c;所有的尾灯同时闪烁&#xff0c;闪烁时间为1秒。 4、当检查时…

小程序-使用 iconfont 图标库报错:Failed to load font

官方默认可以忽略此错误&#xff0c;在清除缓存后首次刷新会显示此错误&#xff0c;重新渲染错误消失 解决方法&#xff1a; 在 iconfont 图标库选择项目设置 选中 Base64 保存&#xff0c;重新点击链接 -> 复制代码到项目中 操作步骤&#xff1a;

Stable Diffusion的解读(二)

Stable Diffusion的解读&#xff08;二&#xff09; 文章目录 Stable Diffusion的解读&#xff08;二&#xff09;摘要Abstract一、机器学习部分1. 算法梳理1.1 LDM采样算法1.2 U-Net结构组成 2. Stable Diffusion 官方 GitHub 仓库2.1 安装2.2 主函数2.3 DDIM采样器2.4 Unet 3…

Rust “xxx“.to_string()和Rust String::from(“xxx“)区别(将字符串字面量(str类型)转换为String类型)

文章目录 Rust "xxx".to_string()和Rust String::from("xxx")区别1. .to_string()&#xff08;能够将任何可以显示的类型&#xff08;如数字、结构体等&#xff09;转为字符串&#xff09;2. String::from()区别总结&#xff1a;性能&#xff1a;示例对比&…

如何设置谷歌浏览器的家庭保护功能

谷歌浏览器是全球使用最广泛的网络浏览器之一&#xff0c;提供了许多强大的功能和扩展。对于有小孩的家庭来说&#xff0c;设置家庭保护功能可以帮助家长管理孩子的上网行为&#xff0c;确保他们在一个安全、健康的网络环境中浏览网页。本文将详细介绍如何设置谷歌浏览器的家庭…

Vue:后端返回二进制文件,前端如何实现浏览器自动下载?

Vue项目开发中&#xff0c;遇到界面下载功能时&#xff0c;前端如何实现将后端返回二进制文件在浏览器自动下载&#xff1f; 一、关键代码&#xff1a; export function downloadFile(fileName) {axios({method: post,url: process.env.VUE_APP_BASE_API /cgi-bin/file,data:…

触发器清零引脚要上拉高电平

在使用触发器设计电路时&#xff0c;清零引脚该如何处理呢&#xff1f; 下图中NCLR是清零引脚&#xff0c;由于未使用就悬空了&#xff0c;没有任何电气连接&#xff0c;这样做是不对的。应该上拉至高电平。 加入电阻R3&#xff0c;上拉至3.3V&#xff0c;这样不使用清零功能的…

Vue_Router权限控制:不同角色显示不同路由

写在前面 在Vue中&#xff0c;Router是一个官方提供的用于处理应用程序路由的插件。它允许我们创建单页应用程序&#xff08;SPA&#xff09;&#xff0c;其中不同的页面和组件可以通过URL进行导航和展示。使我们可以轻松地创SPA&#xff0c;并实现可复用和可组合的组件…

设计模式之 适配器模式

适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许将一个类的接口转换成客户端所期望的另一个接口。通过使用适配器模式&#xff0c;原本由于接口不兼容的类可以进行协作。简单来说&#xff0c;适配器模式就是将不兼容的接口连接起来&…

【LLM训练系列02】如何找到一个大模型Lora的target_modules

方法1&#xff1a;观察attention中的线性层 import numpy as np import pandas as pd from peft import PeftModel import torch import torch.nn.functional as F from torch import Tensor from transformers import AutoTokenizer, AutoModel, BitsAndBytesConfig from typ…

萨瑞MCU R7FA8D1BH环境搭建教程

萨瑞MCU R7FA8D1BH环境搭建教程 如果你是大学生 遇到电子技术 学习 成长 入行难题 佳喔威信&#xff0c;给你提供一定资源和战略方法上的帮助 相信我的专业职业经历一定能帮到你 目录 概述 2. 开发板介绍3. 搭建rtthread环境4. 安装瑞萨的keil环境5. 搭建瑞萨的keil辅助环境…

鸿蒙实战:使用显式Want启动Ability

文章目录 1. 实战概述2. 实现步骤2.1 创建鸿蒙应用项目2.2 修改Index.ets代码2.3 创建SecondAbility2.4 创建Second.ets 3. 测试效果4. 实战总结5. 拓展练习 - 启动文件管理器5.1 创建鸿蒙应用项目5.2 修改Index.ets代码5.3 测试应用运行效果 1. 实战概述 本实战详细阐述了在 …

PH热榜 | 2024-11-19

DevNow 是一个精简的开源技术博客项目模版&#xff0c;支持 Vercel 一键部署&#xff0c;支持评论、搜索等功能&#xff0c;欢迎大家体验。 在线预览 1. Layer 标语&#xff1a;受大脑启发的规划器 介绍&#xff1a;体验一下这款新一代的任务和项目管理系统吧&#xff01;它…

React Native 基础

React 的核心概念 定义函数式组件 import组件 要定义一个Cat组件,第一步要使用 import 语句来引入React以及React Native的 Text 组件: import React from react; import { Text } from react-native; 定义函数作为组件 const CatApp = () => {}; 渲染Text组件

Jenkins更换主题颜色+登录页面LOGO图片

默认主题和logo图片展示 默认主题黑色和白色。 默认LOGO图片 安装插件 Login ThemeMaterial Theme 系统管理–>插件管理–>Available plugins 搜不到Login Theme是因为我提前装好了 没有外网的可以参考这篇离线安装插件 验证插件并修改主题颜色 系统管理–>A…

LLM文档对话 —— pdf解析关键问题

一、为什么需要进行pdf解析&#xff1f; 最近在探索ChatPDF和ChatDoc等方案的思路&#xff0c;也就是用LLM实现文档助手。在此记录一些难题和解决方案&#xff0c;首先讲解主要思想&#xff0c;其次以问题回答的形式展开。 二、为什么需要对pdf进行解析&#xff1f; 当利用L…

JAVA:探索 PDF 文字提取的技术指南

1、简述 随着信息化的发展&#xff0c;PDF 文档成为了信息传播的重要媒介。在许多应用场景下&#xff0c;如数据迁移、内容分析和信息检索&#xff0c;我们需要从 PDF 文件中提取文字内容。JAVA提供了多种库来处理 PDF 文件&#xff0c;其中 PDFBox 和 iText 是最常用的两个。…