Kylin Server V10 下 RocketMQ 主备自动切换模式部署
一、NameServer简介
NameServer 是一个注册中心,提供服务注册和服务发现的功能。NameServer 可以集群部署,集群中每个节点都是对等的关系,节点之间互不通信。
服务注册
Broker 启动的时候会向所有的 NameServer 节点进行注册,注意这里是向集群中所有的 NameServer 节点注册,而不是只向其中的某些节点注册,因为 NameServer 每个节点都是对等的,所以 Broker 需要向每一个节点进行注册,这样每一个节点都会有一份 Broker 的注册信息。
服务发现
Broker 向 NameServer 注册以后,生产者 Producer 和消费者 Consumer 就可以从 NameServer 中获取所有注册的 Broker 信息,不过由于 NameServer 每个节点是对等的,所以生产者和消费者需要感知所有的 NameServer, 之后选取一个 NameServer 从中获取 Topic 的路由信息,再向对应的 Broker 进行消息的发送和消费。
以生产者为例,在 NameServer 集群部署模式下,生产者会从多个 NameServer 中随机选取一个进行通信,从中拉取所有 Broker 的注册信息,并将拉取到的信息进行缓存,生产者知道了 Broker 的信息后,就可以得知 Topic 的分布情况,然后选取一个消息队列,与其所在的 Broker 通信进行消息的发送。如果通信的 NameServer 宕机,消费者会轮询选择下一个 NameServer。
为什么需要 NameServer ?
在使用 RocketMQ 的时候,为了提升性能以及应对高并发的情况,一般都会使用多个 Broker 进行集群部署,假设没有注册中心,对于 Broker 来说,如果想获取到集群中所有的 Broker 信息(生产者和消费者需要通过某个 Broker 获取整个集群的信息,从而得到Topic 的分布情况),每个 Broker 都需要与其他 Broker 通信来交换信息,以此来得到集群内所有 Broker 的信息,在 Broker 数量比较大的情况下,会造成非常大的通信压力。
Broker 注册
Broker 启动后开启定时向 NameServer 进行注册(发送心跳包)的任务,发送心跳包的时间间隔可以在配置文件中进行设置,但是最长不能超过10s ,也就是说 Broker 最长10秒钟会向 NameServer 发送一次心跳包。
NameServer 收到 Broker 的注册请求(心跳包)后,会判断 Broker 之前是否已经注册过,如果未注册过将其加入到注册的 Broker 集合 brokerAddrTable 中,同时也会记录收到注册请求的时间,将其加入到 brokerLiveTable 中,里面记录了 NameServer 收到每个 Broker 发送心跳包的时间,在进行心跳检测的时候根据这个时间戳来判断是否在规定时间内未收到该 Broker 发送的心跳包。
读写锁
由于 NameServer 可能同时收到多个 Broker 的注册以及生产者或者消费者的拉取请求,为了保证数据的一致性(因为有读写请求同时发生或者写与写请求同时发生),在处理相关请求的时候需要加锁,为了提高性能,使用了 ReadWriteLock 读写锁,处理注册请求时会先添加写锁,外理拉取请求时添加读锁,这样如果某一时刻都是读的请求可以同时进行,互不影响,如果有写请求,其他请求就需要等锁释放才可以进行往下进行。如果不使用读写锁,直接对所有的请求加锁,会影响性能,实际上读与读之间并不需要加锁。
心跳检测
NameServer 在启动的时候会开启一个用于心跳检测的定时任务(每10s执行一次),定时扫描处于不活跃状态的 Broker, 如果在规定时间内未收到某个 Broker 的心跳包,会认为此 Broker 不可用,需要将其进行剔除。
brokerLiveTable 保存了当前 NameServer 收到的心跳数据,里面记录了每一个 Broker 最近进行注册/发送心跳的时间戳,所以只需遍历 brokerLiveTable, 获取每一个 Broker 最近一次发送心跳的时间进行判断,如果上一次发送心跳的时间 + 过期时间(120s)小于当前时间,也就是超过 120s 没有收到某个 Broker 的心跳包,则认为此 Broker 已下线,将 Broker 移除。
Broker 下线
正常下线
当 Broker 下线的时候会向 NameServer 发起取消注册的请求,NameServer 收到请求后会将 Broker 剔除。
异常下线
如果 Broker 异常宕机,或者发送给 NameServer 的取消注册请求由于某些原因并未发送成功,NameServer 可能并未感知到 Broker 的下线,由于心跳机制定时检测的功能,会在一段时间后发现未收到 Broker 的心跳请求,主动将 Broker 剔除。
生产者和消费者
生产者和消费者都会定时从 NameServer 中更新 Broker 的注册信息,默认是30s 进行一次更新。
二、Controller 模式简介
在RocketMQ 5.0 以前,有两种集群部署模式,分别为主从模式(Master-Slave模式)和 Dledger 模式。
主从模式
主从模式中分为 Master 和 Slave 两个角色,集群中可以有多个 Master 节点,一个 Master 节点可以有多个 Slave 节点。Master 节点负责接收生产者发送的写入请求,将消息写入 CommitLog 文件,Slave 节点会与 Master 节点建立连接,从 Master 节点同步消息数据(有同步复制和异步复制两种方式)。
消费者可以从 Master 节点拉取消息,也可以从 Slave 节点拉取消息。
在 RocketMQ 4.5 版本之前,如果 Master 宕机,不支持将 Slave 切换为 Master, 需要人工介入。
Dledger 模式
为了解决主从架构下 Slave 不能自动切换为 Master 的问题,4.5 版本之后提供了 DLedger 模式,使用 Raft 算法,如果 Master 节点出现故障,可以自动从 Slave 节点中选举出新的 Master 进行切换。
存在问题
(1)根据 Raft 算法的多数原则,集群至少有三个节点以上,在消息写入时,也需要大多数的 Follower 节点响应成功才能认为消息写入成功;
(2)Dledger 模式下,进行消息写入的时候,使用的是 openmessaging 包中提供的接口,无法利用 RocketMQ 原生的存储和复制能力(比如非 Dledger 模式下使用暂存池方式写入);
(3)存在两套日志复制流程(主从模式下一套,Dledger 模式一套),不统一;
Controller 模式
为了解决如上问题,RocketMQ 5.0 以后推出了 Controller 模式,它的特点如下:
(1)在主从部署模式下具备自动切换 Master 的能力;
(2)可以利用 RocketMQ 原生存储复制能力,并统一 RocketMQ 的存储和复制能力;
RocketMQ 5.0 对Broker 选主相关的功能进行了抽离,放在 Controller 中,实现了在主从部署模式下就可以自动切换 Master, Controller 可以独立部署也可以嵌入在 NameServer 中部署。
独立部署下的 Controller如下所示:
嵌入 NameServer 中的部署图如下所示:
Controller
也称为 Controller 控制器,一般集群中部署多个 Controller, 使用 Raft 算法选举出一个 Active DLedger Controller 作为主控制器,它主要用来管理一个 SyncStateSet集合,这个集合中存储的是一组跟上 Master 进度的 Broker 节点集合,如果 Controller 发现某个 Master Broker 下线时,会从集合中选出新的 Master Broker 并切换,Controller 可以单独部署也可以嵌在 NameServer 中部署。
SyncStateSet
SyncStateSet 中维护了一个 Broker 副本组集合,包含当前 Master Broker 和它的 Slave Broker, 需要注意在集合内的节点都是跟上 Master 进度的节点,在节点变更时,由 Master Broker 向 Controller 控制器发起变更请求,更新 Controller 中的 SyncStateSet 数据,在选举 Master 的时候,Controller 只需从这个列表中选出一个节点成为新的 Master 即可。
节点变更分为 Shrink 操作和 Expand 操作,需要 Master Broker 发起,它会通过定时任务以及在数据同步过程中判断是否需要进行 Shrink 或 Expand。
Shrink
Shrink 指的是将 SyncStateSet 副本集合中与 Master 节点差距过大的副本移除,差距的判断条件如下:
1. 节点是否与 Master Broker 的连接已断,如果断开需要将该节点从 SyncStateSet 移除;
2.节点的复制进度是否过大,新增了 haMaxTimeSlaveNotCatchup 参数,Master Broker 会通过定时任务扫描每一个 Slave 节点的复制信息,里面有每个节点上一次跟上 Master 进度的时间戳 lastCaughtUpTimeMs, 如果当前时间减去这个 lastCaughtUpTimeMs 超过了 haMaxTimeSlaveNotCatchup 的值,会认为该 Slave 节点的复制进度过后;
haMaxTimeSlaveNotCatchup:表示Slave没有跟上 Master 的最大时间间隔,若在 SyncStateSet 中的 slave 超过该时间间隔会将其从 SyncStateSet 移除。默认为 15000(15s)。 |
Expand
如果 Master Broker 发现某个 Slave 节点赶上了 Master 节点的进度,需要将其重新加入到 SyncStateSet 。
需要注意以上两个操作,都需要 Master Broker 向 Controller 节点发送通知,请求更新 SyncStateSet 中的数据。
选举 Master
不管是 Controller 独立部署,还是嵌入到 NameServer 中部署,Controller 都会监听每个 Broker 的连接,Broker 会定期向 Controller 发送心跳包,Controller 会定时扫描,如果某个 Broker 心跳包发送超时,会认为这个 Broker 已经失效,此时会判断 Broker 是否是 Master 角色,如果是 Master 角色就需要从该组的 SyncStateSet 中重新选出一个节点作为 Master。
选举 Master 的方式比较简单,从该组的 SyncStateSet 中,挑选一个心跳包发送正常的 Slave 成为新的 Master 节点即可,并将结果通知到该组所有的 Broker, 每个Broker 也会定时向 Controller 发送请求获取主备信息。
Broker 端设计
主从架构部署模式下,需要配置 brokerRole 和 brokerId,也就是手动分配 Master 和 Slave,在 Controller 模式下,这两个参数会失效,不需要再进行配置,角色和 ID 由 Controller 来分配。
Controller 模式下增加了 controllerAddr 参数,Broker 在启动时,需要配置这个参数,设置每个controller 的地址:
controllerAddr:controller的地址,多个controller中间用分号隔开。例如controllerAddr = 127.0.0.1:9877;127.0.0.1:9878;127.0.0.1:9879 |
Broker 上线
Broker 配置了每个 Controller 的地址,Broker 启动时,会先向 Controller 注册,并获取角色关系和 brokerId, 通过角色关系可以知道自己是 Master 还是 Slave,之后再向 NameServer 注册。
Broker 可以通过任意一个 Co
相关文章:
Kylin Server V10 下 RocketMQ 主备自动切换模式部署
一、NameServer简介 NameServer 是一个注册中心,提供服务注册和服务发现的功能。NameServer 可以集群部署,集群中每个节点都是对等的关系,节点之间互不通信。 服务注册 Broker 启动的时候会向所有的 NameServer 节点进行注册,注意这里是向集群中所有的 NameServer 节点注册…...
Linux启动中出现“psi: inconsistent task state!”错误可能原因
在Linux系统中,psi: inconsistent task state! 异常日志通常与 PSI(Pressure Stall Information)相关。PSI 是 Linux 内核中的一个特性,用于监控系统资源的压力情况,如 CPU、内存和 I/O 等。该日志信息表明在处理任务状…...
FCBP 认证考试要点摘要
理论知识 数据处理与分析:包括数据的收集、清洗、转换、存储等基础操作,以及数据分析方法,如描述性统计分析、相关性分析、数据挖掘算法等的理解和应用 。数据可视化:涉及图表类型的选择与应用,如柱状图、折线图、饼图…...
ubuntu防火墙入门(一)——设置服务、关闭端口
本机想通过git clone gitgithub.com:skumra/robotic-grasping.git下载代码,firewall-config中需要为当前区域的防火墙开启SSH服务吗 是的,如果你想通过 git clone gitgithub.com:skumra/robotic-grasping.git 使用 SSH 协议从 GitHub 下载代码࿰…...
yt6801 ubuntu有线连接驱动安装
耀世16pro的有线网卡驱动安装 下载地址: YT6801 千兆PCIE以太网控制器芯片 1. 创建安装目录 mkdir yt68012. 解压驱动文件 unzip yt6801-linux-driver-1.0.27.zip -d yt68013. 进入驱动目录 cd yt68014. 安装驱动 以 root 权限运行安装脚本: sudo su ./yt_ni…...
ASP.NET Core Web API 控制器
文章目录 一、基类:ControllerBase二、API 控制器类属性三、使用 Get() 方法提供天气预报结果 在深入探讨如何编写自己的 PizzaController 类之前,让我们先看一下 WeatherController 示例中的代码,了解它的工作原理。 在本单元中,…...
【论文笔记】Tool Learning with Foundation Models 论文笔记
Tool Learning with Foundation Models 论文笔记 文章目录 Tool Learning with Foundation Models 论文笔记摘要背景:工作: 引言工具学习的发展本文工作(大纲&目录) 背景2.1 工具使用的认知起源2.2 工具分类:用户界…...
STM32 + CubeMX + 串口 + IAP升级
这篇文章分享一个简单的串口IAP Demo,实现使用串口更新我们自己的App程序。 目录 一、IAP简介二、Stm32CubeMx配置三、Boot代码及配置1、代码2、配置 四、App代码及配置1、代码2、配置 五、效果展示 一、IAP简介 IAP介绍可以在网上找找,相关资料很多&am…...
Oracle-—系统包使用
文章目录 系统包dbms_redefinition 系统包 dbms_redefinition 功能介绍:该包体可以实现将Oracle库下的表在线改为分区结构或者重新定义; 说明:在检查表是否可以重定义和开始重定义的过程中,按照表是否存在主键,参数 o…...
使用Hugo和GitHub Pages创建静态网站个人博客
不需要服务器,不需要域名,不需要数据库,可以选择模版,内容为Markdown格式。 Hugo:https://gohugo.io 文档:https://gohugo.io/getting-started/quick-start/ 中文文档:https://www.gohugo.or…...
群晖系统证书延期
群晖系统默认证书过期了 接下来操作续期证书 一直下一步会让下载一个压缩包里面包含私钥和签发证书请求 下载后解压出来 在群晖里用证书续期 对以前的证书签署签发请求 选择刚刚解压出来的证书 执行完成后会下载一个压缩包,解压出来就会得到新证书 给群晖新增证书 选…...
android shader gl_Position是几个分量
在Android的OpenGL ES中,gl_Position是顶点着色器(Vertex Shader)的一个内置输出变量,它用于指定顶点在裁剪空间(Clip Space)中的位置。gl_Position是一个四维向量(4-component vectorÿ…...
JAVA练习-ArrayList数组
需求 建立3个Student类的实例 原始数组: public class Student {private String name;private int score;public Student(String name, int score) {this.name name;this.score score;}Overridepublic String toString() {return name "的分数࿱…...
springboot339javaweb的新能源充电系统pf(论文+源码)_kaic
毕 业 设 计(论 文) 题目:新能源充电系统的设计与实现 摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解…...
数据结构——排序第三幕(深究快排(非递归实现)、快排的优化、内省排序,排序总结)超详细!!!!
文章目录 前言一、非递归实现快排二、快排的优化版本三、内省排序四、排序算法复杂度以及稳定性的分析总结 前言 继上一篇博客基于递归的方式学习了快速排序和归并排序 今天我们来深究快速排序,使用栈的数据结构非递归实现快排,优化快排(三路…...
Jackson:Java对象和JSON字符串的转换处理库使用指南
Jackson介绍 Jackson 是一个非常流行的 Java JSON 处理库,它能够将 Java 对象与 JSON 字符串相互转换。 Jackson 工具主要用于将请求的参数(例如前端发送的 JSON 数据)和响应的数据(例如后端返回给前端的数据)转换成…...
mac maven编译出现问题
背景 进行maven install 命令,报错: [ERROR] COMPILATION ERROR : [INFO] ------------------------------------------------------------- [ERROR] No compiler is provided in this environment. Perhaps you are running on a JRE rather than a J…...
深入讲解Spring Boot和Spring Cloud,外加图书管理系统实战!
很抱歉,我的疏忽,说了这么久还没有给大家详细讲解过Spring Boot和Spring Cloud,那今天给大家详细讲解一下。 大家可以和下面这三篇博客一起看: 1、Spring Boot 和 Spring Cloud 微服务开发实践详解https://blog.csdn.net/speaking_me/artic…...
【AIGC】2023-ICCV-用于高保真语音肖像合成的高效区域感知神经辐射场
2023-ICCV-Efficient Region-Aware Neural Radiance Fields for High-Fidelity Talking Portrait Synthesis 用于高保真语音肖像合成的高效区域感知神经辐射场摘要1. 引言2. 相关工作3. 方法3.1 准备工作和问题设置3.2 三平面哈希表示3.3. 区域注意模块3.4 训练细节 4. 实验4.1…...
如何写一份优质技术文档
作者简介: 本文作者拥有区块链创新专利30,是元宇宙标准化工作组成员、香港web3标准工作组成员,参与编写《数据资产确权与交易安全评价标准》、《链接元宇宙:应用与实践》、《香港Web3.0标准化白皮书》等标准,下面提供…...
ML 系列:第 35 节 - 机器学习中的数据可视化
ML 系列:第 35 天 - 机器学习中的数据可视化 文章目录 一、说明二、数据可视化2.1 直方图2.2 箱线图2.3 散点图2.4 条形图2.5 线图2.6 热图 三、结尾 一、说明 描述性统计和数据可视化是理解和解释机器学习数据的基础。它们有助于总结和直观地呈现数据,…...
存储服务器一般做是做什么阵列?详细列举一下
存储服务器通常使用 RAID(Redundant Array of Independent Disks) 阵列技术来管理磁盘,以提高数据的性能、可靠性和可用性。所选择的 RAID 类型取决于存储服务器的具体用途和需求,比如性能要求、容量需求、容错能力等。 以下是存…...
uniapp使用扩展组件uni-data-select出现的问题汇总
前言 不知道大家有没有学习过我的这门课程那,《uniCloud云开发Vue3版本官方推荐用法》,这么课程已经得到了官方推荐,想要快速上手unicloud的小伙伴们,可以学习一下这么课程哦,不要忘了给一键三连呀。 在录制这门课程…...
pdf.js 预览pdf的时候发票数据缺失显示不全:字体加载出错(缺失)导致部分缺失
首先,排除后端返回的PDF文件流是没有问题的: 但是在vue项目中是这样的: 明显是显示不全,F12查看报错信息,有以下警告: pdf.js:2153 Warning: Error during font loading: The CMap “baseUrl” paramet…...
【设计模式】【结构型模式(Structural Patterns)】之外观模式(Facade Pattern)
1. 设计模式原理说明 外观模式(Facade Pattern) 是一种结构型设计模式,它提供了一个统一的接口,用来访问子系统中的一群接口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。通过隐藏子系统的复杂…...
Redis使用场景-缓存-缓存穿透
前言 之前在针对实习面试的博文中讲到Redis在实际开发中的生产问题,其中缓存穿透、击穿、雪崩在面试中问的最频繁,本文加了图解,希望帮助你更直观的了解缓存穿透😀 (放出之前写的针对实习面试的关于Redis生产问题的博…...
介绍 Apache Spark 的基本概念和在大数据分析中的应用
Apache Spark 是一个开源的大数据处理框架,它提供了快速、通用、可扩展的数据处理能力。Spark可以处理大规模数据集,并且在内存中进行数据操作,从而实现高速的数据处理和分析。 Spark的核心概念是弹性分布式数据集(Resilient Dis…...
OpenCPN-插件之Dashboard Tactics
1:相关链接Dashboard Tactics :: OpenCPN Dashboard Tactics Plugin rgleason/dashboard_tactics_pi: OpenCPN dashboard built-in plugin merger with external tactics_pi plugin NMEAconverter :: OpenCPN 2:显示样式 3:代码 这个插件…...
【LeetCode面试150】——20有效的括号
博客昵称:沈小农学编程 作者简介:一名在读硕士,定期更新相关算法面试题,欢迎关注小弟! PS:哈喽!各位CSDN的uu们,我是你的小弟沈小农,希望我的文章能帮助到你。欢迎大家在…...
JWT介绍和结合springboot项目实践(登录、注销授权认证管理)
目录 一、JWT介绍(一)基本介绍(二)jwt有哪些库1、jjwt(Java JWT)2、nimbus - jwt - jwt - api 和 nimbus - jwt - jwt - impl3、spring - security - jwt(已弃用,但在旧项目中有参考…...
Linux 下安装 Golang环境
Linux 下安装 Golang 获取Golang下载地址 安装 进入终端,登入root来到应用安装目录使用 wget 下载解压文件配置环境变量查看golang版本,测试是否配置成功GO设置代理环境变量 本篇教程 以 centos7 为环境基础 不使用软件包管理器安装,原因&am…...
「Mac畅玩鸿蒙与硬件36」UI互动应用篇13 - 数字滚动抽奖器
本篇将带你实现一个简单的数字滚动抽奖器。用户点击按钮后,屏幕上的数字会以滚动动画的形式随机变动,最终显示一个抽奖数字。这个项目展示了如何结合定时器、状态管理和动画实现一个有趣的互动应用。 关键词 UI互动应用数字滚动动画效果状态管理用户交…...
安装使用Ubuntu18.04超级大全集最初版(anaconda,pycharm,代理,c/c++环境)
本文介绍ubuntu1804中我目前用到的环境的完整配置,包括ubuntu安装软件,更新环境变量等都有涉及。图片非常多,能给的连接和材料都给了。希望能帮助到新同学。 目录 目录 目录 环境及镜像文件 安装Ubuntu 编辑 开机之后 编辑 更新…...
Redis设计与实现第16章 -- Sentinel 总结1(初始化、主从服务器获取信息、发送信息、接收信息)
Sentinel是Redis的高可用解决方案:由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主…...
ChatGPT科研应用、论文写作、课题申报、数据分析与AI绘图
随着人工智能技术的飞速发展,ChatGPT等先进语言模型正深刻改变着科研工作的面貌。从科研灵感的激发、论文的高效撰写,到课题的成功申报,乃至复杂数据的深度分析与可视化呈现,AI技术均展现出前所未有的潜力。其实众多科研前沿工作者…...
OceanBase数据库系列之:基于docker快速安装OceanBase数据库,基于linux服务器快速部署OceanBase数据库
OceanBase数据库系列之:基于docker快速安装OceanBase数据库,基于linux服务器快速部署OceanBase数据库 一、docker快速安装OceanBase数据库下载OceanBase数据库镜像查看镜像启动OceanBase数据库查看OceanBase数据库是否启动成功 二、基于linux部署OceanBa…...
无星的微前端之旅(四)——qiankun线上服务代理到本地
这个方式其实是我在上家公司的时候体验过,觉得确实很有意思。 所以这里来逆推一下实现方式。 解决了什么痛点 1.开发一个模块,需要启动2-3个项目 在微前端的开发过程中,如果我们要在主应用中看效果,我们至少需要启动一个主应用&am…...
鸿蒙进阶篇-Stage模型、UIAbility
“在科技的浪潮中,鸿蒙操作系统宛如一颗璀璨的新星,引领着创新的方向。作为鸿蒙开天组,今天我们将一同踏上鸿蒙基础的探索之旅,为您揭开这一神奇系统的神秘面纱。” 各位小伙伴们我们又见面了,我就是鸿蒙开天组,下面让我们进入今…...
快速上手:如何开发一个实用的 Edge 插件
在日常浏览网页时,背景图片能够显著提升网页的视觉体验。如果你也想为自己的浏览器页面添加个性化背景图片,并希望背景图片设置能够持久保存,本文将介绍如何通过开发一个自定义Edge插件来实现这一功能。我们将涵盖保存背景设置到插件选项页&a…...
java缓存技术点介绍
1. 缓存(Cache): • 缓存是指用于存储数据的临时存储区域,以便快速访问。在Java中,缓存通常用于存储频繁访问的对象、结果集或其他数据。 2. 缓存命中率(Cache Hit Ratio): • 缓存命…...
【单片机毕业设计12-基于stm32c8t6的智能称重系统设计】
【单片机毕业设计12-基于stm32c8t6的智能称重系统设计】 前言一、功能介绍二、硬件部分三、软件部分总结 前言 🔥这里是小殷学长,单片机毕业设计篇12-基于stm32c8t6的智能称重系统设计 🧿创作不易,拒绝白嫖可私 一、功能介绍 ----…...
音视频流媒体直播/点播系统EasyDSS互联网视频云平台介绍
随着互联网技术的飞速发展,音视频流媒体直播已成为现代社会信息传递与娱乐消费的重要组成部分。在这样的背景下,EasyDSS互联网视频云平台应运而生,它以高效、稳定、便捷的特性,为音视频流媒体直播领域带来了全新的解决方案。 1、产…...
3dtile平移子模型以及修改 3D Tiles 模型的模型矩阵z平移
第一段代码:应用平移变换到子模型 这段代码的目的是获取子模型的变换矩阵,并将其平移 10 个单位。 if (submodel) {// 获取当前子模型的变换矩阵let transform submodel.transform// 创建一个向上的平移矩阵,平移 10 个单位let translation…...
JavaScript中类数组对象及其与数组的关系
JavaScript中类数组对象及其与数组的关系 1. 什么是类数组对象? 类数组对象是指那些具有 length 属性且可以通过非负整数索引访问元素的对象。虽然这些对象看起来像数组,但它们并不具备真正数组的所有特性,例如没有继承 Array.prototype 上…...
【机器学习】机器学习学习笔记 - 监督学习 - 逻辑回归分类朴素贝叶斯分类支持向量机 SVM (可分类、可回归) - 04
逻辑回归分类 import numpy as np from sklearn import linear_modelX np.array([[4, 7], [3.5, 8], [3.1, 6.2], [0.5, 1], [1, 2], [1.2, 1.9], [6, 2], [5.7, 1.5], [5.4, 2.2]]) y np.array([0, 0, 0, 1, 1, 1, 2, 2, 2])# 逻辑回归分类器 # solver:求解器&a…...
Python脚本文件开头两行#!/usr/bin/python和# -*- coding: utf-8 -*-的作用
Linux环境下,Python脚本代码文件,比如test.py,文件的第一行一般要指定解释器,使用Linux的Shebang的形式指定,第二行一般指定编码格式。 首行指定解释器工具,使用方式如下: # 第1种方式&#x…...
使用PyQt5开发一个GUI程序的实例演示
一、安装Python 下载安装到这个目录 G:\Python38-32 安装完成有这些工具,后面备用: G:\Python38-32\Scripts\pyrcc5.exe G:\Python38-32\Scripts\pyuic5.exe 二、PyQt环境配置 pip install PyQt5 pip install pyqt5-tools 建议使用国内源,…...
3d扫描建模产品开发-三维扫描检测蓝光检测
现当下,汽车制造、航空航天,还是消费电子、医疗器械,三维扫描检测与蓝光技术正以前所未有的精度和效率,推动着产品从概念到实物的快速转化。 三维扫描技术,简而言之,就是通过激光、结构光(如蓝…...
多线程——01
1. 进程/任务 process/task 进程是操作系统对一个正在运行的程序的一种抽象,换言之,可以把进程看做程序的一次运行过程 每个进程想要执行,都需要消耗一定的系统资源(硬件资源) 1)进程在系统中的作用 a…...
Makefile中-D选项定义预编译处理宏
1.简单示例假设我们有一个简单的 C 程序main.c,内容如下: #include <stdio.h> #ifdef DEBUGvoid print_debug_info() {printf("This is debug information.\n");} #elsevoid print_debug_info() {} #endif int main() {print_debug_info();printf("Prog…...