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

MQ核心作用、解耦、削峰使用场景详解

说在前面

在如今的高并发互联网应用中,如何确保系统在巨大的流量冲击下还能稳定运行,是每个技术团队都会遇到的挑战。说到这,消息队列(MQ)就是背后的“大功臣”了。无论是异步处理请求、平滑应对流量高峰,还是让各个系统模块相互独立不“拖后腿”,MQ都是不可或缺的帮手。那么,MQ是如何削峰的?或者它是如何让复杂系统解耦的?今天,我们就来聊聊MQ的三大核心功能,看它是如何助力系统高效、稳定运转的。

1. 什么是MQ(消息队列)?

消息队列(Message Queue,简称MQ)其实就是一个“管道”,用来在不同的系统或服务之间传递消息。想象一下,它像是邮局,发信人把信件交给邮局,邮局再按照顺序把信送到收件人手中,整个过程大家各做各的事,发信人不用担心收件人有没有立刻收到信,这样大家的工作互不干扰。

在系统中,MQ主要负责消息的传递和异步处理。它帮助系统之间进行消息传递,同时还能实现系统的解耦和高效的异步处理。常见的MQ工具包括RabbitMQ、Kafka、ActiveMQ等。

2. MQ的历史与背景

2.1 MQ的诞生历程

1983年,一个在MIT工作的印度小伙突发奇想,以前我们的软件相互通信,都是点对点的,而且要实现相同的协议,能不能有一种专门用来通信的中间件,就像主板(BUS)一样,把不同的软件集成起来呢?于是他搞了一家公司(Teknekron),开发了世界上第一个消息队列软件The Information Bus(TIB)。最开始的时候,它被高盛这些公司用在金融交易里面。因为TIB实现了发布订阅(Publish/Subscribe)模型,信息的生产者和消费者可以完全解耦,这个特性引起了电信行业特别是新闻机构的注意。1994年路透社收购了Teknekron。

TIB的成功马上引起了业界大佬IBM的注意,他们研发了自己的IBM MQ(IBMWesphere)。后面微软也加入了这场战斗,研发了MSMQ。这个时候,每个厂商的产品是孤立的,大家都有自己的技术壁垒。比如一个应用订阅了IBM MQ的消息,如果有要订阅MSMQ的消息,因为协议、API不同,又要重复去实现。为什么大家都不愿意去创建标准接口,来实现不同的MQ产品的互通呢?跟现在微信里面不能打开淘宝页面是一个道理(商业竞争)。

J2EE制定了JDBC的规范,那么各个数据库厂商自己去实现协议,提供jar包,在Java里面就可以使用相同的API操作不同的数据库了。MQ产品的问题也是一样的,2001年的时候,SUN公司发布了JMS规范,它想要在各大厂商的MQ上面统一包装一层Java的规范,大家都只需要针对API编程就可以了,不需要关注使用了什么样的消息中间件,只要选择合适的MQ驱动。但是JMS只适用于Java语言,它是跟语言绑定的,没有从根本上解决这个问题(只是一个API)。

所以在2006年的时候,AMQP规范发布了。它是跨语言和跨平台的,真正地促进了消息队列的繁荣发展。2007年的时候,Rabbit技术公司基于AMQP开发了RabbitMQ 1.0。因为Erlang是作者Matthias擅长的开发语言,第二个就是Erlang是为电话交换机编写的语言,天生适合分布式和高并发。为什么要取Rabbit Technologies这个名字呢?因为兔子跑得很快,而且繁殖起来很疯狂。从最开始用在金融行业里面,现在RabbitMQ已经在世界各地的公司中遍地开花。国内的绝大部分大厂都在用RabbitMQ,包括头条、美团、滴滴(TMD)、去哪儿、艺龙、淘宝等。

2.2 MQ的发展现状

随着分布式系统的广泛应用,MQ技术得到了极大的发展。目前市场上常见的MQ产品包括RabbitMQ、Kafka、RocketMQ等,它们各自具有不同的特点和优势,适用于不同的业务场景。例如,RabbitMQ以其高并发和稳定性著称,Kafka则以其高吞吐量和实时性闻名,而RocketMQ则更适合大规模分布式系统应用。

3. MQ的核心作用

3.1 异步处理

异步是MQ最重要的作用之一。所谓异步,就是说你不用等到一个任务完成再进行下一个操作,而是把任务交给MQ处理,自己可以继续做别的事情。这就好比你把某项任务外包给了一个帮手(MQ),然后自己继续处理其他工作,等MQ把任务完成后,你再去处理结果。

使用异步MQ的好处:

  • 提高系统性能:不用等待任务完成,能立即处理其他任务。
  • 用户体验更好:用户发起请求后,系统快速响应,而后台的复杂操作可以慢慢处理。

举个例子:在电商系统中,用户下单后,系统需要给仓库发通知,让他们准备发货。如果没有MQ,系统可能会等到仓库那边处理完才告诉用户下单成功,这样用户就得等很久。但有了MQ,系统可以先快速告诉用户“订单已成功”,后续的仓库处理则通过MQ异步通知,用户不用等待后台所有流程结束。

示例代码(Spring Boot RabbitMQ)
java复制代码
// 生产者: 将消息发送到消息队列
@Component
public class OrderProducer {
@Autowired
private RabbitTemplate rabbitTemplate;
public void sendOrderMessage(String orderId) {rabbitTemplate.convertAndSend("orderQueue", orderId); // 异步发送订单消息}
}
// 消费者: 从队列中接收消息并处理
@Component
@RabbitListener(queues = "orderQueue")
public class OrderConsumer {
@RabbitHandler
public void handleOrderMessage(String orderId) {
// 模拟订单处理逻辑System.out.println("Processing order: " + orderId);}
}

在这个例子中,OrderProducer会把订单消息发送到orderQueue队列,OrderConsumer异步处理订单,用户不会感受到后台的复杂逻辑,只会收到下单成功的反馈。

3.2 削峰填谷

削峰是MQ的另一个核心作用。削峰的意思就是把系统中突然涌入的高并发请求“削平”,让系统在面对流量激增时不至于崩溃。它就像一个“水库”,把瞬间涌入的洪水存储起来,等流量回归正常后,再慢慢放出处理。

使用削峰MQ的好处:

  • 防止系统过载:面对突发的高并发流量,系统不会因为超出负载而崩溃。
  • 平滑处理流量:高峰时段通过MQ把请求排队,等流量稳定后再逐步处理,保证系统不会因为短时间的流量激增导致性能下降。

举个例子:在秒杀活动中,用户同时发起大量请求,如果系统直接处理这些请求,服务器可能会崩溃。通过MQ,可以先把这些请求排队,等流量稳定后,系统再逐步处理队列中的请求。这样不仅能保障服务器的稳定,还能让用户体验到秒杀服务的顺畅。

示例代码
java复制代码
// 秒杀请求发送到消息队列中进行削峰处理
@Component
public class SeckillProducer {
@Autowired
private RabbitTemplate rabbitTemplate;
public void sendSeckillMessage(String seckillId) {rabbitTemplate.convertAndSend("seckillQueue", seckillId); // 秒杀请求排队}
}
// 消费者从队列中获取秒杀请求,按顺序处理
@Component
@RabbitListener(queues = "seckillQueue")
public class SeckillConsumer {
@RabbitHandler
public void handleSeckillMessage(String seckillId) {
// 模拟处理秒杀请求逻辑System.out.println("Processing seckill request: " + seckillId);}
}

通过MQ把秒杀请求排队,可以平滑处理突发流量,避免系统短时间内因为并发量太大而崩溃。

3.3 系统解耦

解耦是MQ的第三大作用,简单来说就是让系统模块之间互不干扰,减少系统之间的依赖。在没有MQ的情况下,系统A和系统B可能需要直接进行同步通信,但这样耦合度太高,如果某个系统出现问题,另一个系统也会受到影响。

有了MQ之后,系统A不需要等系统B处理完,它只需要把消息发送到MQ,系统B根据自己的情况异步处理消息。这样系统A和系统B之间就实现了解耦,A不用管B是否忙碌,B也不需要马上响应A的请求。

使用解耦MQ的好处:

  • 降低系统之间的依赖:每个系统可以独立处理自己的逻辑,互不影响。
  • 提高系统灵活性:系统之间通过MQ通信,如果某个系统宕机,MQ可以暂存消息,待系统恢复后继续处理。

举个例子:在电商系统中,订单服务和库存服务需要通信。如果没有MQ,订单系统下单后必须等待库存系统确认库存后才能继续处理。但通过MQ,订单系统下单后,可以把消息发到MQ里,库存系统慢慢去处理,不会影响订单服务的流程。

示例代码
java复制代码
// 订单系统发送消息到库存系统
@Component
public class InventoryProducer {
@Autowired
private RabbitTemplate rabbitTemplate;
public void sendInventoryMessage(String orderId) {rabbitTemplate.convertAndSend("inventoryQueue", orderId); // 订单消息发送到库存服务}
}
// 库存系统异步处理订单消息
@Component
@RabbitListener(queues = "inventoryQueue")
public class InventoryConsumer {
@RabbitHandler
public void handleInventoryMessage(String orderId) {
// 模拟库存扣减逻辑System.out.println("Processing inventory for order: " + orderId);}
}

通过MQ实现解耦后,订单服务可以快速响应用户的下单操作,而库存服务则异步处理库存扣减操作,两个系统之间互不干扰,降低了耦合度。

4. MQ的底层原理逻辑

4.1 MQ的基本架构

MQ的基本架构包括生产者(Producer)、消息队列(Queue)、消费者(Consumer)和消息代理(Broker)等组件。生产者负责将消息发送到消息队列,消费者从消息队列中接收并处理消息,消息代理则负责消息的存储和转发。

4.2 消息传递机制

MQ的消息传递机制主要有两种:点对点(Point-to-Point)和发布/订阅(Publish/Subscribe)。

  • 点对点(Point-to-Point):生产者将消息发送到特定的队列,消费者从该队列中拉取消息进行处理。这种模式下,每条消息只能被一个消费者消费。
  • 发布/订阅(Publish/Subscribe):生产者将消息发布到一个或多个主题,订阅了该主题的消费者都可以接收到消息。这种模式下,每条消息可以被多个消费者消费。

4.3 消息持久化与可靠性

为了保证消息的可靠性,MQ通常支持消息持久化功能。即将消息存储在磁盘上,即使消息代理崩溃,也能在重启后恢复消息。此外,MQ还提供了各种可靠性机制,如重试机制、死信队列等,以确保消息能够被成功消费。

5. 使用场景详解

5.1 异步通知

在异步通知的场景下,MQ能够帮助系统及时响应用户的请求,同时后台慢慢处理后续逻辑。

示例场景一:用户注册后发送欢迎邮件

当用户注册成功后,系统通过MQ异步发送邮件,不用阻塞用户的注册流程。这样可以提高用户体验,同时避免因为发送邮件而延迟用户注册成功的时间。

示例场景二:订单完成后发送优惠券

用户完成订单后,优惠券通过MQ异步发放,订单流程不会被拖慢。这样可以确保订单流程的顺畅进行,同时给用户带来更好的购物体验。

5.2 削峰场景

在高并发场景下,MQ可以有效地进行削峰处理。

示例场景一:电商秒杀活动

在秒杀活动中,大量用户同时请求,MQ通过把请求排队来平滑处理流量,避免服务器崩溃。这样可以确保秒杀活动的顺利进行,同时提高系统的稳定性。

示例场景二:支付系统高峰期

当大量用户发起支付请求时,MQ可以帮助系统按顺序处理,避免并发过高导致支付系统瘫痪。这样可以确保支付系统的稳定运行,同时提高用户的支付体验。

5.3 系统解耦

在需要解耦的场景下,MQ是一个理想的选择。

示例场景一:电商系统中的订单与库存解耦

订单服务和库存服务通过MQ进行异步通信,避免耦合过高导致的问题。这样可以提高系统的灵活性和可维护性,同时降低系统之间的依赖。

示例场景二:日志系统与业务系统解耦

日志系统可以通过MQ收集各个模块的日志信息,业务系统只需把日志发给MQ,不需要直接与日志系统通信。这样可以提高日志系统的可扩展性和可靠性,同时降低业务系统的复杂度。

6. Java模拟场景

6.1 异步通知场景模拟

以下是一个使用Java和RabbitMQ模拟异步通知场景的示例代码。

生产者代码
java复制代码
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class AsyncNotificationProducer {
@Autowired
private RabbitTemplate rabbitTemplate;
public void sendNotification(String userId, String message) {
// 发送异步通知消息到消息队列rabbitTemplate.convertAndSend("notificationQueue", userId + ":" + message);}
}
消费者代码
java复制代码
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
public class AsyncNotificationConsumer {
@RabbitListener(queues = "notificationQueue")
public void receiveNotification(String message) {
// 处理异步通知消息String[] parts = message.split(":");
String userId = parts[0];
String notification = parts[1];System.out.println("Received notification for user " + userId + ": " + notification);
// 在这里可以添加发送邮件或短信的逻辑}
}

6.2 削峰场景模拟

以下是一个使用Java和RabbitMQ模拟削峰场景的示例代码。

生产者代码
java复制代码
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class PeakShavingProducer {
@Autowired
private RabbitTemplate rabbitTemplate;
public void sendRequest(String requestId) {
// 发送请求到消息队列进行削峰处理rabbitTemplate.convertAndSend("peakShavingQueue", requestId);}
}
消费者代码
java复制代码
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
public class PeakShavingConsumer {
@RabbitListener(queues = "peakShavingQueue")
public void handleRequest(String requestId) {
// 处理削峰后的请求System.out.println("Processing request: " + requestId);
// 在这里可以添加处理请求的逻辑}
}

6.3 系统解耦场景模拟

以下是一个使用Java和RabbitMQ模拟系统解耦场景的示例代码。

生产者代码(订单服务)
java复制代码
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class OrderProducer {
@Autowired
private RabbitTemplate rabbitTemplate;
public void sendOrder(String orderId) {
// 发送订单消息到库存服务rabbitTemplate.convertAndSend("inventoryQueue", orderId);}
}
消费者代码(库存服务)
java复制代码
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
public class InventoryConsumer {
@RabbitListener(queues = "inventoryQueue")
public void handleOrder(String orderId) {
// 处理库存扣减逻辑System.out.println("Processing inventory for order: " + orderId);
// 在这里可以添加库存扣减的逻辑}
}

7. 总结

MQ(消息队列)的核心作用主要体现在异步处理、削峰和解耦。通过异步处理,系统可以提升响应速度,提高用户体验;通过削峰,系统可以在面对高并发流量时稳定运行,避免过载;通过解耦,系统之间可以减少依赖,提升灵活性和可维护性。

无论是在电商系统的订单处理、秒杀场景,还是系统模块的解耦设计中,MQ都是一个强大的工具。通过MQ,系统能够更好地应对复杂的业务场景和高并发需求,保持稳定、高效的运行。

作为资深MQ专家,我们不仅要熟练掌握MQ的核心功能和底层原理,还要能够根据具体的业务场景选择合适的MQ产品和配置方案,以充分发挥MQ的优势,为系统的稳定性和性能提供有力保障。

相关文章:

MQ核心作用、解耦、削峰使用场景详解

说在前面 在如今的高并发互联网应用中,如何确保系统在巨大的流量冲击下还能稳定运行,是每个技术团队都会遇到的挑战。说到这,消息队列(MQ)就是背后的“大功臣”了。无论是异步处理请求、平滑应对流量高峰,…...

【从零开始的LeetCode-算法】3232. 判断是否可以赢得数字游戏

给你一个 正整数 数组 nums。 Alice 和 Bob 正在玩游戏。在游戏中,Alice 可以从 nums 中选择所有个位数 或 所有两位数,剩余的数字归 Bob 所有。如果 Alice 所选数字之和 严格大于 Bob 的数字之和,则 Alice 获胜。 如果 Alice 能赢得这场游…...

使用LLaMA-Factory微调时的问题与解决方案记录

文章目录 如何指定微调使用的显卡如何解决显卡通信导致的报错模型微调的实际epoch和step如何计算如何实现多卡全量微调模型微调后的结果如何查看模型测试后的指标如何理解如何指定微调使用的显卡 启动网页时使用这种执行命令 CUDA_VISIBLE_DEVICES=5,6,7 llamafactory-cli we…...

一文读懂埋阻埋容工艺

PCB 埋阻埋容工艺是一种在 PCB 板内部埋入电阻和电容的工艺。通常情况下, PCB 上电阻和电容都是通过贴片技术直接焊接在板面上的,而埋阻埋容工艺则将电 阻和电容嵌入到 PCB 板的内部层中,这种印制电路板,其自下而上依次包括第一介电 层,隐埋电…...

What is a Tensor?

WTF is a Tensor? What is the difference between tensors and matrixes?...

提升性能测试效率与准确性:深入解析JMeter中的各类定时器

在软件性能测试领域,Apache JMeter是一款广泛使用的开源工具,它允许开发者模拟大量用户对应用程序进行并发访问,从而评估系统的性能和稳定性。在进行性能测试时,合理地设置请求之间的延迟时间对于模拟真实用户行为、避免服务器过载…...

从繁琐到优雅:用 PyTorch Lightning 简化深度学习项目开发

从繁琐到优雅:用 PyTorch Lightning 简化深度学习项目开发 在深度学习开发中,尤其是使用 PyTorch 时,我们常常需要编写大量样板代码来管理训练循环、验证流程和模型保存等任务。PyTorch Lightning 作为 PyTorch 的高级封装库,帮助…...

Python学习32天

Self #比较两个人信息,完全相等输出True,否则输出False class Person(): nameNone ageNone def compare_to(self,other): return self.nameother.name and self.ageother.age man1Person() man1.name"tim" man1.age3 man2Person man…...

云原生学习

1、云原生学习 文章目录 1、云原生学习1. 介绍2. Docker容器化 1. 介绍 什么是云原生?原生指使用JAVA等语言编写的项目,云是指将项目部署到云服务器上云平台:公有云、私有云 本地平台是指直接部署在自己计算机,而开发的应用一定要…...

django从入门到精通(六)——auth认证及自定义用户

Django 提供了一个强大的用户认证系统,允许开发者轻松管理用户的注册、登录、权限和组等功能。以下是对 Django 用户认证系统的详细介绍,包括默认的用户认证、自定义用户认证和权限设置。 1. 默认用户认证 1.1 用户模型 Django 默认提供了一个用户模型…...

影响电阻可靠性的因素

一、影响电阻可靠性的因素: 影响电阻可靠性的因素有温度系数、额定功率,最大工作电压、固有噪声和电压系数 (一)温度系数 电阻的温度系数表示当温度改变1摄氏度时,电阻阻值的相对变化,单位为ppm/C.电阻温度…...

大数运算(加减乘除和输入、输出模块)

为什么会有大数呢?因为long long通常为64位范围约为 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807,最多也就19位,那么超过19位的如何计算呢?这就引申出来大数了。 本博客适合思考过这道题,但是没做出来或…...

HTML5超酷响应式视频背景动画特效(六种风格,附源码)

文章目录 1.设计来源1.1 大气蓬勃动态背景界面效果1.2 星空闪闪动态背景界面效果1.3 眼神深眸动态背景界面效果1.4 星空银河动态背景界面效果1.5 花开花落动态背景界面效果1.6 海底世界动态背景界面效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板,程序开…...

堆优化版本的Prim

prim和dijkstra每轮找最小边的松弛操作其实是同源的&#xff0c;因而受dijkstra堆优化的启发&#xff0c;那么prim也可以采用小根堆进行优化。时间复杂度也由 O ( n 2 ) O(n^2) O(n2)降为 O ( n l o g n ) O(nlogn) O(nlogn)。 测试一下吧&#xff1a;原题链接 #include <i…...

【视觉SLAM】4b-特征点法估计相机运动之PnP 3D-2D

文章目录 0. 前言1. PnP求解1.1 直接线性变换DLT1.2 P3P1.3 光束平差法BA2. 实现0. 前言 透视n点(Perspective-n-Point,PnP)问题是计算机视觉领域的经典问题,用于求解3D-2D的点运动。换句话说,当知道 N N N个世界坐标系中3D空间点的坐标以及它们在图像上的投影点像素坐标…...

JDK1.8中JVM堆内存等参数配置

在JDK 8中&#xff0c;JVM内存模型主要包括堆内存&#xff08;Heap Memory&#xff09;、元空间&#xff08;Metaspace&#xff09;以及直接内存&#xff08;Direct Memory&#xff09;。以下是一些常用的JVM内存参数配置建议&#xff0c;特别是在JDK 8环境下&#xff1a; 1. …...

【C++】深入哈希表核心:从改造到封装,解锁 unordered_set 与 unordered_map 的终极奥义!

文章目录 修改哈希表模板参数迭代器HashTable 的默认成员函数HashTable 迭代器相关函数HashTable 的 Insert 函数HashTable 的 Find函数HashTable 的 Erase函数 封装 unordered_set封装 unordered_map测试 unordered_set 和 unordered_map 修改哈希表 我们基于链地址法实现的哈…...

蓝桥杯模拟

【问题描述】 如果一个数 p 是个质数&#xff0c;同时又是整数 a 的约数&#xff0c;则 p 称为 a 的一个质因数。 请问 2024 有多少个质因数。 【答案提交】 这是一道结果填空的题&#xff0c;你只需要算出结果后提交即可。本题的结果为一个整数&#xff0c;在提交答案时只…...

16. 【.NET 8 实战--孢子记账--从单体到微服务】--汇率获取定时器

这篇文章我们将一起编写这个系列专栏中第一个和外部系统交互的功能&#xff1a;获取每日汇率。下面我们一起来编写代码吧。 一、需求 根据文章标题可知&#xff0c;在这片文章中我们只进行汇率的获取和写入数据库。 编号需求说明1获取每日汇率1. 从第三方汇率API中获取汇率信…...

移动充储机器人“小奥”的多场景应用(上)

一、高速公路服务区应用 在高速公路服务区&#xff0c;新能源汽车的充电需求得到“小奥”机器人的及时响应。该机器人配备有储能电池和自动驾驶技术&#xff0c;能够迅速定位至指定充电点&#xff0c;为待充电的新能源汽车提供服务。得益于“小奥”的机动性&#xff0c;其服务…...

【Android】Service使用方法:本地服务 / 可通信服务 / 前台服务 / 远程服务(AIDL)

1 本地Service 这是最普通、最常用的后台服务Service。 1.1 使用步骤 步骤1&#xff1a;新建子类继承Service类&#xff1a;需重写父类的onCreate()、onStartCommand()、onDestroy()和onBind()方法步骤2&#xff1a;构建用于启动Service的Intent对象步骤3&#xff1a;调用st…...

Qt文件目录操作

文件目录操作相关类 Qt 为文件和目录操作提供了一些类&#xff0c;利用这些类可以方便地实现一些操作。Qt 提供的与文件和目录操作相关的类包括以下几个&#xff1a; QCoreApplication&#xff1a;用于提取应用程序路径&#xff0c;程序名等文件信息&#xff1b;QFile&#x…...

刷题-1122

1. 蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。 例如&#xff0c;当输入5时&#xff0c;应该输出的三角形为&#xff1a; 1 3 6 10 15 2 5 9 14 4 8 13 7 12 11 import sys def generate_snake_matrix(n):matrix [[0]*n for _ in range(n)]curent_num 1…...

【通俗理解】Jensen不等式与变分分布q(z)在积分计算中的应用

【通俗理解】Jensen不等式与变分分布q(z)在积分计算中的应用 关键词提炼 #Jensen不等式 #变分分布 #积分计算 #期望 #凸函数 #优化问题 #下界估计 #机器学习 第一节&#xff1a;Jensen不等式与变分分布的类比与核心概念【尽可能通俗】 Jensen不等式就像是一个“积分计算器”…...

微信小程序2-地图显示和地图标记

一、index修改页面&#xff0c;让页面能够显示地图和一个添加标记的按钮。 index.wxml <scroll-view class"scrollarea" scroll-y type"list"><view class"index_container"><map id"map" style"width: 100%; h…...

webpack配置和打包性能优化

文章目录 webpack基础配置loaderpluginloader 和 plugin 的区别devServer打包性能优化1、按需引入组件2、externals 属性3、给定文件匹配范围4、noParse 属性5、cacheDirectory 缓存属性6、happyPack 多个子进程并行 webpack基础配置 mode:development&#xff1a;设置webpack…...

iframe嵌入踩坑记录

iframe嵌入父子页面token问题 背景介绍 最近在做在平台A中嵌入平台B某个页面的需求&#xff0c;我负责的是平台B这边&#xff0c;使这个页面被嵌入后能正常使用。两个平台都实现了单点登录。 其实这是第二次做这个功能了&#xff0c;原本以为会很顺利&#xff0c;但没想到折腾…...

FreeRTOS——消息队列

目录 一、概念及其作用 1.1概念 1.2特点 1.3工作原理 二、相关API 2.1创建队列 2.2任务中写队列 2.3任务中读队列 2.4中断中写队列 2.5中断中读队列 三、实现原理 3.1消息队列控制块 3.2消息队列的创建 3.3消息的发送 3.3.1任务中发送 3.3.2中断中发送 3.4消息的…...

c++11的动态类型

c17引入了any 和 variant&#xff0c;可以将任意数据类型统一用any或variant类型表示&#xff0c;在开发中还是能够带来很多便利的。在c11版本中&#xff0c;可以用下面这个例子&#xff0c;仿照实现一个Any类型。 #include <iostream> #include <stdexcept> #inc…...

大语言模型---Llama模型文件介绍;文件组成

文章目录 1. 概要2. 文件组成 1. 概要 在使用 LLaMA&#xff08;Large Language Model Meta AI&#xff09;权重时&#xff0c;通常会涉及到与模型权重存储和加载相关的文件。这些文件通常是以二进制格式存储的&#xff0c;具有特定的结构来支持高效的模型操作。以下以Llama-7…...

常见网络厂商设备默认用户名/密码大全

常见网络厂商的默认用户名/密码 01 思科 (Cisco) 设备类型&#xff1a;路由器、交换机、防火墙、无线控制器 默认用户名&#xff1a;cisco 默认密码&#xff1a;cisco 设备类型&#xff1a;网管型交换机 默认用户名&#xff1a;admin 默认密码&#xff1a;admin 02 华…...

【大数据分析机器学习】分布式机器学习

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈智能大数据分析 ⌋ ⌋ ⌋ 智能大数据分析是指利用先进的技术和算法对大规模数据进行深入分析和挖掘&#xff0c;以提取有价值的信息和洞察。它结合了大数据技术、人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&a…...

Go 语言已立足主流,编程语言排行榜24 年 11 月

Go语言概述 Go语言&#xff0c;简称Golang&#xff0c;是由Google的Robert Griesemer、Rob Pike和Ken Thompson在2007年设计&#xff0c;并于2009年11月正式宣布推出的静态类型、编译型开源编程语言。Go语言以其提高编程效率、软件构建速度和运行时性能的设计目标&#xff0c;…...

数字反向输出

数字反向输出 C语言代码C 代码Java代码Python代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 小明听到广播里的数字后&#xff0c;总喜欢反着念给妈妈听。请聪明的你将小明听到的数字反向输出。 输入 输入为一个整型的四位数n 输出 …...

c++ std::stack总结

概念 std::stack 是 C 标准库中的一个容器适配器&#xff08;Container Adapter&#xff09;。它通常是基于其他容器&#xff08;如 std::deque 或 std::vector&#xff09;实现的&#xff0c;提供了一个后进先出&#xff08;LIFO&#xff0c;Last In First Out&#xff09;的…...

【C++习题】10.反转字符串中的单词 lll

题目&#xff1a; 链接&#x1f517;&#xff1a;557.反转字符串中的单词 lll 题目&#xff1a; 代码&#xff1a; class Solution { public:void Reverse(string &s, int start, int end){char tmp;while(start < end){tmp s[start];s[start] s[end];s[end] tmp;…...

【pyspark学习从入门到精通14】MLlib_1

目录 包的概览 加载和转换数据 在前文中&#xff0c;我们学习了如何为建模准备数据。在本文中&#xff0c;我们将实际使用这些知识&#xff0c;使用 PySpark 的 MLlib 包构建一个分类模型。 MLlib 代表机器学习库。尽管 MLlib 现在处于维护模式&#xff0c;即它不再积极开发…...

transformer.js(四): 模型接口介绍

前面的文章底层架构及性能优化指南介绍了transformer.js的架构和优化策略&#xff0c;在本文中&#xff0c;将详细介绍 transformer.js 的模型接口&#xff0c;帮助你了解如何在 JavaScript 环境中使用这些强大的工具。 推荐阅读 ansformer.js&#xff08;二&#xff09;&…...

java集合练习题

简答题&#xff1a;分析HashSet和treeSet分别如何去重的&#xff1f; TreeSet的去重机制: 如果你传入了一个Comparator匿名对象&#xff0c;就使用实现的compare去重&#xff0c;如果方法返回0,就认为是相同的元素/数据&#xff0c;就不添加&#xff0c;如果你没有传入一个Comp…...

微知-plantuml常用语法和要点以及模板?(note over、create、box,endbox、alt,else,end, autonumber)

文章目录 常见语法常用 线条类实线虚线斜箭头或奇数箭头 A ->(10) B: B->(10) A分割线&#xff1a;newpage 颜色类给箭头指定颜色 -[#red]->给某个note加颜色&#xff1a; note over Alice, Bob #FFAAAA: xxx给分组信息着色 alt#red 分组类alt xxx; else xxx; else xx…...

gitHub常用操作

gitHub常用操作 1、把项目拉下来2、添加上游仓库3、进入分支4、从上游仓库拉取更新 1、把项目拉下来 在对应项目的右上角点击fork&#xff0c;fork下来&#xff1a;将远程仓库复制到个人仓库 在创建好的分支文件夹下使用 git clone自己远程仓库下的http地址&#xff08;fork…...

Mybatis Plus动态指定数据源

Java开发中一个项目连接多个数据源时&#xff0c;可能会有需要动态指定一个方法所使用的数据源的场景。例如不同的用户查询不同的数据源。 我遇到的需求是这样的&#xff1a;设计一个公共的数据字典组件&#xff0c;该组件需要连接数据源&#xff0c;使用方引入该组件后可以直…...

Python 爬虫 (1)基础 | 基础操作

一、基础操作 1、快速构建一个爬虫 ConvertCurl&#xff1a; https://curlconverter.com/选择URL&#xff0c;点击右键&#xff0c;选择 Copy >> Copy as cURL(bash) 安装JS环境&#xff1a;https://www.jb51.net/python/307069k7q.htm...

C++

目录 C 的发展总结&#xff1a;​编辑 1. C 的早期发展&#xff08;1979-1985&#xff09; 2. C 标准化过程&#xff08;1985-1998&#xff09; 3. C 标准演化&#xff08;2003-2011&#xff09; 4. C11&#xff08;2011年&#xff09; 5. C14&#xff08;2014年&#xf…...

Infineon(英飞凌) TLE985xQX 芯片电机工作电流、电压AD采样

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 单片机芯片合集 文章目录 其他系列文章导航 文章目录 前言 一、选取合适的端口 1.通过 OP1、OP2 电流采集运放输入端口进行H桥驱动的电流采集。 2.通过 O_D_VBAT_AD_EN、I_A_VBAT_A…...

三极管工作原理,以及小电流,如何驱动大电流

因为研究【自动下载电路实现】&#xff0c;涉及到三极管内容&#xff0c;之前看过&#xff0c;现在回看之前的笔记&#xff0c;一点印象都没了&#xff0c;于是&#xff0c;想了个办法&#xff0c;记住它 个人联想&#xff0c;不喜绕道&#xff0c;只是帮助个人记忆的 标题也是…...

Haystack 的开源开发 LLM 应用设计框架

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

彻底理解消息队列的作用及如何选择

一.为什么要使用消息队列&#xff1f; 使用消息队列&#xff0c;其实是需要根据实际业务场景来的&#xff0c;一般都是实际开发中&#xff0c;遇到了某种技术挑战&#xff0c;如果不使用MQ的话&#xff0c;业务实现起来比较麻烦&#xff0c;但是通过MQ就可以更快捷高效的实现业…...

【Java】二叉树:数据海洋中灯塔式结构探秘(上)

个人主页 &#x1f339;&#xff1a;喜欢做梦 二叉树中有一个树&#xff0c;我们可以猜到他和树有关&#xff0c;那我们先了解一下什么是树&#xff0c;在来了解一下二叉树 一&#x1f35d;、树型结构 1&#x1f368;.什么是树型结构&#xff1f; 树是一种非线性的数据结构&…...

海洋通信船舶组网工业4G路由器应用

船舶是浩瀚海洋中探索与贸易的载体&#xff0c;更是船员们生活与工作的家园。为了在广阔的水域中搭建起稳定、高效的网络桥梁&#xff0c;工业4G路由器以卓越的通信组网能力&#xff0c;为船舶组网提供网络支持。 工业4G路由器以其强大的信号发射能力&#xff0c;确保船舶内部…...