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

RabbitMQ:深入理解高性能消息队列

RabbitMQ:深入理解高性能消息队列

文章目录

  • RabbitMQ:深入理解高性能消息队列
    • 前言
    • 一、RabbitMQ概述
    • 二、RabbitMQ的核心概念
    • 三、RabbitMQ的工作原理
      • 一、生产者发送消息
      • 二、交换机转发消息
      • 三、队列存储消息
      • 四、消费者接收并处理消息
    • 四、RabbitMQ的使用场景
    • 五、RabbitMQ的关键特性
    • 六、RabbitMQ的最佳实践
    • 七、总结与展望

🌈你好呀!我是 山顶风景独好
💝欢迎来到我的博客,很高兴能够在这里和您见面!
💝希望您在这里可以感受到一份轻松愉快的氛围!
💝不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
🚀 欢迎一起踏上探险之旅,挖掘无限可能,共同成长!

前言

随着分布式系统架构的普及,系统间的通信和协作变得尤为重要。在众多的通信机制中,消息队列凭借其解耦、异步、可靠传输等特性,成为解决复杂系统通信问题的有效手段。RabbitMQ作为一款高性能、高可靠性的开源消息队列系统,在业界得到了广泛的应用。本文将详细介绍RabbitMQ的基本概念、工作原理、使用场景、关键特性以及最佳实践等方面。

一、RabbitMQ概述

RabbitMQ是一个由Erlang语言开发的AMQP(高级消息队列协议)开源实现,它提供了丰富的API供开发者使用,并且支持多种消息协议。RabbitMQ的主要功能包括消息的生产、存储、消费路由等,通过灵活的路由规则和消息队列机制,实现了系统间的解耦异步通信

二、RabbitMQ的核心概念

  1. Message(消息):
  • 消息是RabbitMQ中的基本数据单位,用于在生产者和消费者之间传递信息。
  • 消息通常由消息头和消息体组成,其中消息头包含消息的元数据(如路由键、优先级等),消息体包含实际的数据内容。
  1. Publisher(生产者):
  • 生产者是创建并发送消息到RabbitMQ的实体,通常是应用程序或系统组件。
  • 生产者将消息发送到交换机,由交换机根据路由规则将消息转发到相应的队列中。
  1. Exchange(交换机):
  • 交换机是RabbitMQ中的消息路由中心,它接收来自生产者的消息,并根据预定义的规则(如路由键、绑定键等)将消息路由到一个或多个队列中。
  • RabbitMQ支持多种类型的交换机,包括直接交换机(direct)、主题交换机(topic)、扇出交换机(fanout)等。
  1. Queue(队列):
  • 队列是消息的容器,用于存储等待被消费者接收和处理的消息。
  • 队列是RabbitMQ中存储消息的核心组件,它保证了消息的持久性和顺序性。
  1. Binding(绑定):
  • 绑定是交换机和队列之间的关联关系,它定义了消息如何从交换机路由到队列。
  • 通过绑定配置,可以指定交换机将消息路由到哪些队列中,以及路由的规则是什么。
  1. Routing Key(路由键):
  • 路由键是生产者发送消息时指定的一个属性,用于决定消息应该被路由到哪个队列。
  • 交换机根据路由键和绑定配置中的绑定键进行匹配,将消息路由到匹配的队列中。
  1. Consumer(消费者):
  • 消费者是从RabbitMQ队列中接收并处理消息的实体,通常是应用程序或系统组件。
  • 消费者通过订阅队列来接收消息,并对消息进行处理。处理完成后,消费者会向RabbitMQ发送确认消息(ACK),以通知RabbitMQ该消息已被成功处理。
  1. Broker(消息代理/中间件):
  • Broker是RabbitMQ中的核心服务节点,负责接收生产者发送的消息、存储消息、将消息路由到队列以及将消息发送给消费者。
  • Broker通常作为独立的进程运行,并提供了丰富的API和管理界面供开发者使用。

三、RabbitMQ的工作原理

一、生产者发送消息

  1. 创建连接(Connection):
    首先,生产者需要与RabbitMQ服务器建立TCP连接。这个连接是持久的,可以发送和接收多个信道(Channel)上的数据。在连接建立后,生产者会进行身份验证和授权检查。

  2. 创建信道(Channel):
    生产者会在已建立的连接上创建一个或多个信道。信道是轻量级的连接,它允许生产者进行消息发送、接收、确认等操作,同时保持TCP连接的稳定。RabbitMQ中的许多操作都是基于信道的,如队列声明、交换机声明、绑定等。

  3. 发送消息:
    生产者通过信道发送消息到交换机。在发送消息时,生产者需要指定一个路由键(Routing Key)。路由键用于交换机根据路由规则将消息转发到相应的队列中。

二、交换机转发消息

  1. 交换机接收消息:
    交换机负责接收生产者通过信道发送过来的消息。RabbitMQ提供了多种类型的交换机,如直连交换机(direct)主题交换机(topic)扇出交换机(fanout)等。每种交换机类型都有自己特定的路由策略。

  2. 根据路由规则转发消息:
    交换机根据路由键和自身的路由规则,将消息转发到一个或多个队列中。例如,直连交换机会根据路由键进行精确匹配;主题交换机则根据路由键的模式进行模糊匹配;而扇出交换机则直接将消息广播到所有与之绑定的队列中。

三、队列存储消息

  1. 队列接收消息:
    队列是消息的存储和传递中心。交换机将消息路由到队列后,队列会存储这些消息等待消费者消费。队列具有先进先出(FIFO)的特性,即先发送的消息先被接收。

  2. 队列属性和设置:
    队列可以设置多种属性,如是否持久化(即消息是否保存到磁盘以确保在系统重启后不会丢失)、是否排他(即该队列是否仅允许一个连接使用)、是否自动删除(即当队列中没有消费者并且没有消息时是否自动删除队列)等。

四、消费者接收并处理消息

  1. 创建连接和信道:
    消费者与RabbitMQ服务器建立连接并创建信道的过程与生产者类似。

  2. 订阅队列:
    消费者通过信道订阅相应的队列,以便从队列中接收消息。在订阅时,消费者可以指定一个消费者标签(Consumer Tag),以便RabbitMQ在发送消息时可以识别该消费者。

  3. 接收消息:
    当队列中有消息时,RabbitMQ会将消息推送给消费者。消费者从队列中接收消息并进行处理。处理完成后,消费者会向RabbitMQ发送确认消息(ACK),表示消息已成功处理。

  4. 消息确认机制:
    RabbitMQ支持两种消息确认机制:自动确认手动确认

    • 在自动确认模式下,消费者一旦接收到消息就会立即发送确认消息给RabbitMQ;
    • 而在手动确认模式下,消费者需要在成功处理消息后显式地发送确认消息给RabbitMQ。
    • 手动确认机制可以提高系统的可靠性和灵活性,例如当消费者在处理消息时发生异常或需要重试时,可以选择不发送确认消息给RabbitMQ,这样RabbitMQ就会将该消息重新放入队列中等待其他消费者处理。

四、RabbitMQ的使用场景

  1. 单发送单接收:
    使用场景:简单的发送与接收,没有特别的处理。
    • 示例:一个生产者(P)向队列发送一个消息,一个消费者(C)从该队列接收消息并处理。
  2. 单发送多接收:
    • 使用场景:一个发送端,多个接收端,如分布式的任务派发。
    • 示例:一个生产者发送消息到队列,多个消费者从队列中接收并处理这些消息。这种模式常用于任务分发、负载均衡等场景。
    • 特点:为了保证消息发送的可靠性,通常会使用消息持久化功能。此外,为了防止消费者在处理消息时崩溃导致消息丢失,RabbitMQ提供了消息确认机制(ACK),确保消息在成功处理后被正确删除。
  3. 发布/订阅模式(Publish/Subscribe):
    • 使用场景:发送端发送广播消息,多个接收端接收。
    • 示例:客户下单后,系统发送消息通知客户下单成功,并同时通知仓库、财务等相关部门进行处理。
    • 特点:在这种模式下,发送者(生产者)发送消息到交换机,交换机将消息广播到所有与之绑定的队列中,从而实现一对多的消息传递。
  4. 路由(Routing):
    • 使用场景:发送端按路由键(Routing Key)发送消息,不同的接收端按不同的路由键接收消息。
    • 示例:根据消息的类型或优先级将其路由到不同的处理队列中。
    • 特点:通过路由键和交换机类型(如直连交换机、主题交换机等),可以实现消息的灵活路由和分发。
  5. 主题交换机(Topics):
    • 使用场景:发送端按字符串“匹配”发送消息,接收端同样进行匹配以接收消息。
    • 示例:根据消息的多个属性(如主题、子主题等)进行匹配和路由。
    • 特点:主题交换机提供了更加灵活的消息匹配方式,可以根据多个属性进行匹配和路由,从而实现更复杂的消息分发逻辑。
  6. 异步通信:
    • 使用场景:当系统之间需要进行异步通信时,可以使用RabbitMQ作为消息传递的中间件。
    • 示例:用户注册成功后发送通知邮件或短信、订单处理完成后发送物流信息等。
    • 特点:RabbitMQ可以实现系统之间的解耦和异步通信,提高系统的可扩展性和可靠性。
  7. 削峰填谷:
    • 使用场景:当系统面临高并发请求时,可以使用RabbitMQ作为消息队列来缓冲请求,实现削峰填谷的效果。
    • 示例:在电商系统中,当大量用户同时下单时,可以将订单消息发送到RabbitMQ队列中进行缓存,然后由后台系统逐步处理这些订单消息。
    • 特点:RabbitMQ可以有效地平衡系统的负载,避免系统在高并发场景下崩溃或性能下降。

五、RabbitMQ的关键特性

  1. 消息队列:RabbitMQ允许应用程序之间交换各种类型的数据。消息被发送到队列,然后被消费者或其他应用程序接收。这种设计使得应用程序之间能够实现解耦和异步通信,从而提高系统的可扩展性和可靠性。
  2. 灵活的路由:RabbitMQ提供了多种路由策略,包括扇出交换(Fanout)、直接交换(Direct)和主题交换(Topic)等。这些策略允许根据消息的路由键和交换机类型将消息路由到特定的队列中。这使得消息能够在多个路由路径中进行传递,满足复杂的业务需求。
  3. 持久化:RabbitMQ支持将消息和队列进行持久化,即使在代理重启之后也能保证消息的持久性。这种特性使得RabbitMQ能够在系统崩溃或故障时保持数据的完整性和可靠性。
  4. 可靠性:RabbitMQ提供了多种机制来确保消息的可靠传输。例如,传输确认和发布确认机制可以确保消息在发送和接收之间的可靠性。此外,RabbitMQ还支持消息的持久化存储和消费者确认机制,以确保消息在处理过程中的可靠性。
  5. 灵活的集成:RabbitMQ可以与多种编程语言和框架进行集成,包括Python、Java、Node.js等。这使得开发者可以方便地将RabbitMQ集成到他们的应用程序中,并利用其提供的消息队列和路由功能来实现业务逻辑。
  6. 可扩展性:RabbitMQ可以通过添加更多的节点和队列来实现水平扩展。这种可扩展性使得RabbitMQ能够处理大量的并发请求和消息,满足高并发场景下的业务需求。
  7. 高可用性:RabbitMQ支持消息集群和故障转移功能。多台RabbitMQ服务器可以组成一个集群,形成一个逻辑Broker。队列可以在集群中的机器进行镜像,当部分节点出现问题时,其他节点可以接管其工作,确保系统的稳定性和可靠性。
  8. 可管理性:RabbitMQ提供了一个可视化的管理界面,可以方便地查看和管理队列、交换机、绑定和连接等信息。这使得开发者能够轻松地监控和管理RabbitMQ集群的运行状态,并进行必要的调整和优化。

六、RabbitMQ的最佳实践

  • 消息持久化:
    默认情况下,RabbitMQ将消息存储在内存中,这可以提供更快的消息传递速度。但是,当RabbitMQ服务器崩溃或重启时,内存中的消息将会丢失。因此,对于关键消息,建议将交换机、队列和消息都设置为持久化,以确保即使在系统故障的情况下,消息也不会丢失。
  • 批量确认:
    RabbitMQ支持自动确认和手动确认两种消息确认模式。在自动确认模式下,一旦消息被消费者接收,RabbitMQ就会立即删除该消息。然而,如果消费者在处理消息时发生错误,消息将会丢失。为了避免这种情况,可以使用批量确认模式。在这种模式下,消费者可以一次性确认多条消息,这样可以提高处理效率,并且在发生错误时,可以重新处理未确认的消息。
  • 调整队列长度和消息过期时间(TTL):
    为了防止队列中的消息过多导致系统性能下降,可以设置队列的最大长度(max-length)和消息的过期时间(TTL)。当队列中的消息数量超过设定的最大长度时,RabbitMQ会自动删除最早的消息。同样,当消息在队列中的时间超过设定的TTL时,也会被自动删除。这样可以确保系统的稳定性和性能。
  • 优化队列数量:
    在RabbitMQ中,一个队列对应一个线程。因此,队列的数量会影响系统的吞吐量。在多核服务器上,使用多个队列与消费者可以获得更好的吞吐量。通常,将队列数量设置为等于服务器CPU核数可以获得最佳吞吐量。同时,将队列分布到不同的CPU核或不同的节点上也可以提高性能。
  • 使用镜像队列:
    镜像队列是RabbitMQ提供的一种高可用性解决方案。通过将队列复制到集群中的多个节点上,可以确保即使某个节点发生故障,其他节点也能继续提供服务。这样可以提高系统的可靠性和可用性。
  • 监控和管理:
    使用RabbitMQ提供的监控和管理工具(如RabbitMQ Management Plugin)可以方便地查看和管理队列、交换机、绑定和连接等信息。这有助于及时发现和解决问题,确保系统的稳定运行。
  • 合理设置消费者数量:
    根据业务需求和系统性能,合理设置消费者的数量。如果消费者数量过少,可能会导致消息处理速度过慢;如果消费者数量过多,可能会浪费系统资源。因此,需要根据实际情况进行调整和优化。
  • 使用RabbitMQ插件:
    RabbitMQ提供了丰富的插件系统,可以根据需求扩展和定制功能。例如,使用SSL加密传输插件可以确保消息传输的安全性;使用不同的身份验证插件可以实现更复杂的身份验证和授权机制等。
  • 考虑消息的顺序性:
    在某些场景下,需要确保消息的顺序性。例如,在分布式事务中,需要按照特定的顺序处理消息。在这种情况下,可以使用RabbitMQ的优先级队列或延迟队列等功能来实现。
  • 避免过度使用交换机和队列:
    虽然RabbitMQ支持多种交换机和队列类型,但过度使用它们可能会导致系统复杂性增加和性能下降。因此,在设计和实现系统时,需要仔细考虑是否需要使用这些功能,并尽量避免不必要的复杂性。

七、总结与展望

RabbitMQ作为一款高性能、高可靠性的开源消息队列系统,在分布式系统和服务化架构中发挥着重要作用。通过深入理解RabbitMQ的基本概念工作原理使用场景等方面的知识,我们可以更好地利用RabbitMQ解决系统间的通信和协作问题。未来,随着云计算、大数据和人工智能等技术的不断发展,RabbitMQ将继续发挥其优势和作用,为分布式系统和微服务架构的发展提供有力支持。

相关文章:

RabbitMQ:深入理解高性能消息队列

RabbitMQ:深入理解高性能消息队列 文章目录 RabbitMQ:深入理解高性能消息队列前言一、RabbitMQ概述二、RabbitMQ的核心概念三、RabbitMQ的工作原理一、生产者发送消息二、交换机转发消息三、队列存储消息四、消费者接收并处理消息 四、RabbitMQ的使用场景…...

【北京迅为】《iTOP-3588开发板源码编译手册》-第4章 Android12/Linux设备树简介

RK3588是一款低功耗、高性能的处理器,适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用,RK3588支持8K视频编解码,内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…...

C++ C# 贝塞尔曲线

二阶贝塞尔曲线公式 三阶贝塞尔曲线公式 C 三维坐标点 二阶到N阶源码 //二阶公式: FVector BezierUtils::CalculateBezierPoint(float t, FVector startPoint, FVector controlPoint, FVector endPoint) {float t1 (1 - t) * (1 - t);float t2 2 * t * (1 - t);…...

勒索软件漏洞?在不支付赎金的情况下解密文件

概述 在上一篇文章中,笔者对BianLian勒索软件进行了研究剖析,并且尝试模拟构建了一款针对BianLian勒索软件的解密工具,研究分析过程中,笔者感觉构建勒索软件的解密工具还挺有成就感,因此,笔者准备再找一款…...

实时“秒回”,像真人一样语音聊天,GPT-4o模型强到恐怖

今天凌晨OpenAl发布了 GPT-4o,这是一种新的人工智能模式,集合了文本、图片、视频、语音的全能模型。 能实时响应用户的需求,并通过语音来实时回答你,你可以随时打断它。还具有视觉能力,能识别物体并根据视觉做出快速的…...

Properties配置文件和源码

先对测试类进行get方法复写得到getReqType 判断caseinfo等于get时,就是get请求,反之就不是 这里的url和param都是xxx代替,如果直接写内容,每次都会请求 三目运算优化 为什么要用配置文件 test里时url,可以将ip和端口写在配置文…...

redis原生命令及项目使用

主动更新策略 缓存问题及解决 布隆过滤出现哈希冲突解决方案: 选择合适的哈希函数:布隆过滤器的性能和哈希函数的选择密切相关。选择高效、低碰撞率的哈希函数可以降低误判率。通常使用的哈希函数有 MurmurHash、FNV 等。 合理设置过滤器大小:过滤器的大小(位数组的大小)…...

使用VSCode生成代码、查询数据表

利用VSCode中百度生成 一、 1、输入内容:“给我生成一个student表,要求有id,createDate,userName,phone,age,sex,introduce的列信息,给我DDL与DML,5条信息都为中文信息,并且有一个userName必须等于张先生” 2、将生成的语句复制粘贴到数据库…...

使用 PXE+Kickstart 批量网络自动装机

前言: 正常安装系统的话使用u盘一个一个安装会非常慢,所以批量安装的技术就出来了。 一、 概念 PXE (Preboot eXecute Environment,预启动执行环境)是由 Intel 公司开发的技术,可以让计算机通过网络来启动…...

微信小程序交互增强:实现上拉加载、下拉刷新与一键返回顶部【代码示例】

微信小程序交互增强:实现上拉加载、下拉刷新与一键返回顶部【代码示例】 基础概念实现步骤与代码示例1. 下拉刷新2. 上拉加载更多3. 返回顶部 性能优化与安全考虑结语与讨论 在微信小程序的开发过程中,提供流畅的用户体验至关重要,其中上拉加…...

leetcode刷题指南

本文我将分享给大家一套我自己使用良久并觉得非常高效的 学习论,它可以运用到 Leetcode 上的刷题,也可以 generalize 到生活中涉及到学习以及记忆的方方面面。当然,本文将以 Leetcode 刷题为 case study 去进行讲解。 更具体一点, 我会教大家…...

hadoop学习---基于Hive的数据仓库相关函数机制及其优化方案

Hive相关函数&#xff08;部分&#xff09;&#xff1a; if函数: 作用: 用于进行逻辑判断操作 语法: if(条件, true返回信息,false返回信息) 注意: if函数支持嵌套使用 select if(aa,’bbbb’,111) fromlxw_dual; bbbb select if(1<2,100,200) fromlxw_dual; 200nvl函数:…...

【MySQL数据库】丨高可用之MHA集群部署

一、准备工作 1.1 修改主机名 vim /etc/hosts# 添加对应主机 192.168.28.128 mha1 192.168.28.131 mha2 192.168.28.132 mha31.2 关闭防火墙及修改selinux # 关闭防火墙 systemctl stop firewalld systemctl disable firewalld # 关闭自启动# 修改selinux vim /etc/sy…...

uniapp的底部弹出层实现保姆式教程

实现照片&#xff1a; 此过程先进入uniapp官网&#xff0c;找到扩展组件 打开找到里面的uni-popup和uni-icons 点击进入&#xff0c;下载&安装 点击下载并导入HBuilderX 导入到你使用的目录&#xff0c;如test目录 同样将uni-icons点击下载并导入HBuilderX 点击合并 此时te…...

国外IP代理免费试用技巧

随着互联网的普及&#xff0c;人们越来越依赖于网络来获取信息、进行交流和娱乐。国外IP代理就成了利器之一。在本文中&#xff0c;我们将探讨如何免费使用国外IP代理。 一、了解国外IP代理的原理 国外IP代理&#xff0c;简单来说&#xff0c;就是通过连接到位于国外的代理服务…...

vue-cropper裁剪图片 vue

效果图 1.配置环境 npm install vue-cropper 2.代码 <template><div class"cropper-content"><div class"cropper-box"><div class"cropper"><vue-cropper ref"cropper" :img"option.img" :…...

算法-卡尔曼滤波之基本数学的概念

1.均值 定义&#xff1a;均值是一组数据中所有数值的总和除以数据的数量。均值是数据的中心趋势的一种度量&#xff0c;通常用符号 xˉ 表示。 &#xff1a;对于包含 n 个数据的数据集 {&#x1d465;1,&#x1d465;2,...,&#x1d465;&#x1d45b;}&#xff0c;均值 xˉ 计…...

NeoVim配置文件基本的

init.lua 文件 require(options) require(keymaps) require(plugins) require(colorscheme) require(lsp)-- 插件 require("config.lualine") require("config.nvim-tree") require("config.treesitter")~\lua\plugins.lua 文件 local lazypa…...

Qt学习笔记1.3.4 QtCore-Qt资源系统

文章目录 资源收集文件(.qrc)外部二进制资源内编译(compiled-in)资源压缩使用应用程序中的资源使用库中的资源 Qt资源系统是一种 独立于平台的机制&#xff0c;用于在应用程序的可执行文件中存储二进制文件。如果您的应用程序总是需要一组特定的文件(图标、翻译文件等)&#x…...

同城组局同城活动找搭子小程序JAVA源码面芽组局的实现方案

功能概述 基于微信小程序开发的一款软件&#xff0c;支持用户动态发布、私信聊天关注、礼物充值打赏、发起活动组局、用户报名参与、支持商家入驻&#xff0c;对接广告功能等。 活动发布&#xff1a;用户可以在平台上发布各种类型的活动&#xff0c;如户外徒步、音乐会观赏、…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

Unity中的transform.up

2025年6月8日&#xff0c;周日下午 在Unity中&#xff0c;transform.up是Transform组件的一个属性&#xff0c;表示游戏对象在世界空间中的“上”方向&#xff08;Y轴正方向&#xff09;&#xff0c;且会随对象旋转动态变化。以下是关键点解析&#xff1a; 基本定义 transfor…...

rknn toolkit2搭建和推理

安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 &#xff0c;不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源&#xff08;最常用&#xff09; conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...

对象回调初步研究

_OBJECT_TYPE结构分析 在介绍什么是对象回调前&#xff0c;首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例&#xff0c;用_OBJECT_TYPE这个结构来解析它&#xff0c;0x80处就是今天要介绍的回调链表&#xff0c;但是先不着急&#xff0c;先把目光…...