当前位置: 首页 > news >正文

RabbitMQ全栈实践手册:从零搭建消息中间件到SpringAMQP高阶玩法

目录

前言

认识MQ

同步调用

异步调用

技术选型

安装

SpringAMQP

交换机类型

队列交换机绑定

环境搭建

Fanout交换机

声明队列和交换机

消息发送

消息接收

总结

Direct交换机

声明队列和交换机

消息发送

消息接收

总结

Topic交换机

声明队列和交换机

消息发送

消息接收

总结

消息转换器

测试默认转换器

配置JSON转换器

消费者接收Object


前言

RabbitMQ是目前主流消息中间件,基本现在的中小公司都用的RabbitMQ,我所在公司目前好几套

系统,消息中间件也是使用RabbitMQ,RabbitMQ并发好像最多10万,单个MQ应该QPS 5 6万应

该不成问题,对于大部分中小公司来说,完全够了,市面上QPS能几百的公司都顶天了,能用

kafka那些公司基本都是大公司大数据量。

认识MQ

同步调用

同步调用很好理解,就是我要等待你响应,然后才能进行下一步,例如A系统RPC调用B系统,B系

统响应后你才能继续下一步,这里拿一张图举例子:

  1. 支付后调用用户服务扣减余额
  2. 更新交易流水
  3. 调用交易服务 更新订单状态
  4. 调用通知服务 短信通知用户
  5. 调用积分服务 更新用户积分

可以看到都要去等待服务的响应才能进行下一步,其实我们也不需要对方的响应结果做处理,万一

后续产品经理增加服务,越来越多可能调用个支付服务都要等3~4秒钟,对于用户的体验非常不

好,如果哪个服务挂了或者阻塞还会引起服务雪崩。

异步调用

异步调用一般有三个角色:

消息发送者:发送消息的人 向消息代理投递消息(外卖员)

消息Broker:管理、暂存、转发消息(外卖柜)

消息接收者:接收和处理消息的人(我拿外卖 吃饭)

现在我们使用消息Broker(外卖柜)把消息投递到Broker,就不用等待服务响应才能继续往下走,

投递完消息就结束,这样节省了时间,也不会发生级联失败的场景,同时也解耦合了,无论产品经

理后续增加什么服务,我都不用去修改支付服务代码,我只需要去消息Broker(外卖柜)拿到消息

处理即可。

技术选型

消息Broker,目前常见的实现方案就是消息队列(MessageQueue),简称为MQ.

目比较常见的MQ实现:

  • ActiveMQ

  • RabbitMQ

  • RocketMQ

  • Kafka

几种常见MQ的对比:

RabbitMQActiveMQRocketMQKafka
公司/社区RabbitApache阿里Apache
开发语言ErlangJavaJavaScala&Java
协议支持AMQP,XMPP,SMTP,STOMPOpenWire,STOMP,REST,XMPP,AMQP自定义协议自定义协议
可用性一般
单机吞吐量一般非常高
消息延迟微秒级毫秒级毫秒级毫秒以内
消息可靠性一般一般

追求可用性:Kafka、 RocketMQ 、RabbitMQ

追求可靠性:RabbitMQ、RocketMQ

追求吞吐能力:RocketMQ、Kafka

追求消息低延迟:RabbitMQ、Kafka

据统计,目前国内消息队列使用最多的还是RabbitMQ,再加上其各方面都比较均衡,稳定性也

好。

安装

docker安装RabbitMQ

docker run \-e RABBITMQ_DEFAULT_USER=itheima \-e RABBITMQ_DEFAULT_PASS=123321 \-v mq-plugins:/plugins \--name mq \--hostname mq \-p 15672:15672 \-p 5672:5672 \-d \rabbitmq:3.8-management

15672:RabbitMQ提供的管理控制台端口

5672:RabbitMQ的消息发送处理接口 

RabbitMQ架构图

其中包含几个概念:

  • publisher:生产者,也就是发送消息的一方

  • consumer:消费者,也就是消费消息的一方

  • queue:队列,存储消息。生产者投递的消息会暂存在消息队列中,等待消费者处理

  • exchange:交换机,负责消息路由。生产者发送的消息由交换机决定投递到哪个队列。

  • virtual host:虚拟主机,起到数据隔离的作用。每个虚拟主机相互独立,有各自的exchange、queue

SpringAMQP

RabbitMQ采用的是AMQP协议,具有夸语言特性,RabbitMQ提供了多种语言客户端,任何语言只

要遵循AMQP协议收发消息,都可以与RabbitMQ交互。

RabbitMQ提供的Java客户端比较复杂,基本我们都使用Spring提供一套消息收发模板工具:

SpringAMQP,并且还基于SpringBoot对其实现了自动装配。

Spring AMQP官方地址:Spring AMQP

SpringAMQP提供了三个功能:

  • 自动声明队列、交换机及其绑定关系
  • 基于注解的监听器模式,异步接收消息
  • 封装了RabbitTemplate工具,用于发消息。

交换机类型

交换机类型有四种:

Fanout:广播,将消息交个所有绑定到交换机的队列。

Direct:订阅,基于RoutingKey(路由Key)发送个订阅了消息的队列。

Topic:通配符订阅,与Direct类似,支只不过RoutingKey可以使用通配符。

Headers:头匹配,基于MQ的消息头匹配,用的交互。

在开发中,用的最多的就是Direct交换机。

队列交换机绑定

我们可以在控制台手动创建交换机、队列,然后手动将队列和交换机绑定。处了这种还可以在

springboot中,手动创建交换机和队列,然后手动绑定放到IOC容器中,这两种方式一般不怎么常

用,现在基本用的最多的是基于注解声明绑定,开发中也基本用这种模式,简单方便。

环境搭建

导入RabbitMQ依赖:

        <!--AMQP依赖,包含RabbitMQ--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>

application.yml配置RabbitMQ信息连接RabbitMQ

spring:rabbitmq:host: 182.92.96.XXX       #  RabbitMQ服务器的IP地址port: 5672                #  RabbitMQ服务器的端口号virtual-host: /           #  RabbitMQ服务器的虚拟主机名称username: itheima         #  RabbitMQ服务器的登录用户名password: 123321          #  RabbitMQ服务器的登录密码

Fanout交换机

声明队列和交换机

如果在MQ没有这个交换机和队列,会自动创建交换机和队列,并且将他们进行绑定。

@Component
public class RabbitMQListener {@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "fanout.queue1"),exchange = @Exchange(name = "fanout.exchange",type = ExchangeTypes.FANOUT)))public void ListenFanoutQueue1(String msg){System.out.println("消费者1接收fantou.queue1的消息:【" + msg + "】");}@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "fanout.queue2"),exchange = @Exchange(name = "fanout.exchange",type = ExchangeTypes.FANOUT)))public void ListenFanoutQueue2(String msg){System.out.println("消费者2接收fantou.queue2的消息:【" + msg + "】");}
}

消息发送

@SpringBootTest
public class SpringAmqpTest {@Autowiredprivate RabbitTemplate rabbitTemplate;@Testpublic void testFanoutQueue(){String exchangeName = "fanout.exchange";String message = "Hello,Spring AMQP! 我叫陶然同学";rabbitTemplate.convertAndSend(exchangeName,null,message);}
}

消息接收

总结

交换机的作用是什么?

  • 接收publisher发送的消息
  • 将消息按照规则路由到与之绑定的队列
  • 不能缓存消息,路由失败,消息丢失
  • FanoutExchange的会将消息路由到每个绑定的队列

Direct交换机

声明队列和交换机

相比Fanout交换机,Direct交换机多了RoutingKey,如果我发送消息指定的RoutingKey是red,那么

两个消费者都能接收消息,如果我发送消息指定的RoutingKey是blue,那么只有消费者1才能接收

到消息。

    @RabbitListener(bindings = @QueueBinding(value = @Queue(name = "direct.queue1"),exchange = @Exchange(name = "direct.exchange"),key = {"red","blue"}))public void listenDirectQueue1(String msg){System.out.println("消费者1接收direct.queue1的消息:【" + msg + "】");}@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "direct.queue2"),exchange = @Exchange(name = "direct.exchange"),key = {"red","yellow"}))public void listenDirectQueue2(String msg){System.out.println("消费者2接收direct.queue2的消息:【" + msg + "】");}

消息发送

    @Testpublic void testDirectQueue(){String exchangeName = "direct.exchange";String message = "Hello,Spring AMQP! 我叫陶然同学";rabbitTemplate.convertAndSend(exchangeName,"red",message);}

消息接收

总结

描述下Direct交换机与Fanout交换机的差异?

  • Fanout交换机将消息路由给每一个与之绑定的队列
  • Direct交换机根据RoutingKey判断路由给哪一个队列
  • 如果多个队列具有相同的RoutingKey,则与Fanout功能类似

Topic交换机

声明队列和交换机

通配符规则:

  • #:匹配一个或多个词
  • *:匹配不多不少敲好1个词
    @RabbitListener(bindings = @QueueBinding(value = @Queue(name = "topic.queue1"),exchange = @Exchange(name = "topic.exchange",type = ExchangeTypes.TOPIC),key = "china.#"))public void listenTopictQueue1(String msg){System.out.println("消费者1接收topic.queue1的消息:【" + msg + "】");}@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "topic.queue2"),exchange = @Exchange(name = "topic.exchange",type = ExchangeTypes.TOPIC),key = "#.news"))public void listenTopictQueue2(String msg){System.out.println("消费者2接收topic.queue1的消息:【" + msg + "】");}

消息发送

    @Testpublic void testTopicQueue(){String exchangeName = "topic.exchange";String message = "Hello,Spring AMQP! 我叫陶然同学";rabbitTemplate.convertAndSend(exchangeName,"china.news",message);}

消息接收

总结

描述下Direct交换机Topic交换机的差异?

  • Topic交换机接收的消息RoutingKey必须是多个单词,以.分割
  • Topic交换机与队列的bindingKey可以指定通配符
  • #:代表0个或多个词
  • *:代表1个词

消息转换器

Spring的消息发送接收消息体是一个Object,而在数据传输时,会把你的消息序列化为字节发送

MQ,接收消息时把字节反序列化为Java对象,但是默认情况Spring采用JDK序列化方式,众所周

知,JDK序列化存在下列问题:

  • 数据体积过大
  • 有安全漏洞
  • 可读性查

测试默认转换器

我们发送Map结构消息到object.queue队列

    @Testpublic void testSendMap() throws InterruptedException {// 准备消息Map<String,Object> msg = new HashMap<>();msg.put("name", "陶然同学");msg.put("age", 22);// 发送消息rabbitTemplate.convertAndSend("object.queue", msg);}

查看object.queue消息,可以看到消息体非常不友好,看不懂~~~

配置JSON转换器

显然这种JDK序列化方式不适合我们,我们希望体积更小、可读性更高,因此可以使用JSON方式

来做序列化。

引入依赖:

<dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId><version>2.9.10</version>
</dependency>

配置转换器在发送者和接受者都配置

    @Beanpublic MessageConverter messageConverter(){// 1.定义消息转换器Jackson2JsonMessageConverter jackson2JsonMessageConverter = new Jackson2JsonMessageConverter();// 2.配置自动创建消息id,用于识别不同消息,也可以在业务中基于ID判断是否是重复消息jackson2JsonMessageConverter.setCreateMessageIds(true);return jackson2JsonMessageConverter;}

消费者接收Object

我们在consumer服务中定义一个新的消费者,publisher是用Map发送,那么消费者也一定要用

Map接收,格式如下:

@RabbitListener(queues = "object.queue")
public void listenSimpleQueueMessage(Map<String, Object> msg) throws InterruptedException {System.out.println("消费者接收到object.queue消息:【" + msg + "】");
}

相关文章:

RabbitMQ全栈实践手册:从零搭建消息中间件到SpringAMQP高阶玩法

目录 前言 认识MQ 同步调用 异步调用 技术选型 安装 SpringAMQP 交换机类型 队列交换机绑定 环境搭建 Fanout交换机 声明队列和交换机 消息发送 消息接收 总结 Direct交换机 声明队列和交换机 消息发送 消息接收 总结 Topic交换机 声明队列和交换机 消息…...

头歌实训之存储过程、函数与触发器

&#x1f31f; 各位看官好&#xff0c;我是maomi_9526&#xff01; &#x1f30d; 种一棵树最好是十年前&#xff0c;其次是现在&#xff01; &#x1f680; 今天来学习C语言的相关知识。 &#x1f44d; 如果觉得这篇文章有帮助&#xff0c;欢迎您一键三连&#xff0c;分享给更…...

系统架构设计中的DSSA方法:理论、实践与行业深度应用

引言 在软件架构设计领域&#xff0c;‌DSSA&#xff08;Domain-Specific Software Architecture&#xff0c;领域特定软件架构&#xff09;‌是一种专注于垂直行业或业务领域的架构设计方法论。与通用架构设计不同&#xff0c;DSSA通过提炼领域共性需求、构建可复用资产库&am…...

设计心得——数据结构的意义

一、数据结构 在老一些的程序员中&#xff0c;可能都听说过&#xff0c;程序其实就是数据结构算法这种说法。它是由尼克劳斯维特在其著作《算法数据结构程序》中提出的&#xff0c;然后在一段时期内这种说法非常流行。这里不谈论其是否正确&#xff0c;只是通过这种提法&#…...

【C】初阶数据结构12 -- 冒泡排序

本篇文章主要讲解经典排序算法 -- 冒泡排序。 目录 1 算法思想 2 代码 3 时间复杂度与空间复杂度分析 1&#xff09; 时间复杂度 2&#xff09; 空间复杂度 1 算法思想 选择排序是一种经典的交换排序算法。其算法思想也比较简单&#xff0c;主要是比较相邻元素&…...

HTTP, AMQP, MQTT之间的区别和联系是什么?华为云如何适配?

目录 &#x1f517; 一、共同点&#xff08;联系&#xff09;&#xff1a; &#x1f50d; 二、区别对比&#xff1a; &#x1f4d8; 三、简要说明 1. HTTP 2. AMQP 3. MQTT &#x1f517; 四、三者联系&#xff08;在华为云IoT平台中的应用&#xff09; &#x1f3af; …...

WPF之项目创建

文章目录 引言先决条件创建 WPF 项目步骤理解项目结构XAML 与 C# 代码隐藏第一个 "Hello, WPF!" 示例构建和运行应用程序总结相关学习资源 引言 Windows Presentation Foundation (WPF) 是 Microsoft 用于构建具有丰富用户界面的 Windows 桌面应用程序的现代框架。它…...

CrewAI Community Version(二)——Agent

目录 1. Agent总览2. Agent属性3. 创建Agent3.1 YAML配置3.2 直接用代码定义3.3 运行结果 参考 1. Agent总览 在CrewAI框架中&#xff0c;Agent是一个能具备下列能力的自主单元&#xff1a;   1. 执行特定的任务   2. 基于它的角色和目标进行决策   3. 使用工具完成任务 …...

阿里云VS AWS中国区:ICP备案全攻略与常见误区解析

导语 在中国大陆开展互联网服务时,ICP备案是必不可少的合规步骤。然而,随着云服务的多样化,许多企业在选择备案路径时常常感到困惑。本文将深入解析阿里云和AWS中国区的备案区别,为您提供清晰的操作指南,助您避开备案陷阱,确保业务合规运营。 一、备案基本原则 1. 服务器决定…...

基于libdxfrw库读取样条曲线并离散为点

在计算机辅助设计&#xff08;CAD&#xff09;与制造&#xff08;CAM&#xff09;领域&#xff0c;DXF&#xff08;Drawing Exchange Format&#xff09;格式文件被广泛用于存储与交换矢量图形信息。样条曲线作为DXF文件中常见的复杂曲线类型&#xff0c;其准确读取与离散化处理…...

学习 Apache Kafka

学习 Apache Kafka 是一个很好的选择&#xff0c;尤其是在实时数据流处理和大数据领域。以下是一个系统化的学习建议&#xff0c;帮助你从入门到进阶掌握 Kafka&#xff1a; 1. 先决条件 在开始 Kafka 之前&#xff0c;确保你具备以下基础&#xff1a; Java 基础&#xff1a;K…...

5.3/Q1,GBD数据库最新文章解读

文章题目&#xff1a;The burden and trend prediction of ischemic heart disease associated with lead exposure: Insights from the Global Burden of Disease study 2021 DOI&#xff1a;10.1186/s12940-025-01155-w 中文标题&#xff1a;与铅暴露相关的缺血性心脏病的负担…...

java智慧城管综合管理系统源码,前端框架:vue+element;后端框架:springboot;移动端:uniapp开发,技术前沿,可扩展性强

智慧城管综合执法系统采用B/S模式设计与手机等移动终端架构&#xff0c;采用 java编程语言前端框架&#xff1a;vueelement&#xff1b;后端框架&#xff1a;springboot&#xff1b;数据库&#xff1a;mysql5.7&#xff1b;移动端&#xff1a;uniapp技术开发设计。具有使用与维…...

【锂电池剩余寿命预测】GRU门控循环单元锂电池剩余寿命预测(Matlab完整源码)

目录 效果一览程序获取程序内容代码分享研究内容GRU门控循环单元在锂电池剩余寿命预测中的应用摘要关键词1. 引言1.1 研究背景1.2 研究现状与问题1.3 研究目的与意义2. 文献综述2.1 锂电池剩余寿命预测传统方法2.2 深度学习在锂电池寿命预测中的应用2.3 研究空白与本文切入点3.…...

开发首个Spring Boot应用

&#x1f4cb; 前置条件 &#x1f3af; 在开始之前&#xff0c;请打开终端并运行以下命令以确保已安装正确版本的 Java&#xff1a; $ java -version openjdk version "17.0.4.1" 2022-08-12 LTS OpenJDK Runtime Environment (build 17.0.4.11-LTS) OpenJDK 64-Bi…...

2025第十六届蓝桥杯大赛(软件赛)网络安全赛 Writeup

2025第十六届蓝桥杯大赛&#xff08;软件赛&#xff09;网络安全赛 Writeup 2025第十六届蓝桥杯大赛&#xff08;软件赛&#xff09;网络安全赛 Writeup情报收集黑客密室逃脱 数据分析ezEvtxflowzip 密码破解EnigmaECBTraineasy_AES 逆向分析ShadowPhases 漏洞挖掘分析RuneBrea…...

HTTP 协议深度解析:从基础到实战的完整指南

HTTP&#xff08;HyperText Transfer Protocol&#xff09;是 ​应用层协议&#xff0c;用于客户端&#xff08;浏览器、APP&#xff09;与服务器之间的数据交互。以下从协议原理、核心机制到实际案例全面解析&#xff0c;涵盖 HTTP/1.1 到 HTTP/3 的演进。 一、HTTP 核心特性 …...

5G助力智慧城市的崛起——从概念到落地的技术实践

5G助力智慧城市的崛起——从概念到落地的技术实践 引言&#xff1a;智慧城市中的“隐形脉络” 随着城市化的快速推进&#xff0c;传统的城市管理方式已经难以满足人口增长和资源优化的需求。智慧城市的概念应运而生&#xff0c;通过技术创新实现智能化、可持续发展的城市生态…...

4.25test

R7-5 小黄与研究生会(20) 分数 12 全屏浏览 切换布局 作者 王秀 单位 福州大学 福州大学研究生院怡山的同学们为了在国家对抗新冠疫情期间献出自己的一份力量,他们决定为奋战在一线的医护人员送去了演出。小黄作为研究生协会的会长,他让每位男同学均带去了若干只猫或狗…...

Unity-Shader详解-其一

今天我们来介绍Unity的一大核心组件&#xff1a;shader。 Shader Shader就是我们的着色器&#xff0c;用于控制图形的渲染的计算和生成。 对于不同的引擎&#xff0c;具体实现渲染的方法也不一样&#xff0c;也就是我们俗称的不同的图形引擎API&#xff0c;比如OpenGL,Direct…...

WPF与C++ 动态库交互

WPF与C++动态库交互技术详解 一、基本交互方式概述 WPF应用程序与C++动态库交互主要有以下几种方式: ​​P/Invoke调用​​(平台调用)​​COM互操作​​​​C++/CLI桥接层​​​​内存映射文件​​​​命名管道/Socket通信​​本文将重点介绍最常用的P/Invoke和C++/CLI两种…...

自动化测试实战篇

文章目录 目录1. 自动化实施步骤1.1 编写web测试用例1.2 自动化测试脚本开发1.3 测试报告 目录 自动化实施步骤 1. 自动化实施步骤 1.1 编写web测试用例 注&#xff1a; 因为这里仅作为演示&#xff0c;所以设计的用例并不是非常完整 1.2 自动化测试脚本开发 # common/Util…...

基于pandoc的MarkDown格式与word相互转换小工具开发(pyqt5)

这里写目录标题 开发目标准备工作源代码程序打包其他事项命令行使用pandoc关于pandoc默认表格无边框的说明 开发目标 采用word格式模板&#xff0c;实现高级定制样式。具备配置保存功能&#xff0c;方便快捷。自定义转换选项、pandoc路径。 准备工作 开发环境&#xff1a;Wi…...

JVM知识点(一)---内存管理

一、JVM概念 什么是JVM&#xff1f; 定义&#xff1a; Java Virtual Machine - java程序的运行环境(java二进制字节码的运行环境) 好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收功能数组下标越界越界检查多态 比较jvm jre jdk区别 学习路…...

Apache NetBeans 25 发布

Apache NetBeans 25 已于 2025 年 2 月 20 日发布3。NetBeans 是一个主要面向 Java 的集成开发环境&#xff0c;同时支持 C/C、PHP、JavaScript 和其他编程语言1。以下是一些主要的更新内容&#xff1a; Gradle 的优化与增强&#xff1a;优化单文件测试功能&#xff0c;即使测试…...

【设计模式区别】装饰器模式和适配器模式区别

装饰器模式&#xff08;Decorator Pattern&#xff09;和适配器模式&#xff08;Adapter Pattern&#xff09;都是 结构型设计模式 或者说 包装模式 &#xff08;Wrapper&#xff09;&#xff0c;用于解决对象的组合和扩展问题&#xff0c;但它们的核心目的、结构和使用场景有显…...

矫平机终极指南:特殊材料处理、工艺链协同与全球供应链管理

一、特殊材料矫平&#xff1a;挑战与创新解决方案 1. 高温合金&#xff08;如Inconel 718&#xff09;处理 技术难点&#xff1a; 屈服强度高达1100 MPa&#xff0c;传统矫平力不足 高温下易氧化&#xff0c;需惰性气体保护环境 解决方案&#xff1a; 采用双伺服电机驱动&a…...

stm32进入睡眠模式的几个注意点

&#xff08;1&#xff09;关闭systick &#xff08;2&#xff09;先关闭外设时钟&#xff0c;再屏蔽中断&#xff0c;避免先屏蔽中断再关闭外设时钟导致中断挂起无法进入睡眠模式&#xff08;立即被唤醒&#xff09;。 参考&#xff1a; 注&#xff1a;图片截自《RM0433参考手…...

深入理解网络安全中的加密技术

1 引言 在当今数字化的世界中&#xff0c;网络安全已经成为个人隐私保护、企业数据安全乃至国家安全的重要组成部分。随着网络攻击的复杂性和频率不断增加&#xff0c;保护敏感信息不被未授权访问变得尤为关键。加密技术作为保障信息安全的核心手段&#xff0c;通过将信息转换为…...

学习设计模式《六》——抽象工厂方法模式

一、基础概念 抽象工厂模式的本质是【选择产品簇(系列)的实现】&#xff1b; 抽象工厂模式定义&#xff1a;提供一个创建一系列相关或相互依赖对象的接口&#xff0c;而无需指定它们具体的类&#xff1b; 抽象工厂模式功能&#xff1a;抽象工厂的功能是为一系列相关对象或相互依…...

MySQL 数据类型

文章目录 数据类型数据类型分类数据类型tinyint类型&#xff08;整型&#xff09;总结bit类型&#xff08;字节&#xff09; 浮点类型float类型decimal类型 字符串类型char类型varchar&#xff08;变长字符串&#xff09; char 和 varchar的对比日期类型enum和set类型&#xff…...

基于Tcp协议的应用层协议定制

前言&#xff1a;本文默认读者已掌握 TCP 协议相关网络接口知识&#xff0c;将聚焦于应用层协议的设计与剖析&#xff0c;有关底层通信机制及业务逻辑部分仅作简要概述&#xff0c;不再展开详述。 目录 服务器 一、通信 二、协议 1.序列化与反序列化 2. 封包与解包 三、业…...

Flink反压问题解析

一、什么是反压(Backpressure)? 反压(Backpressure) 是流处理系统中的一种流量控制机制。当下游算子处理速度低于上游数据生产速度时,系统会向上游传递压力信号,迫使上游降低数据发送速率,避免数据堆积和系统崩溃。 Flink 通过动态反压机制实现这一过程,但其副作用是…...

C语言中结构体的字节对齐的应用

一、字节对齐的基本原理 计算机的内存访问通常以固定大小的块&#xff08;如 4 字节、8 字节&#xff09;为单位。若数据的内存地址是块大小的整数倍&#xff0c;称为 自然对齐。例如&#xff1a; int&#xff08;4 字节&#xff09;的地址应为 4 的倍数。 double&#xff08…...

大规模数据同步后数据总条数对不上的系统性解决方案:从字段映射到全链路一致性保障

一、引言 在数据同步&#xff08;如系统重构、分库分表、多源整合&#xff09;场景中&#xff0c;“本地数据一致&#xff0c;生产环境条数对不上”是典型痛点。问题常源于并发处理失控、数据库性能瓶颈、字段映射错误、缓存脏数据等多维度缺陷。本文结合实战经验&#xff0c;…...

美团Java后端二面面经!

场景题是面试的大头&#xff0c;建议好好准备 Q. [美团]如何设计一个外卖订单的并发扣减库存系统&#xff1f; Q.[美团]为啥初始标记和重新标记需要STW&#xff1f; Q.[美团]骑手位置实时更新&#xff0c;如何保证高并发写入&#xff1f; Q.[美团]订单表数据量过大导致查询…...

35-疫苗预约管理系统(微服务)

技术&#xff1a; RuoYi框架 后端: SpringBootMySQLspringCloudnacosRedis 前端: vue3 环境&#xff1a; Idea mysql maven jdk1.8 用户端功能 1.首页:展示疫苗接种须知标语、快速预约模块 2.疫苗列表:展示可接种的疫苗 3.预约接种: 用户可进行疫苗预约接种 修改预约时间 …...

Ext JS模拟后端数据之SimManager

Ext.ux.ajax.SimManager 是 Ext JS 框架中用于拦截 Ajax 请求并返回模拟数据的核心工具,适用于前后端分离开发、原型验证或独立测试场景。它通过配置灵活的规则和模拟处理器(Simlet),帮助开发者在不依赖真实后端的情况下完成前端功能开发。 simlets 是simulated servers的…...

BT169-ASEMI无人机专用功率器件BT169

编辑&#xff1a;ll BT169-ASEMI无人机专用功率器件BT169 型号&#xff1a;BT169 品牌&#xff1a;ASEMI 封装&#xff1a;SOT-23 批号&#xff1a;最新 引脚数量&#xff1a;3 特性&#xff1a;单向可控硅 工作温度&#xff1a;-40℃~150℃ BT169单向可控硅&#xff…...

4月26日星期六今日早报简报微语报早读

4月26日星期六&#xff0c;农历三月廿九&#xff0c;早报#微语早读。 1、广州多条BRT相关线路将停运&#xff0c;全市BRT客运量较高峰时大幅下降&#xff1b; 2、国务院批复&#xff1a;同意在海南全岛等15地设立跨境电商综合试验区&#xff1b; 3、我国首次实现地月距离尺度…...

如何将 sNp 文件导入并绘制到 AEDT (HFSS)

导入 sNp 文件 打开您的项目&#xff0c;右键单击 “Result” 绘制结果 导入后&#xff0c;用户可以选择它进行打印。请参阅下面的示例。要点&#xff1a;确保从 Solution 中选择它。...

Shell脚本-for循环应用案例

在Shell脚本编程中&#xff0c;for循环是一种强大的工具&#xff0c;用于处理重复性任务。无论是批量处理文件、遍历目录内容还是简单的计数任务&#xff0c;for循环都能提供简洁而有效的解决方案。本文将通过几个实际的应用案例来展示如何使用for循环解决具体的编程问题。 案…...

MATLAB基础应用精讲-【基础知识篇】发布和共享 MATLAB 代码

目录 MATLAB发布代码---生成文档pdf 分节符对发布文件的分节 实时脚本 Matlab workspace与m脚本数据共享 发布和共享 MATLAB 代码 在实时编辑器中创建和共享实时脚本 发布 MATLAB 代码文件 (.m) 添加帮助和创建文档 发布 MATLAB 代码文件 (.m) 可创建包括您的代码、注释…...

Shell脚本-while循环语法结构

在Shell脚本编程中&#xff0c;while循环是一种重要的流程控制语句&#xff0c;它允许我们重复执行一段代码&#xff0c;直到指定的条件不再满足为止。与for循环不同&#xff0c;while循环通常用于条件驱动的迭代&#xff0c;而不是基于列表或范围的迭代。本文将详细介绍Shell脚…...

Java基础第四章、面向对象

一、成员变量 示例&#xff1a; 二、JVM内存模型 类变量就是静态变量 三、构造方法 默认构造方法、定义的构造方法(不含参数、含参数) 构造方法重载&#xff1a; this关键字 this关键字应用&#xff1a;对构造方法进行复用&#xff0c;必须放在第一行 四、面向对象的三大特征 1…...

【基础IO上】复习C语言文件接口 | 学习系统文件接口 | 认识文件描述符 | Linux系统下,一切皆文件 | 重定向原理

1.关于文件的预备知识 1.1 文件的宏观理解 广义上理解&#xff0c;键盘、显示器等都是文件&#xff0c;因为我们说过“Linux下&#xff0c;一切皆文件”&#xff0c;当然我们现在对于这句话的理解是片面的&#xff1b;狭义上理解&#xff0c;文件在磁盘上&#xff0c;磁盘是一…...

linux离线部署open-metadata

OpenMetadata 环境及离线资源关闭防火墙禁止防火墙关闭 SELinux 创建用户安装JDK安装mysql安装Elasticsearch安装open-metadata 环境及离线资源 系统&#xff1a;CentOS Linux release 7.9.2009 (Core) JDK&#xff1a;17 Mysql&#xff1a; 8.0 OpenMetadata&#xff1a;1.6.…...

Exposure Adjusted Incidence Rate (EAIR) 暴露调整发病率:精准量化疾病风险

1. 核心概念 1.1 传统发病率的局限性 1.1.1 公式与定义 传统发病率公式为新发病例数除以总人口数乘以观察时间。例如在某社区观察1年,有10例新发病例,总人口1000人,发病率即为10/10001=0.01。 此公式假设所有个体暴露时间和风险相同,但实际中个体差异大,如部分人暴露时间…...

信令与流程分析

WebRTC是h5支持的重要特征之一&#xff0c;有了它&#xff0c;不再需要借助音视频相关的客户端&#xff0c;直接通过浏览器的Web页面就可以实现音视频聊天功能。 WebRTC项目是开源的&#xff0c;我们可以借助WebRTC&#xff0c;构建自己的音视频聊缇娜功能。无论是前端JS的Web…...

声音分离人声和配乐base,vocals,drums -从头设计数字生命第6课, demucs——仙盟创梦IDE

demucs -n htdemucs --two-stemsvocals 未来之窗.mp3 demucs -n htdemucs --shifts5 之.mp3demucs -n htdemucs --shifts5 -o wlzcoutspl 未来之窗.mp3 伴奏提取人声分离技术具有多方面的重大意义&#xff0c;主要体现在以下几个领域&#xff1a; 音乐创作与制作 创作便利…...