RabbitMQ运维
RabbitMQ运维
- 一.集群
- 1.简单介绍
- 2.集群的作用
- 二.搭建集群
- 1.多机多节点
- 搭建步骤
- 2.单机单节点
- 搭建步骤
- 3.宕机演示
- 三.仲裁队列
- 1.简单介绍
- 2.Raft协议
- Raft基本概念
- 主节点选举
- 选举过程
- 3.仲裁队列的使用
- 四.HAProxy负载均衡
- 1.安装HAProxy
- 2.HAProxy的使用
一.集群
1.简单介绍
RabbitMQ 集群是 RabbitMQ 实现高可用性(HA)、负载均衡和横向扩展的核心机制。
2.集群的作用
RabbitMQ集群允许消费者和生产者在RabbitMQ单个节点崩溃的情况下继续运,它可以通过添加更多的节点来线性地扩展消息通信的吞吐量。
当失去⼀个RabbitMQ节点时,客户端能够重新连接到集群中的任何其他节点并继续生产或者消费.
二.搭建集群
1.多机多节点
RabbitMQ集群对延迟非常敏感,所以搭建RabbitMQ集群时,多个节点应当在同⼀个局域网内。
因为需要多台机器进行演示,所以学生党(不宽裕)的话就不要去搞这个了,成本有点高,在网上认识一下就好了。
搭建步骤
使用3台局域网的云服务器进行搭建
- 3台机器都将RabbitMQ进行安装(安装都是一样的)
- 配置每个节点的hosts文件
- 配置Erlang Cookie
- 构建集群
这里不详细对多机多节点进行介绍,毕竟吃拼好饭的我,怎么留得住多台云服务器。
2.单机单节点
需要注意的是,单机单节点是通过伪集群的方式,如果机器挂了,就全部挂了,生产环境是不会使用这个的。
搭建步骤
- RabbitMQ的安装(已安装,不懂的可以去RabbitMQ简单介绍和安装)
- 单机启动两个节点
Node name | AMQP协议端口号 | Web管理界面端口 |
---|---|---|
rabbit2 | 5673 | 15673 |
rabbit3 | 5672 | 15674 |
启动命令:
RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS=“-rabbitmq_management
listener [{port,15673}]” RABBITMQ_NODENAME=rabbit2 rabbitmq-server -detached
RABBITMQ_NODE_PORT=5674 RABBITMQ_SERVER_START_ARGS=“-rabbitmq_management
listener [{port,15674}]” RABBITMQ_NODENAME=rabbit3 rabbitmq-server -detached
- 停止服务器并重置
rabbitmqctl -n rabbit2 stop_app
rabbitmqctl -n rabbit2 reset
rabbitmqctl -n rabbit3 stop_app
rabbitmqctl -n rabbit3 reset
- 把节点加入到集群当中
rabbitmqctl -n rabbit2 join_cluster rabbit@node Name
主节点的node Name,可以通过 rabbitmqctl status 查询
rabbitmqctl -n rabbit3 join_cluster rabbit@node Name
- 重启rabbit2和rabbit3
rabbitmqctl -n rabbit2 start_app
rabbitmqctl -n rabbit3 start_app
- 查看集群的状态
rabbitmqctl cluster_status -n rabbit
3.宕机演示
节点关闭之前:
节点关闭之后:
关闭节点的命令:rabbitmqctl -n rabbit stop_app
此时关闭节点的集群已经不在运行了,并且消息也丢失了。
三.仲裁队列
1.简单介绍
RabbitMQ 的仲裁队列是⼀种基于 Raft ⼀致性算法实现的持久化、复制的FIFO队列。仲裁队列提供队列复制的能力,保障数据的高可用和安全性。使用仲裁队列可以在RabbitMQ节点间进行队列数据的复制,从而达到在⼀个节点宕机时,队列仍然可以提供服务的效果。
2.Raft协议
Raft 是⼀种用于管理和维护分布式系统⼀致性的协议,它是⼀种共识算法,旨在实现高可用性和数据的持久性。
Raft通过在节点间复制数据来保证分布式系统中的⼀致性,即使在节点故障的情况下也能保证数据不会丢失。
共识算法(Consensus Algorithm)能够保证多个副本之间的⼀致性,它允许多个分布式节点就某个值或⼀系列值达成⼀致性协议。即使在⼀些节点发生故障,网络分区或其他问题的情况下,共识算法也能保证系统的⼀致性和数据的可靠性。
共识算法
- Paxos: ⼀种经典的共识算法,基于解决分布式系统中的⼀致性问题。
- Raft:⼀种较新的共识算法,Paxos不易实现,raft是对Paxos算法的简化和改进,旨在易于理解和实现。
- Zab:ZooKeeper使用的共识算法,基于Paxos算法,大部分和Raft相同,主要区别是对于Leader的任期,Raft叫做term,Zab叫做epoch,状态复制的过程中,raft的心跳从Leader向Follower发送,而ZAB则相反。
- Gossip:Gossip算法每个节点都是对等的,即没有角色之分。Gossip算法中的每个节点都会将数据改动告诉其他节点(类似传八卦)
Raft基本概念
Raft使⽤Quorum机制来实现共识和容错,我们将对Raft集群的操作必须得到大多数(>N/2)节点的同意才能提交。
Raft集群读写操作内部发生的情况
Raft集群必须存在⼀个主节点(Leader),客户端向集群发起的所有操作都必须经由主节点处理。所以Raft核心算法中的第⼀部分就是选主(Leader election)。没有主节点集群就无法工作,先选出⼀个主节点,再考虑其它事情。
主节点会负责接收客户端发过来的操作请求,将操作包装为日志同步给其它节点,在保证⼤部分节点都同步了本次操作后,就可以安全地给客户端回应响应了。这⼀部分工作在Raft核心算法中叫日志复制(Log replication).
因为主节点的责任非常大,所以只有符合条件的节点才可以当选主节点。为了保证集群对外展现的⼀致性,主节点在处理操作日志时,也⼀定要谨慎,这部分在Raft核心算法中叫
安全性(Safety).
Raft算法将⼀致性问题分解为三个子问题: Leader选举,日志复制和安全性.
主节点选举
在Raft算法中,每个节点都处于以下三种角色之⼀
- Leader(领导者):负责处理所有客户请求,并将这些请求作为日志项复制到所有Follower。Leader定期向所有Follower发送心跳消息,以维持其领导者地位,防止Follower进入选举过程。
- Follower(跟随者) :接收来自Leader的日志条目,并在本地应用这些条目。跟随者不直接处理客户请求。
- Candidate(候选者) 当跟随者在⼀段时间内没有收到来自Leader的心跳消息时,它会变得不确定Leader是否仍然可用。在这种情况下,跟随者会转变角色成为Candidate,并开始尝试通过投票过程成为新的Leader。
在正常情况下,集群中只有⼀个Leader,剩下的节点都是follower,下图展示了这些状态和它们之间的转换关系:
可以看出所有节点在启动时,都是follow状态,在⼀段时间内如果没有收到来自leader的心跳,从follower切换到candidate,发起选举。如果收到多数派(majority)的投票(含自己的⼀票)则切换到leader状态。Leader⼀般会⼀直工作直到它发生异常为止。
任期
Raft将时间划分成任意长度的任期(term)。每⼀段任期从⼀次选举开始,在这个时候会有⼀个或者多个candidate尝试去成为leader。在成功完成⼀次leaderelection之后,⼀个leader就会⼀直节管理集群直到任期结束。
在某些情况下,⼀次选举无法选出leader,这个时候这个任期会以没有leader而结束。同时⼀个新的任期(包含⼀次新的选举)会很快重新开始。
Term更像是⼀个逻辑时钟(logic clock)的作用,有了它,就可以发现哪些节点的状态已经过期。每⼀个节点都保存⼀个current term,在通信时带上这个term的值。
每⼀个节点都存储着⼀个当前任期号(current term number)。该任期号会随着时间单调递增。
节点之间通信的时候会交换当前任期号,如果⼀个节点的当前任期号比其他节点小,那么它就将自己的任期号更新为较大的那个值,如果⼀个candidate或者leader发现自己的任期号过期了,它就会立刻回到follower状态。
如果⼀个节点接收了⼀个带着过期的任期号的请求,那么它会拒绝这次请求。Raft算法中服务器节点之间采⽤RPC进行通信,主要有两类RPC请求:
- RequestVoteRPCs:请求投票,由candidate在选举过程中发出。
- AppendEntriesRPCs:追加条目,由leader发出用来做日志复制和提供心跳机制
选举过程
Raft采用⼀种心跳机制来触发leader选举,当服务器启动的时候,都是follow状态。如果follower在electiontimeout内没有收到来自leader的心跳(可能没有选出leader,也可能leader挂了,或者leader与follower之间网络故障),则会主动发起选举。
所有节点处于follower状态:
- 率先超时的节点,自增当前任期号然后切换为candidate态,并投自己⼀票。
- 以并行的放式发送一个RequestVote RPCs 给集群中的其他服务器节点(企图得到它们的投票)
- 等待其他节点的回复
S3节点率先超时,把任期号改成2,切换为candidate状态,发起投票请求,并给自己投一票
- 赢得选举成为Leader(包括自己的⼀票)
- 其他节点赢得了选举,它自行切换到follower
- ⼀段时间内没有收到majority投票,保持candidate状态,重新发出选举
投票要求:
• 每⼀个服务器节点会按照先来先服务原则(first-come-first-served)只投给⼀个 candidate.
• 候选人知道的信息不能比自己的少
第1种情况: 赢得了选举之后,新的leader会立刻给所有节点发消息,广而告之,避免其余节点触发新的选举。
S3节点应赢得多数投票,广而告之:
第2种情况: 比如有三个节点A B C, A B同时发起选举,而A的选举消息先到达C,C给A投了⼀票,当B的消息到达C时,已经不能满足上面提到的第⼀个约束,即C不会给B投票,这时候A就胜出了。
A胜出之后,会给B,C发⼼跳消息,节点B发现节点A的term不低于自己的term,知道有已经有Leader了,于是把自己转换成follower.
S1收到S3的心跳信息,发现S3的term不低于自己,就知道已经有leader了,将自己切换成follower:
第3种情况: 没有任何节点获得majority投票。比如所有的follower同时变成candidate,然后它们都将票投给自己,那这样就没有candidate能得到超过半数的投票了。
当这种情况发生的时候,每个candidate都会进行一次超时响应,然后通过自增任期号来开启⼀轮新的选举,并启动另⼀轮的RequestVoteRPCs。如果没有额外的措施,这种无结果的投票可能会无限重复下去。
S1-S5都在参与选举,每个节点都投给自己,如果超时,会重复发起新一轮的选举
为了解决上述问题,Raft采用随机选举超时时间(randomized election timeouts)来确保很少产⽣无结果的投票,并且就算发⽣了也能很快地解决。
为了防止选票⼀开始就被瓜分,选举超时时间是从⼀个固定的区间(比如,150-300ms)中随机选择。
这样可以把服务器分散开来以确保在⼤多数情况下会只有⼀个服务器率先结束超时,那么这个时候,它就可以赢得选举并在其他服务器结束超时之前发送⼼跳。
Raft动画演示在线地址
日志复制
每个仲裁队列都有多个副本,它包含⼀个主和多个从副本。replication factor 为 5的仲裁队列将会有1个
主副本和4个从副本。
每个副本都在不同的RabbitMQ节点上客户端(生产者和消费者)只会与主副本进行交互,主副本再将这些命令复制到从副本。当主副本所在的节点下线,其中一个从副本会被选举成为主副本,继续提供服务。
消息复制和主副本选举的操作,需要超过半数的副本同意。当生产者发送⼀条消息,需要超过半数的队列副本都将消息写入磁盘以后才会向生产者进行确认,这意味着少部分比较慢的副本不会影响整个队列的性能。
3.仲裁队列的使用
- 使用Spring框架创建仲裁队列
Producer
@RequestMapping("/quorum")public String quorum() {rabbitTemplate.convertAndSend("","quorum.queue","quorum test....");return "quorum is ok!";}
Configuration
@Configuration
public class OpsConfiguration {@Bean("quorumQueue")public Queue quorumQueue() {return QueueBuilder.durable("quorum.queye").quorum().build();}
}
- 在管理页面创建仲裁队列
Node是leader
此时停止其中一个主节点,此时消息还是存在,不会直接消失,并且会重新选举leader:
先给queue2中创建一个消息:
重新启动原来的leader后,就会有2个follower了:
仲裁队列,是RabbitMQ从3.8.0版本引⼊的新的队列类型,Quorum相比Classic在分布式环境下对消息的可靠性保障更高。
普通队列只会存放在集群中的⼀个节点上,虽然通过其它节点也可以访问普通队列,但是其它节点只是把请求转发到队列所在的节点进行操作。⼀旦队列所在节点宕机,队列中的消息就会丢失,因此普通集群只是提高了并发能⼒力,并未实现高可用。
仲裁队列可以极大的保障RabbitM集群对接的高可用。
四.HAProxy负载均衡
这时候就存在两个问题:
- 如果我们访问的是node1,但是node1挂了,咱们的程序也会出现问题,所以最好是有⼀个统⼀的入口,⼀个节点故障时,流量可以及时转移到其他节点。
- 如果所有的客户端都与node1建议连接,那么node1的网络负载必然会大大增加,而其他节点又由于没有那么多的负载而造成硬件资源的浪费,这时候负载均衡显得尤其重要。
这里主要讨论的是如何有效地对RabbitMQ集群使⽤软件负载均衡技术,目前主流的方式有在客户端内
部实现负载均衡,或者使用HAProxy、LVS等负载均衡有软件来实现。这里讲⼀下使用HAProxy来实现负载均衡。
1.安装HAProxy
HAProxy(High Availability Proxy)是⼀个开源的负载均衡器和TCP/HTTP应用程序的代理服务器,它被设计用来提供高可用性,负载均衡和代理功能。HAProxy主要用于分发网络流量到多个后端服务器,以提高网络的可靠性和性能。
-
更新数据包sudo apt-get update
-
查找HAProxy:sudo apt list|grep haproxy
-
安装HAProxy:sudo apt-get install haproxy
-
验证状态:
-
查看版本:haproxy -v
-
需要Proxy服务器自启动则使用:sudo systemctl enable haproxy
-
通过vi /etc/haproxy/haproxy.cfg修改haproxy.cfg文件:
#haproxy web 管理界⾯
listen stats #设置⼀个监听器, 统计HAProxy的统计信息
bind *:8100 #指定了监听器绑定到的IP地址和端⼝
mode http #监听器的⼯作模式为HTTP
stats enable #启⽤统计⻚⾯
stats realm Haproxy\ Statistics
stats uri /
stats auth admin:admin #haproxy登录账号和密码
#配置负载均衡
listen rabbitmq #设置监听器
bind *:5670 #监听器绑定到的IP地址和端⼝, 也就是集群前端IP, 供producer和consumer
来进⾏选择,由于5672端⼝已经默认使⽤, 这⾥选择5670端⼝
mode tcp #由于RabbitMQ使⽤AMQP协议,它是⼀个基于TCP的协议,所以这⾥使⽤TCP模
balance roundrobin #指定负载均衡策略为轮询
#负载均衡中的集群节点配置,这⾥选择的rabbit节点
server rabbitmq1 127.0.0.1:5672 check inter 5000 rise 2 fall 3
server rabbitmq2 127.0.0.1:5673 check inter 5000 rise 2 fall 3
server rabbitmq3 127.0.0.1:5674 check inter 5000 rise 2 fall 3
- 配置完后,重启HAProxy:sudo systemctl restart haproxy
页面:
2.HAProxy的使用
yml文件的配置
Configuration
@Bean("clusterQueue")public Queue clusterQueue() {return QueueBuilder.durable("cluster.queye").quorum().build();}
Producer
@RequestMapping("/cluster")public String cluster() {rabbitTemplate.convertAndSend("","cluster.queue","cluster test....");return "cluster is ok!";}
相关文章:
RabbitMQ运维
RabbitMQ运维 一.集群1.简单介绍2.集群的作用 二.搭建集群1.多机多节点搭建步骤 2.单机单节点搭建步骤 3.宕机演示 三.仲裁队列1.简单介绍2.Raft协议Raft基本概念主节点选举选举过程 3.仲裁队列的使用 四.HAProxy负载均衡1.安装HAProxy2.HAProxy的使用 一.集群 1.简单介绍 Ra…...
【ESP32】ESP32物联网应用:MQTT控制与状态监测
ESP32物联网应用:MQTT控制与状态监测 引言 在物联网时代,远程监测和控制设备已经成为现实生活中常见的需求。本文将介绍如何使用ESP32微控制器配合MQTT协议,实现一个简单而强大的物联网应用:远程状态监测和设备控制。我们将以巴…...
如何保证RabbitMQ消息的可靠传输?
在这个图中,消息可能丢失的场景是1,2,3 1.在生产者将消息发送给RabbitMQ的时候,消息到底有没有正确的到达服务器呢,RabbitMQ提供了两种解决方案: a. 通过事务机制实现(比较消耗性能࿰…...
Redis高可用
主从复制 为什么要主从复制? 由于数据都是存储在一台服务器上,如果出事就完犊子了,比如: 如果服务器发生了宕机,由于数据恢复是需要点时间,那么这个期间是无法服务新的请求的;如果这台服务器…...
[项目总结] 在线OJ刷题系统项目技术应用(下)
🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…...
链表算法中常用操作和技巧
目 1.常用技巧 1.1.画图 1.2.添加虚拟头节点 1.3.大胆引入中间变量 1.4.快慢双指针 1.4.1判断链表是否有环 1.4.2找链表中环的入口 2.常用操作 2.1. 创建一个新节点 2.2.尾插 2.3.头插 1.常用技巧 1.1.画图 画图可以让一些抽象的文字语言更加形象生动 画图&#…...
MySQL基础 [二] - 数据库基础
目录 库的增删查改 查看数据库 创建数据库 删除数据库 修改数据库 认识系统编码(字符集和校验规则) 查看系统默认字符集以及校验规则 查看数据库支持的字符集和字符集校验规则 验证不同校验码编码的影响 校验规则对数据库的影响 数据库的备份…...
【Linux篇】基础IO - 文件描述符的引入
📌 个人主页: 孙同学_ 🔧 文章专栏:Liunx 💡 关注我,分享经验,助你少走弯路! 文章目录 一. 理解文件1.1 侠义理解1.2 广义理解1.3 文件操作的归类认知1.4 系统角度 二. 回顾C语言文件…...
13.【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--微服务基础工具与技术--Refit
在微服务架构中,不同服务之间经常需要相互调用以完成复杂业务流程,而 Refit 能让这种“跨服务调用”变得简洁又可靠。开发者只需将对外暴露的 REST 接口抽象成 C# 接口,并通过共享库或内部 NuGet 包在各服务中引用,这种契约优先的…...
C++ 并发性能优化实战:提升多线程应用的效率与稳定性
🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,获得2024年博客之星荣誉证书,高级开发工程师,数学专业,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开发技术,…...
前端性能优化的全方位方案【待进一步结合项目】
以下是前端性能优化的全方位方案,结合代码配置和最佳实践,涵盖从代码编写到部署的全流程优化: 一、代码层面优化 1. HTML结构优化 <!-- 语义化标签减少嵌套 --> <header><nav>...</nav> </header> <main&…...
(undone) 并行计算 CS149 Lecture3 (现代多核处理器2 + ISPC编程抽象)
url: https://www.bilibili.com/video/BV1du17YfE5G?spm_id_from333.788.videopod.sections&vd_source7a1a0bc74158c6993c7355c5490fc600&p3 如上堂课,超线程技术通过储存不同线程的 execution context,能够在一个线程等待 IO 的时候低成本切换…...
DiffAD:自动驾驶的统一扩散建模方法
25年3月来自新加坡公司 Carion 和北航的论文“DiffAD: A Unified Diffusion Modeling Approach for Autonomous Driving”。 端到端自动驾驶 (E2E-AD) 已迅速成为实现完全自动驾驶的一种有前途的方法。然而,现有的 E2E-AD 系统通常采用传统的多任务框架,…...
QScrollArea 内部滚动条 QSS 样式失效问题及解决方案
在使用 Qt 进行 UI 开发时,我们经常希望通过 QSS(Qt Style Sheets)自定义控件的外观,比如为 QScrollArea 的内部滚动条设置特定的样式。然而,有开发者遇到了这样的问题:在 UI 设计器中预览 QSS 显示效果正常,但程序运行时却显示为系统默认样式。经过反复测试和调试,最终…...
换脸视频FaceFusion3.1.0-附整合包
2025版最强换脸软件FaceFusion来了(附整合包)超变态的AI换脸教程 2025版最强换脸软件FaceFusion来了(附整合包)超变态的AI换脸教程 整合包地址: 「Facefusion_V3.1.0」 链接:https://pan.quark.cn/s/f71601…...
Qt 入门 1 之第一个程序 Hello World
Qt 入门1之第一个程序 Hello World 直接上操作步骤从头开始认识,打开Qt Creator,创建一个新项目,并依次执行以下操作 在Qt Creator中,一个Kits 表示一个完整的构建环境,包括编译器、Qt版本、调试器等。在上图中可以直…...
无锁队列简介与实现示例
1. 简介 无锁队列是一种数据结构,旨在在多线程环境中实现高效的并发访问,而无需使用传统的锁机制(如互斥锁)。无锁队列通过使用原子操作(如CAS,Compare-And-Swap)来确保线程安全,从…...
SpringMVC与SpringCloud的区别
SpringMVC与SpringCloud的核心区别 功能定位 • SpringMVC: 基于Spring框架的Web层开发模块,采用MVC(Model-View-Controller)模式,专注于处理HTTP请求、路由分发(如DispatcherServlet)和视图…...
STM32F103C8T6单片机开发:简单说说单片机的外部GPIO中断(标准库)
目录 前言 如何使用STM32F1系列的标准库完成外部中断的抽象 初始化我们的GPIO为输入的一个模式 初识GPIO复用,开启GPIO的复用功能时钟 GPIO_EXTILineConfig和EXTI_Init配置外部中断参数 插入一个小知识——如何正确的配置结构体? 初始化中断&#…...
Python urllib3 全面指南:从基础到实战应用
欢迎来到涛涛的频道,今天用到了urllib3,和大家分享下。 1、介绍 urllib3 urllib3 是 Python 中一个功能强大且用户友好的 HTTP 客户端库,它提供了许多标准库 urllib 所不具备的高级特性。作为 Python 生态中最受欢迎的 HTTP 库之一…...
25.5 GLM-4优化RAG实战:0.1%参数实现准确率飙升30%,成本直降90%!
使用 GLM-4 优化 RAG 程序:基于标注数据的 Adapter 训练实战 关键词:GLM-4 优化, RAG 增强, 数据标注, Adapter 训练, 检索增强生成 1. RAG 系统的核心挑战与优化方向 传统 RAG(Retrieval-Augmented Generation)系统常面临以下瓶颈: graph LR A[用户提问] --> B[检…...
OrangePi入门教程(待更新)
快速上手指南 https://www.hiascend.com/developer/techArticles/20240301-1?envFlag1 教学课程(含开发板配置和推理应用开发) https://www.hiascend.com/developer/devboard 开发推理应用 https://www.hiascend.com/developer/techArticles/20240326-1?envFlag1...
基于SpringBoot+Vue实现的二手交易市场平台功能一
一、前言介绍: 1.1 项目摘要 随着社会的发展和人们生活水平的提高,消费者购买能力的提升导致产生了大量的闲置物品,这些闲置物品具有一定的经济价值。特别是在高校环境中,学生群体作为一个具有一定消费水平的群体,每…...
TC3xx芯片的UCB介绍
文章目录 前言一、UCB的定义及其功能简介二、UCB_BMHDx_ORIG and UCB_BMHDx_COPY (x 0 - 3)2.1 BMHD(Boot Mode Head) 三、UCB_SSW四、UCB_PFLASH_ORIG and UCB_PFLASH_COPY4.1 Password4.2 UCB Confirmation 前言 缩写全称UCBUser Configuration BlockBMHDBoot Mode Headers…...
Airflow量化入门系列:第四章 A股数据处理与存储优化
Airflow量化入门系列:第四章 A股数据处理与存储优化 本教程系统性地讲解了 Apache Airflow 在 A 股量化交易中的应用,覆盖从基础安装到高级功能的完整知识体系。通过八章内容,读者将掌握 Airflow 的核心概念、任务调度、数据处理、技术指标计…...
《海空重力测量理论方法及应用》之一重力仪系统组成及工作原理(下)
2、三轴稳定平台型 稳定平台的作用是隔离测量载体角运动对重力观测量的影响,确保重力传感器的敏感轴方向始终与重向保持一致。 当前主流的海空重力仪使用的稳定平台方案主要有4种: ①双轴阻尼陀螺平台: ②)双轴惯导加捷联方位平台: ③三轴惯导平台; ④捷联惯导…...
C++模板递归结构详解和使用
示例代码 template<typename _SourceIterator, typename _DestT> struct convert_pointer {typedef typename convert_pointer<typename _SourceIterator::pointer, _DestT>::type type; };1. 模板参数 _SourceIterator 是输入的类型,通常表示迭代器类…...
(八)PMSM驱动控制学习---无感控制之滑膜观测器
在FOC矢量控制中,我们需要实时得到转子的转速和位置 ,但在考虑到成本和使用场合的情况下,往往使用无感控制,因为无位置传感器克服了传统机械式传感器的很多缺点和不足。比如,机械式传感器对环境要求比较严格࿰…...
蓝桥杯真题-分糖果-题解
链接:https://www.lanqiao.cn/problems/4124/learning/ 题目 复述:两种糖果,分别有9和16,分给7人,每个人得到的最少2,最多5,必需全部分完,几种分法? 复习-深度优先搜索 …...
推荐系统(二十二):基于MaskNet和WideDeep的商品推荐CTR模型实现
在上一篇文章《推荐系统(二十一):基于MaskNet的商品推荐CTR模型实现》中,笔者基于 MaskNet 构建了一个简单的模型。笔者所经历的工业级实践证明,将 MaskNet 和 Wide&Deep 结合应用,可以取得不错的效果&…...
辅助查询是根据查询到的文档片段再去生成新的查询问题
💡 辅助查询是怎么来的? 它是基于你当前查询(query)检索到的某个文档片段(chunk_result),再去“反推”出新的相关问题(utility queries),这些问题的作用是&a…...
Spring Cloud 框架为什么能处理高并发
Spring Cloud框架能够有效处理高并发场景,核心在于其微服务架构设计及多组件的协同作用,具体机制如下: 一、分布式架构设计支撑高扩展性 服务拆分与集群部署 Spring Cloud通过微服务拆分将单体系统解耦为独立子服务,每个服务可独…...
Pseduo LiDAR(CVPR2019)
文章目录 AbstractIntroductionRelated WorkLiDAR-based 3D object detectionStereo- and monocular-based depth estimationImage-based 3D object detection MethodDepth estimationPseudo-LiDAR generationLiDAR vs. pseudo-LiDAR3D object detectionData representation ma…...
强化学习课程:stanford_cs234 学习笔记(3)introduction to RL
文章目录 前言7 markov 实践7.1 markov 过程再叙7.2 markov 奖励过程 MRP(markov reward process)7.3 markov 价值函数与贝尔曼方程7.4 markov 决策过程MDP(markov decision process)的 状态价值函数7.4.1 状态价值函数7.4.2 状态…...
前端精度计算:Decimal.js 基本用法与详解
一、Decimal.js 简介 decimal.js 是一个用于任意精度算术运算的 JavaScript 库,它可以完美解决浮点数计算中的精度丢失问题。 官方API文档:Decimal.js 特性: 任意精度计算:支持大数、小数的高精度运算。 链式调用:…...
来聊聊C++中的vector
一.vector简介 vector是什么 C 中的 vector 是一种序列容器,它允许你在运行时动态地插入和删除元素。 vector 是基于数组的数据结构,但它可以自动管理内存,这意味着你不需要手动分配和释放内存。 与 C 数组相比,vector 具有更多的…...
对比学习中的NCE(Noise-Contrastive Estimation)和InfoNCE(SimCLR)损失函数+案例(附SimSiam分析)
在对比学习(Contrastive Learning)中,NCE(Noise-Contrastive Estimation)和InfoNCE是两种常见的目标函数,它们都用于通过区分正样本和负样本来学习高质量的表示。 1. NCE(Noise-Contrastive Est…...
基于FAN网络的图像识别系统设计与实现
基于FAN网络的图像识别系统设计与实现 一、系统概述 本系统旨在利用FAN(Fourier Analysis Networks)网络架构实现高效的图像识别功能,并通过Python语言设计一个直观的用户界面,方便用户操作与使用。FAN网络在处理周期性特征方面具有独特优势,有望提升图像识别在复杂场景…...
【瑞萨 RA-Eco-RA2E1-48PIN-V1.0 开发板测评】PWM
【瑞萨 RA-Eco-RA2E1-48PIN-V1.0 开发板测评】PWM 本文介绍了瑞萨 RA2E1 开发板使用内置时钟和定时器实现 PWM 输出以及呼吸灯的项目设计。 项目介绍 介绍了 PWM 和 RA2E1 的 PWM 资源。 PWM 脉冲宽度调制(Pulse Width Modulation, PWM)是一种对模拟…...
NDK开发:开发环境
NDK开发环境 一、NDK简介 1.1 什么是NDK NDK(Native Development Kit)是Android提供的一套工具集,允许开发者在Android应用中使用C/C++代码。它包含了: 交叉编译器构建工具调试器系统头文件和库示例代码和文档1.2 NDK的优势 性能优化:直接使用底层代码,提高性能代码保…...
设计模式简述(三)工厂模式
工厂模式 描述简单工厂(静态工厂)工厂方法模式 抽象工厂增加工厂管理类使用 描述 工厂模式用以封装复杂的实例初始化过程,供外部统一调用 简单工厂(静态工厂) 如果对象创建逻辑简单且一致,可以使用简单工…...
通过Postman和OAuth 2.0连接Dynamics 365 Online的详细步骤
🌟 引言 在企业应用开发中,Dynamics 365 Online作为微软的核心CRM平台,提供了强大的Web API接口。本文将教你如何通过Postman和OAuth 2.0认证实现与Dynamics 365的安全连接,轻松调用数据接口。 📝 准备工作 工具安装…...
LlamaIndex实现RAG增强:上下文增强检索/重排序
面向文档检索的上下文增强技术 文章目录 面向文档检索的上下文增强技术概述技术背景核心组件方法详解文档预处理向量存储创建上下文增强检索检索对比技术优势结论导入库和环境变量读取文档创建向量存储和检索器数据摄取管道使用句子分割器的摄取管道使用句子窗口的摄取管道查询…...
AI比人脑更强,因为被植入思维模型【43】蝴蝶效应思维模型
giszz的理解:蝴蝶效应我们都熟知,就是说一个微小的变化,能带动整个系统甚至系统的空间和时间的远端,产生巨大的链式反应。我学习后的启迪,简单的说,就是不要忽视任何微小的问题,更多时候&#x…...
程序化广告行业(62/89):DSP系统的媒体与PDB投放设置探秘
程序化广告行业(62/89):DSP系统的媒体与PDB投放设置探秘 大家好!在之前的学习中,我们对程序化广告的DSP系统有了一定了解。今天还是带着和大家共同进步的想法,深入探索DSP系统中媒体设置以及PDB投放设置的…...
Java项目之基于ssm的怀旧唱片售卖系统(源码+文档)
项目简介 怀旧唱片售卖系统实现了以下功能: 用户信息管理: 用户信息新增:添加新用户的信息。 用户信息修改:对现有用户信息进行修改。 商品信息管理: 商品信息添加:增加新的商品(唱片&#x…...
程序化广告行业(61/89):DSP系统活动设置深度剖析
程序化广告行业(61/89):DSP系统活动设置深度剖析 大家好!在程序化广告的学习道路上,我们已经探索了不少重要内容。今天依旧本着和大家一起学习进步的想法,深入解析DSP系统中活动设置的相关知识。这部分内容…...
Altshuller矛盾矩阵查询:基于python和streamlit
基于python和streamlit实现的Altshuller矛盾矩阵查询 import streamlit as st import json# 加载数据 st.cache_resource def load_data():with open(parameter.json, encodingutf-8) as f:parameters json.load(f)with open(way.json, encodingutf-8) as f:contradictions …...
FreeRTOS的空闲任务
在 FreeRTOS 中,空闲任务(Idle Task) 是操作系统自动创建的一个特殊任务,其作用和管理方式如下: 1. 空闲任务创建 FreeRTOS 内核自动创建:当调用 vTaskStartScheduler() 启动调度器时,内核会自…...
【代码模板】如何用FILE操作符打开文件?fopen、fclose
#include "stdio.h" #include "unistd.h"int main(int argc, char *argv[]) {FILE *fp fopen("1.log", "wb");if (!fp) {perror("Failed open 1.log");return -1;}fclose(fp); }关于权限部分参考兄弟篇【代码模板】C语言中…...