消息队列实战指南:三大MQ 与 Kafka 适用场景全解析
前言:在当今数字化时代,分布式系统和大数据处理变得愈发普遍,消息队列作为其中的关键组件,承担着系统解耦、异步通信、流量削峰等重要职责。ActiveMQ、RabbitMQ、RocketMQ 和 Kafka 作为市场上极具代表性的消息队列产品,各自拥有独特的功能特性与适用场景。
本博客旨在深入剖析这四种消息队列的适用场景,通过详细阐述与丰富实例,为技术人员在架构选型时提供清晰且实用的参考。无论你是初涉分布式开发领域的新手,还是经验丰富的架构师,都能从中获取到有价值的信息,帮助你在面对复杂的业务需求时,做出最适合的技术选择。
此前,我已发布了Kafka的搭建手册,在接下来的日子里,我将持续发力,陆续推出ActiveMQ、RabbitMQ以及RocketMQ这三大消息中间件的详细搭建与应用指南,以助力大家更全面、深入地掌握这些关键技术,满足不同业务场景下的需求。
一、什么是消息队列?
消息队列是在消息的传输过程中保存消息的容器,用于接收消息并以文件的方式存储。一个消息队列可以被一个或多个消费者消费,包含以下三个元素:
- Producer:消息生产者,负责产生和发送消息到Broker。
- Broker:消息处理中心,负责消息存储、确认、重试等,一般其中会包含多个Queue。
- Consumer:消息消费者,负责从Broker中获取消息,并进行相应处理。
二、消息队列模式
- 点对点模式:多个生产者可以向同一个消息队列发送消息,一个具体的消息只能由一个消费者消费。
- 发布/订阅模式:单个消息可以被多个订阅者并发地获取和处理。
三、MQ 与 Kafka 的典型适用场景剖析
1、消息队列应用场景
- 应用解耦
- 消息队列减少了服务之间的耦合性,不同的服务可以通过消息队列进行通信,而不用关心彼此的实现细节。例如,在电商系统中,订单服务、库存服务和物流服务之间通过消息队列传递信息,当库存服务需要升级时,不会影响订单服务和物流服务的正常运行。
- 异步处理
- 消息队列本身是异步的,它允许接收者在消息发送很长时间后再取回消息。比如在用户注册场景中,注册成功后系统会发送欢迎邮件,但邮件发送可能耗时较长,将邮件发送任务放入消息队列,用户注册流程无需等待邮件发送完成,即可快速返回给用户注册成功的结果。
- 流量削峰
- 当上下游系统处理能力存在差距的时候,利用消息队列做一个通用的 “载体”,在下游有能力处理的时候,再进行分发与处理。以电商促销活动为例,瞬间大量的订单请求涌入,通过消息队列将这些订单请求暂存,下游订单处理系统按照自身处理能力从队列中逐步获取订单进行处理,避免系统因高并发请求而崩溃。
- 日志处理
- 日志处理是指将消息队列用在日志处理中,比如Kafka的应用,解决大量日志传输的问题。在大型分布式系统中,各个服务产生的海量日志可通过Kafka进行收集、传输和存储,方便后续的日志分析和系统监控。
- 消息通讯
- 消息队列一般都内置了高效的通信机制,因此也可以用在纯的消息通讯,比如实现点对点消息队列,或者聊天室等。像即时通讯软件中,用户发送的消息可通过消息队列进行高效传递,保证消息的实时性和可靠性。
- 消息广播
- 如果没有消息队列,每当一个新的业务方接入,我们都要接入一次新接口。有了消息队列,我们只需要关心消息是否送达了队列,至于谁希望订阅,是下游的事情,无疑极大地减少了开发和联调的工作量。例如在数据共享平台中,数据生产者将数据发送到消息队列,多个不同的业务方作为消费者从队列中订阅所需数据,无需为每个业务方单独开发和对接数据传输接口。
2、三大MQ 与 Kafka 的典型适用场景
ActiveMQ:
- 企业应用集成:可用于在不同的应用程序之间进行可靠的消息传递,实现系统之间的集成和通信。比如在企业内部,不同部门的业务系统之间需要进行数据交互和协同工作,ActiveMQ可以作为消息中间件来保障消息的可靠传递。
- 分布式系统:其可扩展性和高可用性特点,使其能够支持分布式系统的构建。在一些分布式架构中,各个节点之间需要进行消息的同步和通信,ActiveMQ可以满足这一需求,确保系统整体的稳定运行。
- 大消息传输:相较于RabbitMQ在高并发短消息处理上的优势,ActiveMQ在大消息传输方面表现更好。当系统中需要传输较大的数据包,如文件传输、大数据量的报表数据等场景时,ActiveMQ能够更高效地处理。
RabbitMQ:
- 异步处理:适用于多种异步处理任务,如用户注册后的邮件发送、订单处理等。在电商平台中,用户下单后,订单处理涉及库存管理、支付确认等多个步骤,通过RabbitMQ异步传递订单信息,可提高处理效率,避免用户等待。
- 应用解耦:支持多种通信模式,如点对点、发布/订阅等,能帮助系统各部分保持低耦合度,便于独立扩展和维护。在微服务架构中,各个微服务之间可通过RabbitMQ进行消息交互,减少服务间的直接依赖。
- 流量削峰:在面对高并发请求时,RabbitMQ可以作为缓冲层,将请求消息暂存于队列中,然后由后端服务逐步处理。例如在秒杀活动等场景下,大量用户同时发起请求,RabbitMQ能够有效缓解后端服务的压力,避免系统崩溃。
对消息传递要求较高的业务场景:由于其采用AMQP协议,具备丰富的功能特性,如灵活的消息过滤、异步RPC调用、事务支持以及定时消息等,因此适合在线交易等对消息传递的可靠性、顺序性等要求较高的业务。
RocketMQ:
- 实时消息处理:设计之初就是为了支持互联网在线业务,非常适合对实时性要求很高的应用场合,如金融交易系统、在线支付等。能够快速地将消息传递给消费者,保障业务的实时性。
- 顺序消息处理:对于一些要求消息严格按照发送顺序进行消费的应用,如订单状态更新、电商业务中的Binlog消息分发等,RocketMQ通过其独特的设计保证了消息的顺序性。
事务消息处理:支持分布式事务消息,这对于确保跨多个服务或数据库操作的一致性非常关键,例如在电子商务平台中完成订单创建的同时扣减库存的操作。 - 大数据分析:虽然Kafka更常被提到用于大数据流处理,但RocketMQ同样可以应用于日志收集、监控数据上报等领域,为后续的数据分析提供支持。
移动互联网与物联网:鉴于其高效的消息传递能力及可扩展性,广泛应用于移动互联网服务,如即时通讯,以及物联网设备间的通信。其对MQTT协议的支持,使其成为连接海量设备的理想选择之一。
社交网络活动流:在社交平台中,用户行为产生的大量事件流可以通过RocketMQ快速传播给相关订阅者。
Kafka:
- 大数据领域的实时计算、日志采集等场景:Kafka是业内标准的选择,社区活跃度高,已成为许多实时数据架构中不可或缺的部分,用于处理数据缓冲与分发任务。其基于磁盘顺序写入与读取的方式优化了I/O操作效率,能够在保持较低硬件成本的同时实现非常高的吞吐量。
- 大规模数据流处理:其设计初衷就是为了解决大规模数据流处理中的挑战,如日志收集、事件源系统等。在需要处理大量数据的场景下,Kafka的高吞吐量特点尤为突出,能够轻松应对海量数据的持续摄入和处理。
- 与其他大数据工具集成:Kafka拥有广泛的数据处理框架集成,如Spark、Flink等,这使其成为了构建高效数据管道的强大工具,便于简化整个数据管道架构的设计与实现过程。
消息系统替代者:可作为传统消息系统的替代品,与传统消息系统相比,Kafka有更好的吞吐量、更好的可用性,这有利于处理大规模的消息。
四、MQ和Kafka的架构、工作原理和优缺点
ActiveMQ
- 架构:
包含 Producer、Broker、Consumer 等基本组件。Broker 是消息处理中心,可独立部署或嵌入应用。支持多种协议如 STOMP、OpenWire、AMQP 等,可通过这些协议与不同系统交互。 - 工作原理:
Producer 产生消息并发送到 Broker,Broker 存储消息,Consumer 从 Broker 获取消息进行处理。支持点对点和发布/订阅模式,在点对点模式下,消息被特定消费者接收;发布/订阅模式中,消息可被多个订阅者获取。 - 优点:
成熟产品,在许多公司有应用(非大规模场景);有多重语言的成熟客户端;支持多种协议,文档丰富。 - 缺点:
目前社区对 5.x 维护减少,不适合大规模吞吐场景;据用户反馈会出现莫名问题且可能丢失消息;在大规模应用中存在性能瓶颈,如上千个队列的应用场景表现不佳。
RabbitMQ
- 架构:
基于 AMQP 协议,主要组件有 Producer、Consumer、Broker(包含 Exchange、Queue、Channel 等),由生产者、消费者和服务端组成。Exchange 接收消息并按路由规则将消息路由到 Queue,Channel 是消息读写的操作通道,客户端可建立多个 Channel 进行不同会话任务。生产者连接到Server,建立连接并开启信道,声明交换器和队列,设置属性并通过路由键绑定。消费者也需建立连接和信道以接收消息。 - 工作原理:
生产者连接到Server,建立连接并开启信道。
生产者声明交换器和队列,设置相关属性,并通过路由键将交换器和队列进行绑定。
消费者建立连接,开启信道,便于接收消息。
生产者发送消息到服务端中的虚拟主机。
虚拟主机中的交换器根据路由键选择路由规则,将消息发送到不同的消息队列中。
订阅了消息队列的消费者获取到消息并进行消费。常用交换器类型有 direct、topic、fanout、headers 四种。 - 优点:
支持几乎所有受欢迎的编程语言,如Java、C、C++、C#、Ruby、Perl、Python、PHP等。
支持消息路由,可通过不同交换器支持不同种类的消息路由。
支持消息时序,可通过延时队列指定消息的延时时间和过期时间TTL等。
支持容错处理,通过交付重试和死信交换器(DLX)来处理消息处理故障。
提供易用的用户界面,方便用户监控和管理消息Broker。
社区活跃度高。 - 缺点:
用 Erlang 用Erlang开发,源码难以理解,不利于二次开发和维护,基本依赖开源社区维护和修复bug。
吞吐量相对较低,实现机制较重。
不支持消息有序、持久化较差、不支持消息回溯、伸缩性一般。
RocketMQ
- 架构:
技术架构中有四大角色NameServer、Broker、Producer和Consumer。NameServer充当注册中心,Broker用于存放Queue,一个Broker可配置多个Topic,一个Topic中存在多个Queue。Broker通过集群部署,提供master/slave结构,slave定时从master同步数据,master宕机时,slave提供消费服务但不能写入消息。 - 工作原理:
消息模型按主题模型实现,包括Producer Group、Topic、Consumer Group三个角色。
一个Topic包含多个Queue,生产者组根据主题将消息放入对应Topic,采用轮询等方式找到Queue。
消费群组和Queue的关系类似Kafka中的消费群组和Partition,不同消费者组互不干扰,一个Queue只能被一个消费者消费,一个消费者可消费多个Queue,通过偏移量记录消费位置。 - 优点:
高吞吐,借鉴Kafka设计,单一队列有百万消息的堆积能力。
高伸缩性,有灵活的分布式横向扩展部署架构,整体架构与Kafka类似。
高容错性,通过ACK机制保证消息正常消费。
消息可持久化到磁盘中,支持消息回溯。
在一个队列中能可靠地实现先进先出(FIFO)和严格的顺序传递。
支持发布/订阅和点对点消息模型,支持拉、推两种消息模式。
提供docker镜像用于隔离测试和云集群部署,提供配置、指标和监控等功能丰富的Dashboard。 - 缺点:
不支持消息路由。
支持的客户端语言不多,目前主要是Java和C++,且C++版本不成熟。
部分支持消息有序,需将同类消息hash到同一Queue中才能支持顺序,若散落到不同Queue则不能保证顺序。
社区活跃度一般。
Kafka
- 架构:
一个典型的Kafka集群包含Producer、broker、Consumer Group、Zookeeper集群。Kafka通过Zookeeper管理集群配置,选举leader,以及在Consumer Group发生变化时进行rebalance。Producer使用push模式将消息发布到broker,Consumer使用pull模式从broker订阅并消费消息。 - 工作原理:
消息经序列化后,通过不同分区策略(顺序轮询、随机轮询和 key hash 等)找到对应分区,相同主题和分区的消息存放在同一批次里,由独立线程发送到Kafka Broker上。
分区是Kafka读写数据的最小粒度,可通过分区实现伸缩性。主题的分区可部署在多个不同机器上,消费者通过消费群组完成消费,一个消费者可消费多个分区,但一个分区只能被一个消费者消费。消费者增加会触发Rebalance,不同消费群组互不干涉。
优点
高吞吐、低延迟,每秒可处理几十万条消息,最低延迟仅几毫秒。
高伸缩性,每个主题含多个分区,分区可分布在不同主机的broker中。
高稳定性,是分布式系统,数据有多个副本,某节点宕机时集群仍能正常工作。
消息可持久化存储,支持数据备份防丢失,能保证所有消息被消费且仅被消费一次,支持消息回溯。
有优秀的第三方Kafka Web管理界面Kafka-Manager,在日志领域较成熟,被多家公司和多个开源项目使用。 - 缺点:
单机超过64个队列/分区时,Load会明显飙高,队列越多,load越高,发送消息响应时间变长。
不支持消息路由、延迟发送和消息重试。
社区更新较慢。
五、MQ 与 Kafka 适用场景实例展示:
- ActiveMQ:适用于企业级应用集成,对多种消息协议兼容,支持分布式事务,消息持久化能力强。例如,在一个银行系统中,涉及多个子系统之间的交互,如账户系统、交易系统、清算系统等,当进行一笔跨行转账时,需要保证各个系统之间的数据一致性,ActiveMQ可以通过支持XA事务来确保整个转账过程的原子性和完整性。
- RabbitMQ:适合高并发异步处理、微服务通信及分布式任务调度,具备灵活的路由机制和强大的消息队列管理能力。例如,在一个电商网站中,当用户提交订单后,系统需要同时进行库存扣减、订单状态更新、积分计算等多个操作,这些操作可以通过RabbitMQ将任务异步发送到不同的队列中,由相应的消费者进行处理,从而提高系统的响应速度和吞吐量。
- RocketMQ:常用于电商、金融等大型分布式系统,支持分布式事务消息和消息顺序性。例如,在电商系统的订单处理流程中,从订单创建、支付、发货到确认收货等环节,需要保证消息的顺序性,RocketMQ可以确保这些消息按照正确的顺序被处理,避免出现订单状态混乱的情况。
- Kafka:主要用于大规模数据实时处理、流计算平台以及数据共享和交换,具有高吞吐量和可扩展性。例如,在一个互联网公司的日志收集系统中,每天会产生大量的用户访问日志、系统日志等,Kafka可以快速地接收和存储这些日志数据,并将其分发给不同的消费者进行实时分析,如统计用户行为、监控系统性能等。
六、MQ 与 Kafka 适用场景总结归纳
- ActiveMQ 常用于企业级应用集成,它支持多种协议以及分布式事务。以银行多系统转账场景为例,在涉及储蓄系统、支付系统、清算系统等多个系统间的资金流转时,ActiveMQ 能够确保各环节数据的一致性。
- RabbitMQ 适用于高并发异步处理场景。在电商业务中,当用户下单后,系统需同时执行如库存扣减、生成订单快照、发送下单通知邮件等多个任务。借助 RabbitMQ 灵活的路由策略,以及其对直连、主题、扇出等多种消息模式的支持,系统可以将不同类型的任务消息精准分发给对应的处理模块,高效实现复杂业务逻辑下的消息分发。例如,通过主题模式,将库存相关消息发送到库存管理模块,将邮件通知消息发送到邮件服务模块。
- RocketMQ 在顺序消息处理和事务消息支持方面表现突出,在电商、金融等大型分布式系统中优势显著。在电商订单流程里,从用户下单、支付成功到商家发货、物流配送及最终的订单完成确认,每个环节都需要严格按照顺序处理消息。以支付成功后的流程为例,RocketMQ 能确保先发送资金到账消息给商家账户系统,再触发库存减少消息给仓储系统,保证整个流程有条不紊。在金融交易系统中,如股票买卖,RocketMQ 的事务消息支持可以保证交易的原子性,确保买卖双方资金和股票的交割准确无误。
- Kafka 则擅长处理大规模数据实时处理场景。互联网公司每天会产生海量的用户行为日志、系统运行日志等数据。Kafka 凭借其强大的吞吐量和扩展性,能够快速收集这些日志数据,并将其高效分发给实时分析系统。比如,通过 Kafka 将用户在网站上的浏览、点击等行为日志实时传输给数据分析平台,用于实时统计热门商品、用户活跃度等信息,为运营决策提供及时支持。
消息队列技术
├── ActiveMQ
│ ├── 企业应用集成
│ │ ├── 多协议支持
│ │ └── 分布式事务
│ ├── 分布式系统
│ │ ├── 可扩展性
│ │ └── 高可用性
│ └── 大消息传输
│ ├── 文件传输
│ └── 大数据量报表数据
├── RabbitMQ
│ ├── 异步处理
│ │ ├── 用户注册邮件发送
│ │ └── 订单处理
│ ├── 应用解耦
│ │ ├── 点对点通信
│ │ └── 发布/订阅模式
│ ├── 流量削峰
│ │ └── 秒杀活动请求缓冲
│ └── 高要求业务场景
│ ├── 消息过滤
│ ├── 异步RPC调用
│ ├── 事务支持
│ └── 定时消息
├── RocketMQ
│ ├── 实时消息处理
│ │ ├── 金融交易系统
│ │ └── 在线支付
│ ├── 顺序消息处理
│ │ ├── 订单状态更新
│ │ └── Binlog消息分发
│ ├── 事务消息处理
│ │ └── 订单创建与库存扣减
│ ├── 大数据分析
│ │ ├── 日志收集
│ │ └── 监控数据上报
│ ├── 移动互联网与物联网
│ │ ├── 即时通讯
│ │ └── 物联网设备通信
│ └── 社交网络活动流
│ └── 用户行为事件流传播
└── Kafka├── 大数据实时计算│ ├── 日志采集│ └── 数据缓冲与分发├── 大规模数据流处理│ ├── 高吞吐量│ └── 海量数据持续摄入├── 大数据工具集成│ ├── Spark│ └── Flink└── 消息系统替代├── 高吞吐量└── 高可用性
相关文章:

消息队列实战指南:三大MQ 与 Kafka 适用场景全解析
前言:在当今数字化时代,分布式系统和大数据处理变得愈发普遍,消息队列作为其中的关键组件,承担着系统解耦、异步通信、流量削峰等重要职责。ActiveMQ、RabbitMQ、RocketMQ 和 Kafka 作为市场上极具代表性的消息队列产品࿰…...
前端发送Ajax请求的技术Axios
目录 1.引入Axios文件 2.使用Axios发送请求 2.1请求方法的别名 请求的URL地址怎么来的? 后端实现 前后端交互 1.引入Axios文件 <script src"https://unpkg.com/axios/dist/axios.min.js"></script> 2.使用Axios发送请求 2.1请求方法的…...
第17章:Python TDD回顾与总结货币类开发
写在前面 这本书是我们老板推荐过的,我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后,我突然思考,对于测试开发工程师来说,什么才更有价值呢?如何让 AI 工具更好地辅助自己写代码,或许…...
opencv_KDTree_搜索介绍及示例
cv::flann::KDTreeIndexParams 说明,使用? cv::flann::KDTreeIndexParams 是 OpenCV 中用于配置 KD 树(K-Dimensional Tree)索引参数的类。KD 树是一种用于多维空间中的点搜索的数据结构,常用于最近邻搜索等问题。在…...

Windows 上安装 MongoDB 的 zip 包
博主介绍: 大家好,我是想成为Super的Yuperman,互联网宇宙厂经验,17年医疗健康行业的码拉松奔跑者,曾担任技术专家、架构师、研发总监负责和主导多个应用架构。 近期专注: RPA应用研究,主流厂商产…...
先进制造aps专题二十七 西门子opcenter aps架构分析
欧美的商业aps,主要就是sap apo,西门子opcenter aps,达索quintiq 从技术的层面,西门子aps是不如sap apo的,但是西门子aps是西门子数字化工厂产品的核心,有很多特色,所以分析 西门子aps主要分计划器和排产器两个部分 计…...

【数据分享】1929-2024年全球站点的逐年平均气温数据(Shp\Excel\无需转发)
气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、湿度等指标,其中又以气温指标最为常用!说到气温数据,最详细的气温数据是具体到气象监测站点的气温数据!本次我们为大家带来的就是具体到气象监…...

机器学习——什么是代价函数?
1.代价函数的定义 首先,提到代价函数是估计值和实际值的差,这应该是指预测值和真实值之间的差异,用来衡量模型的好坏。 在一元线性模型中,模型是直线,有两个参数,可能是斜率和截距。 通过调整这两个参数,让代价函数最小,这应该是说我们要找到最佳的斜率和截距,使得预测…...

docker 部署 MantisBT
1. docker 安装MantisBT docker pull vimagick/mantisbt:latest 2.先运行实例,复制配置文件 docker run -p 8084:80 --name mantisbt -d vimagick/mantisbt:latest 3. 复制所需要配置文件到本地路径 docker cp mantisbt:/var/www/html/config/config_inc.php.…...

02内存结构篇(D1_自动内存管理)
目录 一、内存管理 1. C/C程序员 2. Java程序员 二、运行时数据区 1. 程序计数器 2. Java虚拟机栈 3. 本地方法栈 4. Java堆 5. 方法区 运行时常量池 三、Hotspot运行时数据区 四、分配JVM内存空间 分配堆的大小 分配方法区的大小 分配线程空间的大小 一、内存管…...
Centos 8 交换空间管理
新增swap 要增加 Linux 系统的交换空间,可以按照以下步骤操作: 1. 创建一个交换文件 首先,选择文件路径和大小(例如,增加 1 GB 交换空间)。 sudo fallocate -l 1G /swapfile如果 fallocate 不可用&…...
“深入浅出”系列之数通篇:(5)TCP的三次握手和四次挥手
TCP(传输控制协议)的三次握手和四次挥手是TCP连接建立和释放的过程。 一、TCP三次握手 TCP三次握手是为了建立可靠的连接,确保客户端和服务器之间的通信能力。具体过程如下: 第一次握手:客户端向服务器发送一个带有…...

接口测试及接口测试常用的工具
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 首先,什么是接口呢? 接口一般来说有两种,一种是程序内部的接口,一种是系统对外的接口。 系统对外的接口ÿ…...

使用rpc绕过咸鱼sign校验
案例网站是咸鱼 找到加密函数i(),发现参数是由token时间戳appkeydata构成的 js客户端服务 考虑到网站可能有判断时间戳长短而让请求包失效的可能,我们请求包就直接用它的方法生成 下面我们先把token和h置为键值对tjh123 再把方法i()设为全局变量my_…...

NPC与AI深度融合结合雷鸟X3Pro AR智能眼镜:引领游戏行业沉浸式与增强现实新纪元的畅想
if… NPC(非玩家角色)与AI(人工智能)的深度融合,正引领游戏行业迈向一个全新的沉浸式与增强现实(AR)相结合的新时代。这一创新不仅预示着游戏体验的质变,更可能全面革新游戏设计与叙…...

【物联网】ARM核介绍
文章目录 一、芯片产业链1. CPU核(1)ARM(2)MIPS(3)PowerPc(4)Intel(5)RISC-V 2. SOC芯片(1)主流厂家(2)产品解决方案 3. 产品 二、ARM核发展1. 不同架构的特点分析(1)VFP(2)Jazelle(3)Thumb(4)TrustZone(5)SIMD(6)NEON 三、ARM核(ARMv7)工作模式1. 权限级别(privilege level)2.…...

Android系统定制APP开发_如何对应用进行系统签名
前言 当项目开发需要使用系统级别权限或frame层某些api时,普通应用是无法使用的,需要在AndroidManifest中配置sharedUserId: AndroidManifest.xml中的android:sharedUserId“android.uid.system”,代表的意思是和系统相同的uid&a…...
Tesla Free-Fall Attack:特斯拉汽车网络安全事件纪要
Tesla Free-Fall Attack:特斯拉汽车网络安全事件纪要 1. 引言 Tesla Free-Fall Attack 是由腾讯科恩实验室(Tencent Keen Security Lab)于2016年9月对特斯拉Model S汽车实施的一次远程攻击事件,揭示了汽车网络安全的严重漏洞&am…...
网络安全工程师学习路线
https://www.processon.com/view/link/6584f06465b7eb6189e99508 1、HTML基本语言 常用标签、表单、上传页面、登录页面、超链接2、javascript基本语法 变量、函数、流程控制语法、post请求、ajax请求、输入数据到页面、文件上传3、mysql基本用法 增删改查 infromation_sch…...
分区和分表有什么区别?
数据库中数据量过多,表太大的时候,不仅可以做分库分表,还可以做表分区,分区和分表类似,都是按照一定的规则将一张大表进行分解。 听上去好像也差不多,不就是将表拆分吗?那具体有什么差别呢&…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...