RabbitMQ工作模式(详解 工作模式:简单队列、工作队列、公平分发以及消息应答和消息持久化)
文章目录
- 十.RabbitMQ
- 10.1 简单队列实现
- 10.2 Work 模式(工作队列)
- 10.3 公平分发
- 10.4 RabbitMQ 消息应答与消息持久化
- 消息应答
- 概念
- 配置
- 消息持久化
- 概念
- 配置
十.RabbitMQ
10.1 简单队列实现
简单队列通常指的是一个基本的消息队列,它可以用于在生产者(生产消息的一方)和消费者(消费消息的一方)之间传递消息。
新创建Springboot项目
引入依赖
<dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.7.1</version></dependency>
连接工具类
public class ConnectionUtils
{public static Connection getConnection(){try{Connection connection = null;//定义一个连接工厂ConnectionFactory factory = new ConnectionFactory();//设置服务端地址(域名地址/ip)factory.setHost("127.0.0.1");//设置服务器端口号factory.setPort(5672);//设置虚拟主机(相当于数据库中的库)factory.setVirtualHost("/");//设置用户名factory.setUsername("guest");//设置密码factory.setPassword("guest");connection = factory.newConnection();return connection;}catch (Exception e){return null;}}
}
创建生产者
public class Provider01 {public static void main(String[] args) {try {System.out.println("--------生产者-------");// 获取连接Connection conn = ConnectionUtils.getConnection();//创建通道Channel channel = conn.createChannel();// 创建队列// 队列名称,是否持久化,是否排他,是否自动删除,其他参数channel.queueDeclare("test4072", false, false, false, null);// 定义发送信息String msg = "hello rabbitmq-kwh";// 发送数据channel.basicPublish("", "test4072", null, msg.getBytes());System.out.println("发送成功....");// 关闭资源channel.close();conn.close();} catch (Exception e) {e.printStackTrace();}}
}
创建消费者
public class Consumer01 {public static void main(String[] args) {try {System.out.println("======消费者======");// 获取连接Connection conn = ConnectionUtils.getConnection();//创建通道Channel channel = conn.createChannel();// 创建队列(有就直接连接。没有则创建)// 队列名称,是否持久化,是否排他,是否自动删除,其他参数channel.queueDeclare("test4072", false, false, false, null);// 消费者消费消息DefaultConsumer consumer = new DefaultConsumer(channel){@Override //一旦有消息进入 将触发public void handleDelivery(String consumerTag,Envelope envelope, AMQP.BasicProperties properties,byte[] body) throws IOException {String str = new String(body,"utf-8");System.out.println("msg==接收=="+str);}};// 监听队列channel.basicConsume("test4072",true,consumer);}catch (Exception e) {e.printStackTrace();}}
}
10.2 Work 模式(工作队列)
工作队列的概念
- 工作队列模式:生产者将任务发送到队列中,多个消费者从队列中取出任务并并行处理。这意味着,多个消费者可以共同工作来处理同一个队列中的任务。
- 负载均衡:每个消费者只处理一个任务(消息),通过增加消费者数量,任务的处理可以并行化,提高整体处理能力。
工作队列的特点:
- 任务分配:RabbitMQ 将队列中的任务(消息)分配给可用的消费者,通常是按照“轮询”或“平衡”方式分配,即消费者可以公平地处理任务。
- 任务处理并行化:多个消费者可以并行地从同一个队列中消费消息,从而实现任务的并行处理,减轻单一消费者的负担。
- 消息丢失的风险低:通过合理配置队列和消息持久化机制,即使 RabbitMQ 重启,也能确保任务消息不丢失。
生产者
(只是在简单队列中的生产者中循环发送了信息。)
/*** Work 模式(工作队列)*/
public class Provider01 {public static void main(String[] args) {try {System.out.println("--------生产者-------");// 获取连接Connection conn = ConnectionUtils.getConnection();//创建通道Channel channel = conn.createChannel();// 创建队列// 队列名称,是否持久化,是否排他,是否自动删除,其他参数channel.queueDeclare("test4072", false, false, false, null);for (int i = 0; i < 50; i++) {// 定义发送信息String msg = "hello rabbitmq-kwh"+i;// 发送数据channel.basicPublish("", "test4072", null, msg.getBytes());Thread.sleep(1000);}System.out.println("发送成功....");// 关闭资源channel.close();conn.close();} catch (Exception e) {e.printStackTrace();}}
}
消费者01
public class Consumer01 {public static void main(String[] args) {try {System.out.println("======消费者01======");// 获取连接Connection conn = ConnectionUtils.getConnection();//创建通道Channel channel = conn.createChannel();// 创建队列(有就直接连接。没有则创建)// 队列名称,是否持久化,是否排他,是否自动删除,其他参数channel.queueDeclare("test4072", false, false, false, null);// 消费者消费消息DefaultConsumer consumer = new DefaultConsumer(channel){@Override //一旦有消息进入 将触发public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {String str = new String(body,"utf-8");System.out.println("msg==接收=="+str);}};// 监听队列channel.basicConsume("test4072",true,consumer);}catch (Exception e) {e.printStackTrace();}}
}
消费者02
public class Consumer02 {public static void main(String[] args) {try {System.out.println("======消费者02======");// 获取连接Connection conn = ConnectionUtils.getConnection();//创建通道Channel channel = conn.createChannel();// 创建队列(有就直接连接。没有则创建)// 队列名称,是否持久化,是否排他,是否自动删除,其他参数channel.queueDeclare("test4072", false, false, false, null);// 消费者消费消息DefaultConsumer consumer = new DefaultConsumer(channel){@Override //一旦有消息进入 将触发public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,byte[] body) throws IOException {String str = new String(body,"utf-8");System.out.println("msg==接收=="+str);}};// 监听队列channel.basicConsume("test4072",true,consumer);}catch (Exception e) {e.printStackTrace();}}
}
. 消费者 1 与消费者 2 处理的数据条数一样。
. 消费者 1 偶数 ;消费者 2 奇数
这种方式叫轮询分发(Round-robin)。
10.3 公平分发
指消息被均匀地分配给多个消费者,以便各个消费者的负载大致相等。通过这种方式,RabbitMQ 旨在避免某些消费者过载而其他消费者空闲的情况。
在10.2 中,现在有 2 个消费者,所有的奇数的消息都是繁忙的,而偶数则是轻松的。按照轮询的方式,奇数的任务交给了第一个消费者,所以一直在忙个不停。偶数的任务交给另一个消费者,则立即完成任务,然后闲得不行。而 RabbitMQ 则是不了解这些的。这是因为当消息进入队列,RabbitMQ 就会分派消息。它不看消费者为应答的数目,只是盲目的将消息发给轮询指定的消费者。
改造生产者
/*
同一时刻服务器只会发一条消息给消费者
1 限制发送给消费者不得超过一条消息
*/
channel.basicQos(1);
/*** 公平分发*/
public class Provider01 {public static void main(String[] args) {try {System.out.println("--------生产者-------");// 获取连接Connection conn = ConnectionUtils.getConnection();//创建通道Channel channel = conn.createChannel();//同一时刻服务器只会发一条消息给消费者channel.basicQos(1);// 创建队列// 队列名称,是否持久化,是否排他,是否自动删除,其他参数channel.queueDeclare("test4072", false, false, false, null);for (int i = 0; i < 50; i++) {// 定义发送信息String msg = "hello rabbitmq-kwh"+i;// 发送数据channel.basicPublish("", "test4072", null, msg.getBytes());Thread.sleep(1000);}System.out.println("发送成功....");// 关闭资源channel.close();conn.close();} catch (Exception e) {e.printStackTrace();}}}
消费者01
(在10.2 中消费者的基础上,只添加 channel.basicQos(1);
,限制每次只消费一个消息)
public class Consumer01 {public static void main(String[] args) {try {System.out.println("======消费者01======");// 获取连接Connection conn = ConnectionUtils.getConnection();//创建通道Channel channel = conn.createChannel();//限制每次只消费一个消息channel.basicQos(1);// 创建队列(有就直接连接。没有则创建)// 队列名称,是否持久化,是否排他,是否自动删除,其他参数channel.queueDeclare("test4072", false, false, false, null);// 消费者消费消息DefaultConsumer consumer = new DefaultConsumer(channel){@Override //一旦有消息进入 将触发public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,byte[] body) throws IOException {String str = new String(body,"utf-8");System.out.println(envelope.getDeliveryTag()+"msg==接收=="+str);// 休眠一秒钟try {Thread.sleep(1000);} catch (Exception e) {e.printStackTrace();}finally {// 手动确认消息// 第一个参数:消息的序号,// 第二个参数:是否批量,false 单条消息应答 当为 true 时批量应答channel.basicAck(envelope.getDeliveryTag(),false);}}};// 监听队列// 自动应答设为 falsechannel.basicConsume("test4072",false,consumer);}catch (Exception e) {e.printStackTrace();}}
}
消费者02
(同消费者01)
消费者 1 休眠 1 秒,消费者 2 休眠 2 秒。
分别设置接收消息数,手动反馈,关闭自动应答
10.4 RabbitMQ 消息应答与消息持久化
消息应答
概念
**消息应答(ack)**是 RabbitMQ 中一个重要的机制,用于保证消息在被消费者处理后得以正确确认,确保消息不会丢失。如果消费者成功处理了消息,应该发送一个确认应答;如果消费者遇到问题或失败,则可以选择拒绝该消息,甚至重新放回队列供其他消费者处理。
应答类型:
- **自动应答(auto-ack):**自动应答是默认设置,消费者从队列中获取消息后,RabbitMQ 会立即认为该消息已经被成功处理,即使消费者并未真正处理完成。在这种模式下,消息会在被消费后立即从队列中删除,而无需消费者确认。这种模式的缺点是,如果消费者在处理消息时崩溃,消息会丢失。
- **手动应答(manual ack):**消费者处理完消息后,需要显式地发送确认应答,通知 RabbitMQ 该消息已经处理完成。这样,如果消费者没有发送确认应答,RabbitMQ 会重新将消息发送给其他消费者。
配置
// 监听队列
// 参数2:自动应答设为 false; true:开启自动应答
channel.basicConsume("test4072",false,consumer);
参数2为true时:自动确认
只要消息从队列中获取,无论消费者获取到消息后是否成功消费,都认为是消息已经成功消费。一旦rabbitmq 将消息分发给消费者,就会从内存中删除。(会丢失数据消息)
参数2为false时:手动确认
消费者从队列中获取消息后,服务器会将该消息标记为不可用状态,等待消费者的反馈,如果消费者一直没有反馈,那么该消息将一直处于不可用状态。如果有一个消费者挂掉,就会交付给其他消费者。手动告诉 rabbitmq 消息处理完成后,rabbitmq 删除内存中的消息。
反馈:
//手动回馈
channel.basicAck(envelope.getDeliveryTag(),false);
使用 Nack 让消息回到队列中
// 处理条数; 是否批量处理 ;是否放回队列 false 丢弃
channel.basicNack(envelope.getDeliveryTag(),false,true);
生产者
/*** 消息应答*/
public class Provider01 {public static void main(String[] args) {try {System.out.println("--------生产者-------");// 获取连接Connection conn = ConnectionUtils.getConnection();//创建通道Channel channel = conn.createChannel();//同一时刻服务器只会发一条消息给消费者channel.basicQos(1);// 创建队列// 队列名称,是否持久化,是否排他,是否自动删除,其他参数channel.queueDeclare("test4072", false, false, false, null);for (int i = 0; i < 50; i++) {// 定义发送信息String msg = "hello rabbitmq-kwh"+i;// 发送数据channel.basicPublish("", "test4072", null, msg.getBytes());Thread.sleep(1000);}System.out.println("发送成功....");// 关闭资源channel.close();conn.close();} catch (Exception e) {e.printStackTrace();}}}
消费者01
public class Consumer01 {public static void main(String[] args) {try {System.out.println("======消费者01======");// 获取连接Connection conn = ConnectionUtils.getConnection();//创建通道Channel channel = conn.createChannel();//限制每次只消费一个消息,防止通道中消息阻塞channel.basicQos(1);// 创建队列(有就直接连接。没有则创建)// 队列名称,是否持久化,是否排他,是否自动删除,其他参数channel.queueDeclare("test4072", false, false, false, null);// 消费者消费消息DefaultConsumer consumer = new DefaultConsumer(channel){@Override //一旦有消息进入 将触发public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,byte[] body) throws IOException {String str = "";try {str = new String(body,"utf-8");if(envelope.getDeliveryTag()==3){int i=1/0;}System.out.println(envelope.getDeliveryTag()+"消费者01msg==接收=="+str);//手动应答 处理完了// 手动确认消息,即手动反馈// 第一个参数:消息的序号,// 第二个参数:是否批量,false 单条消息应答 ;当为 true 时批量应答channel.basicAck(envelope.getDeliveryTag(),false);}catch(Exception e){// e.printStackTrace();System.out.println("消费者01处理第"+envelope.getDeliveryTag()+"条,时报错,消息内容为"+str);//手动应答 报错了// 第一个参数:消息的序号,// 第二个参数:是否批量,false 单条消息应答 当为 true 时批量应答// 第三个参数:是否放回队列 ;false丢弃 ,true 放回队列channel.basicNack(envelope.getDeliveryTag(),false,true);}// 休眠一秒钟try {Thread.sleep(1000);} catch (Exception e) {e.printStackTrace();}}};// 监听队列// 参数2:自动应答设为 false; true:开启自动应答channel.basicConsume("test4072",false,consumer);}catch (Exception e) {e.printStackTrace();}}
}
消费者02(同消费者01)
消息持久化
概念
RabbitMQ 的持久化机制是确保消息和队列在系统崩溃、重启或其他故障情况下不会丢失的关键功能。确保消息不会丢失需要做两件事:将队列和消息都标记为持久化。
配置
持久化队列
// 创建队列,
// 队列名称,是否持久化(队列),是否排他,是否自动删除,其他参数channel.queueDeclare("test4072", true, false, false, null);
消息持久化
// 发送数据
// MessageProperties.PERSISTENT_TEXT_PLAIN:持久化消息
//设置生成者发送消息为持久化信息(要求保存到硬盘上)保存在内存中
//MessageProperties.PERSISTENT_TEXT_PLAIN,指令完成持久化
channel.basicPublish("", "test4072", MessageProperties.PERSISTENT_TEXT_PLAIN, msg.getBytes());
如果改动队列参数配置,需要删除原有的队列,重新建,因为在 rabbitmq 是不允许重新定义一个已存在的队列。
生产者
/*** 消息持久化*/
public class Provider01 {public static void main(String[] args) {try {System.out.println("--------生产者-------");// 获取连接Connection conn = ConnectionUtils.getConnection();//创建通道Channel channel = conn.createChannel();//同一时刻服务器只会发一条消息给消费者channel.basicQos(1);// 创建队列// 队列名称,是否持久化(队列),是否排他,是否自动删除,其他参数channel.queueDeclare("test4072", true, false, false, null);for (int i = 0; i < 50; i++) {// 定义发送信息String msg = "hello rabbitmq-kwh"+i;// 发送数据// MessageProperties.PERSISTENT_TEXT_PLAIN:持久化消息channel.basicPublish("", "test4072", MessageProperties.PERSISTENT_TEXT_PLAIN, msg.getBytes());Thread.sleep(1000);}System.out.println("发送成功....");// 关闭资源channel.close();conn.close();} catch (Exception e) {e.printStackTrace();}}
}
相关文章:
RabbitMQ工作模式(详解 工作模式:简单队列、工作队列、公平分发以及消息应答和消息持久化)
文章目录 十.RabbitMQ10.1 简单队列实现10.2 Work 模式(工作队列)10.3 公平分发10.4 RabbitMQ 消息应答与消息持久化消息应答概念配置 消息持久化概念配置 十.RabbitMQ 10.1 简单队列实现 简单队列通常指的是一个基本的消息队列,它可以用于…...
电脑提示报错NetLoad.dll文件丢失或损坏?是什么原因?
一、NetLoad.dll文件丢失或损坏的根源 程序安装不完整:某些程序在安装过程中可能因为磁盘错误、网络中断或安装程序本身的缺陷,导致NetLoad.dll文件未能正确安装或复制。 恶意软件攻击:病毒、木马等恶意软件可能会篡改或删除系统文件&#x…...
【物联网技术与应用】实验15:电位器传感器实验
实验15 电位器传感器实验 【实验介绍】 电位器可以帮助控制Arduino板上的LED闪烁的时间间隔。 【实验组件】 ● Arduino Uno主板* 1 ● 电位器模块* 1 ● USB电缆*1 ● 面包板* 1 ● 9V方型电池* 1 ● 跳线若干 【实验原理】 模拟电位器是模拟电子元件,模…...
WPF 绘制过顶点的圆滑曲线(样条,贝塞尔)
项目中要用到样条曲线,必须过顶点,圆滑后还不能太走样,捣鼓一番,发现里面颇有玄机,于是把我多方抄来改造的方法发出来,方便新手: 如上图,看代码吧: -------------------…...
YOLOv9-0.1部分代码阅读笔记-assigner.py
assigner.py utils\tal\assigner.py 目录 assigner.py 1.所需的库和模块 2.def select_candidates_in_gts(xy_centers, gt_bboxes, eps1e-9): 3.def select_highest_overlaps(mask_pos, overlaps, n_max_boxes): 4.class TaskAlignedAssigner(nn.Module): 1.所需的库…...
mybatis-plus自动填充时间的配置类实现
mybatis-plus自动填充时间的配置类实现 在实际操作过程中,我们并不希望创建时间、修改时间这些来手动进行,而是希望通过自动化来完成,而mybatis-plus则也提供了自动填充功能来实现这一操作,接下来,就来了解一下mybatis…...
fgets TAILQ_INSERT_TAIL
If you’re using the macros from <sys/queue.h> to implement a circular doubly linked list (TAILQ), the inversion issue occurs because you’re using LIST_INSERT_HEAD, which inserts at the head of the list. Instead, to maintain the original order (FIFO…...
upload-labs关卡记录12
直接上传一句话木马,发现提示: 很明显这是一个白名单,而且不是前端的js检查,而是服务端的检查,因此我们使用bp抓包,改一下文件类型试试: 找到包之后,我们对content-type进行一个更改…...
服务器被攻击怎么办
当服务器遭受恶意流量攻击,如DDoS(分布式拒绝服务)或CC(Challenge Collapsar)攻击时,传统的防护措施可能不足以应对。此时,采用高防IP服务可以有效缓解攻击压力,确保业务连续性和数据…...
Node.js 助力前端开发:自动化操作实战
前端开发中,重复性任务如新建文件、配置路由、生成组件等,往往耗时且容易出错。借助 Node.js 的强大能力,我们可以实现开发过程中的自动化操作,提高效率。 文章目录 自动生成 router 配置文件自动生成组件模板动态构建导航菜单自…...
MATLAB符号计算-符号表达式基础运算操作
1.1.2符号变量取值域的限定 默认复数域 【例1-1-2】解不等式 1.1.3创建符号表达式 对符号对象进行各种运算(算术运算、关系运算、逻辑运算),即可创建符号表达式。 1.算术运算与转置 【例1-1-3】 f5是f4的共轭转置 f6是f4的转置 2.关系…...
ADB 上传文件并使用脚本监控上传百分比
有个需求,需要测试 emmc的外部连续写入性能,使用 ADB 上传一个巨大的文件。并且在上传到一定值时进行干预。 因此但是 adb push 命令本身会 block 运行并且不返回进度,因此需要一个额外的监控脚本。 上传脚本: echo off setloc…...
深入解析MySQL索引结构:从数组到B+树的演变与优化
前言: 在数据库查询中,索引是一种关键的性能优化工具。然而,索引的失效可能导致查询效率大幅下降。为了更好地理解索引的工作原理及规避其失效,深入了解索引结构的演变过程尤为重要。 MySQL 的索引数据结构从简单到复杂࿰…...
【玩转MacBook】JDK安装
下载 JDK 8 官网:https://www.oracle.com/cn/java/technologies/downloads/archive/ 找到 JDK 8 选择: 安装 JDK 双击 .dmg 文件: 继续双击: “继续” “继续” 走到这里,我发现只能选择这个“为这台电脑上的所有…...
word无法创建工作文件,检查临时环境变量。
word无法创建工作文件,检查临时环境变量。 word preview版本,关联打开文件出现报错。word无法创建工作文件,检查临时环境变量。 打开注册表,删除键 Word Preview: HKCR\CLSID{84F66100-FF7C-4fb4-B0C0-02CD7FB668FE} PowerPoint …...
威联通NAS部署openwrt软路由保姆级教程附镜像文件
创作立场:原创不易,拒绝搬运~ hello 大家好,我是你们的老伙伴,稳重的大王~ 本期教程为大家分享,怎么在NAS里面部署软路由,下面是软路由的镜像文件,有两个版本,400M的是定制版~ Sh…...
MySQL共享锁,排他锁
在 MySQL 中,共享锁(S 锁) 和 排他锁(X 锁) 是两种主要的锁机制,用于处理事务的并发控制。它们的作用和行为如下: 1. 共享锁 (S 锁) 定义: 共享锁允许事务对某一行数据进行读取&am…...
2. FPGA基础了解--全局网络
前言 引入扇出的概念介绍FPGA中的全局网络为后续时序优化埋下伏笔 扇出 在FPGA设计中扇出是一个重要的概念,所谓的扇出就是一个控制信号所能控制的数据信号的总个数,比如ctrl信号的扇出就是16 reg ctrl 0; reg [15:0] out 0; always (posedge c…...
[c++进阶(三)]单例模式及特殊类的设计
1.前言 在实际场景中,总会遇见一些特殊情况,比如设计一个类,只能在堆上开辟空间, 或者是设计一个类只能实例化一个对象。那么我们应该如何编写代码呢?本篇将会详细的介绍 本章重点: 本篇文章着重讲解如何设计一些特殊 的类,包括不能被拷贝,只能在栈/堆上…...
js版本之ES6特性简述【let和const、数组、函数、集合、Symbol】(四)
目录 let [块级作用域] 和const简述 Array.from Array.of Array.prototype中新增的方法 for...of 函数参数调整 集合类型 Map Set WeakMap WeakSet Set WeakSet Map WeakMap Symbol 类型 let [块级作用域] 和const简述 ES6 新增了let命令,用来声明变…...
重温设计模式--4、组合模式
文章目录 1 、组合模式(Composite Pattern)概述2. 组合模式的结构3. C 代码示例4. C示例代码25 .应用场景 1 、组合模式(Composite Pattern)概述 定义:组合模式是一种结构型设计模式,它允许你将对象组合成…...
解决Ubuntu下无法装载 Windows D盘的问题
电脑安装了 Windows 和 Ubuntu 24.04 后,在Ubuntu系统上装载 D盘,发现无法装载错误如下: Error mounting /dev/nvme0n1p4 at /media/jackeysong/Data: wrong fs type, bad option, bad superblock on /dev/nvme0n1p4, missing codepage or h…...
详细介绍如何使用rapidjson读取json文件
本文主要详细介绍如何使用rapidjson库来实现.json文件的读取,分为相关基础介绍、结合简单示例进行基础介绍、结合复杂示例进行详细的函数实现介绍等三部分。 一、相关基础 1、Json文件中的{} 和 [] 在 JSON 文件中,{} 和 [] 分别表示不同的数据结构&…...
Mybatis 如何复用 SQL
比如你的Mapper是这样写的: 但这个接口是没有分页的,你还想再写一个有分页的查询接口,两个接口SQL一模一样,只是多了分页特性。你可以直接重载一个方法,增加分页参数,即可复用该SQL。如下:...
使用 Python 操作 MySQL 数据库的实用工具类:MySQLHandler
操作数据库是非常常见的需求,使用 Python 和 pymysql 库封装一个通用的 MySQL 数据库操作工具类,并通过示例演示如何使用这个工具类高效地管理数据库。 工具类的核心代码解析 MySQLHandler 类简介 MySQLHandler 是一个 Python 类,用于简化…...
C++ 内存管理:原理、技巧与实战
目录 第一章:C++ 内存管理基础 1.1 C++ 内存布局剖析 1.2 内存分配与释放:核心机制详解 1.2.1 new/delete 操作符 1.2.2 malloc/free 函数 第二章:智能指针 —— 内存管理利器 2.1 智能指针概览 2.2 常用智能指针类型 2.2.1 unique_ptr 2.2.2 shared_ptr 2.2.3 we…...
算法学习(17)—— FloodFill算法
目录 关于FloodFill算法 部分OJ题详解 733. 图像渲染 200. 岛屿数量 695. 岛屿的最大面积 130. 被围绕的区域 417. 太平洋大西洋水流问题 529. 扫雷问题 LCR130. 衣橱整理 关于FloodFill算法 爆搜,深搜,回溯的算法原理并不难,这类题…...
Kubernetes ConfigMap的创建与使用
前提条件 拥有Kubernetes集群环境,可参考:Kubernetes集群搭建理解Kubernetes部署知识,可参考:使用Kubernetes部署第一个应用 、Deloyment控制器 ConfigMap简介 ConfigMap 是 Kubernetes(通常简称为 K8s)中…...
灵当CRM uploadfile.php 文件上传致RCE漏洞复现
0x01 产品简介 灵当CRM是一款专为中小企业打造的智能客户关系管理工具,由上海灵当信息科技有限公司开发并运营。广泛应用于金融、教育、医疗、IT服务、房地产等多个行业领域,帮助企业实现客户个性化管理需求,提升企业竞争力。无论是新客户开拓、老客户维护,还是销售过程管…...
老旧小区用电安全保护装置#限流式防火保护器参数介绍#
摘要 随着居民住宅区用电负荷的增加,用电安全问题日益突出,火灾隐患频繁发生。防火限流式保护器作为一种新型电气安全设备,能够有效预防因电气故障引发的火灾事故。本文介绍了防火限流式保护器的工作原理、技术特点及其在居民住宅区用电系统…...
在git commit之前让其自动执行一次git pull命令
文章目录 背景原因编写脚本测试效果 背景原因 有时候可以看到项目的git 提交日志里好多 Merge branch ‘master’ of …记录。这些记录是怎么产生的呢? 是因为在本地操作 git add . 、 git commit -m "xxxxx"时,没有提前进行git pull操作&…...
【实现100个unity特效之4】Unity ShaderGraph使用教程与各种特效案例(2023/12/1更新)
文章目录 一、前言二、ShaderGraph1.什么是ShaderGraph2.在使用ShaderGraph时需要注意以下几点:3.优势4.项目 三、实例效果边缘发光进阶:带方向的菲涅尔边缘光效果裁剪进阶 带边缘色的裁剪溶解进阶 带边缘色溶解卡通阴影水波纹积雪效果不锈钢效果、冰晶效…...
单机和微服务的区别,微服务有什么问题?数据一致性问题怎么解决?幂等问题怎么解决?
单机和微服务的区别,微服务有什么问题?数据一致性问题怎么解决?幂等问题怎么解决? 单机架构和微服务架构在设计理念、部署和扩展性上有显著区别。 单机架构 vs 微服务架构 单机架构 定义:所有组件(前端…...
McDonald‘s Event-Driven Architecture 麦当劳事件驱动架构
原文链接 1 mcdonalds-technical-blog/ 原文链接 2 mcdonalds-technical-blog/ 麦当劳在异步、事务性和分析性处理用例中使用跨技术栈的事件,包括移动订单进度跟踪和向客户发送营销通信(交易和促销)。 统一事件平台(unified eve…...
Clickhouse(Centos)
地址信息 官网地址:Fast Open-Source OLAP DBMS - ClickHouse 下载地址:packages.clickhouse.com/rpm/stable/ 1.clickhouse-client-23.1.3.5.x86_64.rpm 2.clickhouse-common-static-23.1.3.5.x86_64.rpm 3.clickhouse-common-static-dbg-23.1.3.5.x86_…...
赛博错题本
机构抽象老师非得让我们整一个错题本,我寻思都学计算机了,还在整高中做题呢一套是什么意思呢,更何况考试也就一周一次,你整个本完完全全没有必要,整个赛博错题本得了。以后错题都会存在这里,基本上一周一更…...
【MySQL初阶】Ubuntu 环境安装 MySQL
🎉博主首页: 有趣的中国人 🎉专栏首页: 数据库初阶 🎉其它专栏: C初阶 | C进阶 | 初阶数据结构 小伙伴们大家好,本片文章将会讲解 Ubuntu 系统安装 MySQL 的相关内容。 如果看到最后您觉得这篇…...
【Kubernetes 指南】基础入门——Kubernetes 基本概念(二)
目录 二、Pod 1、Pod 简介 2、Pod 图示 3、nginx 容器 二、Pod 1、Pod 简介 - Kubernetes 使用 Pod 来管理容器,每个 Pod 可以包含一个或多个紧密关联的容器。 - Pod 是一组紧密关联的容器集合,它们共享 PID、IPC、Network 和 UTS namespace&#…...
Ubuntu系统下 npm install -g tauri 报错问题处理
处理在安装 Tauri 时遇到的问题,可以按照以下步骤进行操作 npm install -g taurinpm warn deprecated inflight1.0.6: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async …...
数字逻辑(六)——下载Digital软件
Digital是一种用于设计和仿真数字逻辑电路的教育工具,它是免费、开源和跨平台的。这款软件十分适合新人,可以使用画简单的电路。 1 下载Digital软件 首先Digital的下载地址是: https://github.com/hneemann/Digital 下载完成之后&…...
Ruby Raider使用教程
Ruby Raider是什么? Ruby Raider 是一款生成器和脚手架 gem,可让 UI 测试自动化更容易 Github链接:https://github.com/RaiderHQ/ruby_raider 目前支持的框架 Web自动化测试 Cucumber and Selenium Rspec and Selenium Cucumber and Wa…...
音视频入门基础:AAC专题(13)——FFmpeg源码中,获取ADTS格式的AAC裸流音频信息的实现
音视频入门基础:AAC专题系列文章: 音视频入门基础:AAC专题(1)——AAC官方文档下载 音视频入门基础:AAC专题(2)——使用FFmpeg命令生成AAC裸流文件 音视频入门基础:AAC…...
Spring Boot 中的 @Scheduled 定时任务以及开关控制
Scheduled注解是Spring框架(包括Spring Boot)中用于实现定时任务的一种方式。以下是对Scheduled注解的详细解析: 一、基本概念 Scheduled注解允许开发者在Spring容器中定义定时任务。通过简单地在一个方法上添加Scheduled注解,S…...
基于PXE与NFS共享的Ubuntu安装配置过程
假设存在服务器A、B、C 其中A为待装系统的服务器,DHCP(IP池:192.168.0.150~192.168.0.160),假设需要安装的系统为Ubuntu 22.04 Desktop 其中B为PXE服务端服务器,IP: 192.168.0.100,这里将以Cent…...
Dots 常用操作
游戏中有多个蚂蚁群落,每个蚂蚁属于一个群落,如何设计数据结构? 方法1:为蚂蚁组件添加一个属性 ID,会造成逻辑中大量分支语句,如果分支语句逻辑不平衡可能带来 Job 调度问题,每个蚂蚁会有一份蚂…...
力扣-图论-20【算法学习day.70】
前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非…...
ModbusTCP从站转Profinet主站案例
一. 案例背景 在复杂的工业自动化场景中,企业常常会采用不同品牌的设备来构建生产系统。西门子SINAMICS G120变频器以其高性能、高精度的速度和转矩控制功能,在电机驱动领域应用广泛。施耐德M580可编程逻辑控制器则以强大的逻辑控制和数据处理能力著称&…...
Linux 线程池
1.概念介绍 线程池是一种多线程处理形式,它维护着多个线程,这些线程处于等待状态,随时准备接受任务并执行。线程池的主要目的是为了提高系统的性能和资源利用率,避免在处理短时间任务时频繁创建和销毁线程所带来的开销。 线程池…...
计算机视觉目标检测-1
文章目录 摘要Abstract1.目标检测任务描述1.1 目标检测分类算法1.2 目标定位的简单实现思路1.2.1 回归位置 2.R-CNN2.1 目标检测-Overfeat模型2.1.1 滑动窗口 2.2 目标检测-RCNN模型2.2.1 非极大抑制(NMS) 2.3 目标检测评价指标 3.SPPNet3.1 spatial pyr…...
2024最新鸿蒙开发面试题合集(一)-HarmonyOS NEXT Release(API 12 Release)
1. HarmonyOS应用打包后的文件扩展名是? 打包后的文件扩展名为.hap(HarmonyOS Ability Package),这是HarmonyOS应用的标准包格式 2. 页面和自定义组件生命周期有哪些? 页面和自定义组件生命周期说明 有Entry装饰器的component组件的生命…...