网站高可用架构设计基础——高可用策略和架构原则
一、正面保障与减少损失
要想让系统能够稳定可用,首先要考虑如何避免问题的发生。比如说可以通过 UPS(不间断电源)来避免服务器断电,可以通过事先增加机器来解决硬件资源不足的问题。
然后,如果问题真的发生了,就要考虑怎么转移故障(Failover)。比如说可以 通过冗余部署,当一个节点发生故障时,用其它正常的节点来代替问题节点。如果故障无法以正面的方式解决,就要努力降低故障带来的影响。比如说流量太大,可以通过限流,来保证部分用户可以正常使用,或者通过业务降级的手段,关闭一些次要 功能,保证核心功能仍旧可用。最后是要快速恢复系统。要尽快找到问题的原因,然后修复故障节点,使系统恢复到正常状态。
处理线上事故的首要原则是先尽快恢复业务,而不是先定位系统的问 题,再通过解决问题来恢复系统。因为这样做往往比较耗时,这里给出的处理顺序也体现了 这个原则。
1.正面保障
(1)冗余无单点——节点本身的故障
①单节点故障点
网络链路,服务端网络;
DNS;
机房;
机架,同机房的一批机器;
交换机/路由器;
负载均衡;
物理服务器;
业务服务本身;
缓存 / 数据库 / 存储。
②解决方法
首先要保证系统的各个节点在部署时是冗余的,没有单点。比如在接入层中,可以实现负载均衡的双节点部署,这样在一个节点出现问题时,另一个节点可以快速接管,继续提供服务。还有远程网络通信,它会涉及到很多节点,也很容易会出现问题,就可以提供多条通信 线路,比如移动 + 电信线路,当一条线路出现问题时,系统就可以迅速切换到另一条线 路。甚至可以做到机房层面的冗余,通过系统的异地多 IDC 部署,解决自然灾害(如地 震、火灾)导致的系统不可用问题。
- 在服务逻辑层采用多运营商多IP入口、跨地&同地多机房部署、同机房多机器部署、分布式任务调度等策略。
- 在数据存储层采用数据库分库分表、数据库主从备集群、KV存储&消息等分布式系统集群多副本等策略。
- 有分布式处理能力后,需要考虑单个服务器故障后自动探活摘除、服务器增删能不停服自动同步给依赖方等问题,这里就需引入一些分布式中枢控制系统,如服务注册发现系统、配置变更系统等,例如zookeeper是一个经典应用于该场景的一个分布式组件。
(2)水平扩展——节点处理能力的不足
很多时候,系统的不可用都是因为流量引起的:在高并发的情况下,系统往往会整体瘫痪, 完全不可用。由于硬件在物理上存在瓶颈,通过硬件 升级(垂直扩展)一般不可行,需要通过增加机器数量,水平扩展这些节点的处理能 力。对于无状态的计算节点,比如应用层和服务层来说,水平扩展相对容易,直接增加机器 就可以了;而对于有状态的节点,比如数据库,可以通过水平分库做水平扩展,不过这 个需要应用一起配合,做比较大的改造。
- 提前预测大流量,提前扩容
- 实现流量变大,自动扩容
(3)分散、均衡、隔离原则
- 分散原则(核心):鸡蛋不要放一个篮子,分散风险
-
- 例如:所有交易数据都放在同一个库同一张表里面,万一这个库挂了,此时影响
- 均衡原则(核心):均匀分散风险,避免不均衡
-
- 最好N份中的每份都是均衡的;避免某个份额过大,否则过大的那份一有问题就影响范围过大了。例如:xx应用集群有1000台,但由于引流组件BUG,导致所有流量引到了其中100台上面,导致负载严重不均衡,最后因负载无法扛着全面崩溃。类似重大故障已经发生了多次。
- 隔离原则(核心):控制风险不扩散,不放大
-
- 每份之间是相互隔离的;避免一份有问题影响其他的也有问题,传播扩散了影响范围。例如:交易数据拆分成10库100表,但是部署在同一台物理机上;万一某张表有一条大SQL把网卡打满了,那10库100表都会受影响。
- 对于请求量大的客户进行隔离,分散到一个单独的库
2.减少损失
(1)柔性事务——基本可用和数据的最终一致
系统的可用性经常会和数据的一致性相互矛盾。在 CAP 理论中,系统的可用 性、一致性和网络容错性,三个最多只能保证两个,在分布式系统的情况下,只能在 C 和 A 中选一个。在很多业务场景中,系统的可用性比数据的实时一致性更重要,所以在实践中,更多地 使用 BASE 理论来指导系统设计。
资金交易类系统要仔细考虑资损的风险.交易系统对于数据准确性、一致性、资金损失等都是很敏感的,这一块在是否使用缓存、事务一致性考量、数据时延、数据不丢不重、数据精准核对和恢复等需要额外架构设计考量。仔细评估交易以及营销的全链路各个环节,评估其中出现资损的可能性以及做好应对设计,例如增加多层级对账、券总额度控制、异常金额限制和报警等资损防控的考量等。不同层次不同维度不同时间延迟的对账以及预案是一个重要及时感知资损和止血的有效方式。全链路的过程数据要做好尽可能持久化和冗余备份,方便后续核对以及基于过程数据进行数据修复,同时尽量针对特殊数据丢失场景提供快速自动化修复处理预案(如交易消息可选择性回放和基于幂等原则的重新消费)。
(2)系统可降级——损失非核心功能来保证核心功能的可用
能不依赖的,尽可能不依赖,弱依赖原则:一定要依赖的,尽可能弱依赖。
对于稳定性要求很好的关键系统,在成本可接受的情况下,同时维护一套保障主链路可用的备用系统和架构,在核心依赖服务出现问题能做一定时间周期的切换过渡(例如mysql故障,阶段性使用KV数据库等),例如钉钉IM消息核心系统就实现对数据库核心依赖实现一套一定周期的弱依赖备案,在核心依赖数据库故障后也能保障一段时间消息收发可用。
当系统问题无法在短时间内解决时,就要考虑尽快止损,为故障支付尽可能小的代价。具体的解决手段主要有以下这几种。
- 限流:让部分用户流量进入系统处理,其它流量直接抛弃。
- 降级:系统抛弃部分不重要的功能,比如不发送短信通知,以此确保核心功能不受影 响。
- 超时:避免调用端陷入永久阻塞。
- 熔断:我们不去调用出问题的服务,让系统绕开故障点,就像电路的保险丝一样,自己 熔断,切断通路,避免系统资源大量被占用。比如,用户下单时,如果积分服务出现问 题,我们就先不送积分,后续再补偿。
- 功能禁用:针对具体的功能,设置好功能开关,让代码根据开关设置,灵活决定是 否执行这部分逻辑。比如商品搜索,在系统繁忙时,我们可以选择不进行复杂的深度搜索。
(3)自愈 Self-healing
自我修复可以帮助恢复应用程序。自愈是指应用程序可以做一些必要的步骤来恢复崩溃状态。在大多数情况下,这样的操作是经由一个外部系统来实现的,它会监控实例的健康,并在它们较长时间处于错误状态的情况下,重新启动应用程序。自愈是非常有用的,但是在某些情况下,不断地重启应用程序会引起麻烦。由于负载过高或者数据库连接超时,你的应用程序不停的重启,会导致无法提供一个正确的健康状态。实现一种为微妙的情况而准备的高级自我修复解决方案,可能会很棘手,比如数据库连接丢失。在这种情况下,你需要为应用程序添加额外的逻辑来处理一些极端情况,并让外部系统知道不需要立即重启实例。
二、研发流程
1.运维策略
- 可灰度:保障及时在小流量情况,发现问题,避免引发大范围故障。因此在做系统任何变更时,要考虑灰度方案,特别是大用户流量系统。灰度方式可能有白名单用户、按用户Id固定划分后不同流量比例、机器分批发布、业务概念相关分组分比例(例如某个行业、某个商品、某类商品)等,灰度周期要和结合系统风险和流量做合适设计,重要系统灰度周期可能持续超过一周或更多。
- 可监控:通过监控,我们可以实时地了 解系统的当前状态,这样很多时候,业务还没出问题,就可以提前干预,避免事故;而 当系统出现问题时,我们也可以借助监控信息,快速地定位和解决问题。
- 可回滚:相同的版本可以反复发布,新增功能增加配置开关,当线上出现问题时,可通过关闭功能开关,快速下线最新升级 或部分有问题功能。针对不同出错场景,有配置驱动一些预案,例如降级对某个服务的依赖、提供合适功能维护中公告、切换到备用服务等预案,在特定问题出现时,可以快速做线上止损和恢复。发布功能注意提前考虑出现问题时快速回滚步骤,部分经常发布注意对回滚步骤做演练。
- 可转移:需要具备故障转移能力
-
- 接入层:DNS、VipServer、SLB。
- 服务层:服务发现 + 健康检查 + 剔除机制。
- 应用层:无状态设计(Stateless),便于随时和快速切换。
- 密闭性。所谓密闭性(Hermetic),简单说就是环境的完整性。比如,软件的源代码必须是密闭的,每次通过特定的版本号,检出内容必须是完整的,一致 的且可重复的。编译的时候不需要再去任何第三方额外检出外部依赖的源代码。再比如,从构建过程来说,同样必须确保一致性和可重复性。让两个工程师在两台不同的机 器上基于同一个源代码版本构建同一个产品,构建结果应该是相同的。这意味着它不应该受 构建机器上安装的第三方类库或者其他软件工具所影响。构建过程需要指定版本的构建工 具,包括编译器,同时使用指定版本的依赖库(第三方类库)。编译过程是自包含的,不依 赖于编译环境之外的任何其他服务。
2.团队研发运维流程机制
- 技术Review:不同体量设计安排经验更加丰富同学Review,架构师、主管、外部架构师的Review、定期系统整体Review等。
- 代码Code Review:建立规范和标准,通过CR认证合格同学执行code review动作。
- 单测:不同风险的系统设定尽量高的行覆盖 & 分支覆盖率标准,复杂逻辑类追求100%分支覆盖。
- 回归测试:持续积累回归用例,在上线前和上线后执行回归动作;上线前线上引流测试也是一种模拟测试方式,端类型系统还可以用monkey工具做随机化测试。
- 发布机制:设计发布准入和审批流程,确保每次上线发布都是经过精细设计和审核的(记录系统的任何一次发布和变化),上线过程要做到分批、灰度、支持快速回滚、线上分批观察(日志确认)、线上回归等核心动作。建立发布红线等机制,不同系统设计合适发布时段以及发布灰度观察周期。关于配置修改的时机也应该详细考虑,列在发布流程之中。
-
- 自动化运行单元测试案例(unit test);
- 单元测试覆盖率检查(code coverage);
- 静态代码质量检查(lint);
- 人工的代码互审(code review);
- 无感发布:先让服务从注册中心中下掉,但是java进程先不kill掉
- 团队报警值班响应机制 (报警群、短信、电话):确保报警有合适人员即时响应处理,团队层面可定期做数据性统计通报,同时建立主管或架构师兜底机制。
- 定期排查线上隐患:定期做线上走查和错误日志治理、告警治理,确保线上小的隐患机制化发现和修复。例如在钉钉针对企业用户早晚高峰的特点,设计早值班机制,用于高峰期第一时间应急以及每天专人花一定时间走查线上,该机制在钉钉技术团队持续践行多年,有效发现和治理了钉钉各个线上系统的隐患。
- 用户问题处理机制:Voc日清、周清等。在钉钉也经历Voc周清到日清的持续机制精进。
- 线上问题复盘机制:天内、周内问题及时复盘,确保针对每个线上问题做系统和团队精进。
- 代码质量抽查通报:定期抽查团队同学代码,做评估和通晒,鼓励好的代码,帮助不好代码的改善。
- 成立稳定性治理专门topic:合适同学每周做好稳定性过程和精进。
- 定期压测机制:定期机制化执行,核查线上容量情况。
- 日常演练机制:预案演练,模拟线上故障的不通知的突袭演练提升团队线上问题应对能力。
- 错误日志要重视.要定期分析线上错误日志,隐患的问题是藏在错误日志中的。我们现在技术团队会有早值班机制,每个方向每天都有一个技术同学走查线上,以发现线上隐患问题为导向,走查监控大盘、错误日志、用户反馈,通过这个例行机制,很好地防微杜渐。
- 异常一定要消灭:有异常,基本就意味着系统存在风险,一定要消灭异常;与终端用户相关的异常,要以最高优先级处理:即便是 IT 研发,也要以用户为中心。不是所有的异常都要从 Log 中消失,但对于保留下的异常,一定提交管理层进行审批,说明保留原因;理由不够充分的,需要按排期规划并解决。
- 异常一定要管理:消灭异常是个长期工程,短期要通过管理行为来进行控制;每个异常都要有具体的负责人:没有和具体的负责人一一对应,往往就意味着管理流于形式;异常也应该企业内部形成规范,不可以各个系统不一致。(最好企业内部有一个专门的异常识别及管理的网站)
流程机制要和团队同学共创达成一致后,配合建立topic负责人机制,对流程机制执行度和执行效果要做好过程监测和通晒,建立明确数字化标准和衡量机制(例如钉钉技术团队针对线上问题设定1-5-10标准,1分钟响应5分钟内定位10分钟内恢复),同时建立对应奖惩机制。流程机制也要根据系统状态进行精简或精进,确保流程机制可执行性和生命力。要确保在发布过程中,只有指定的人才能执行指定的操作,而不能随随便便跳过必要的环节 进行发布。
3.发布检查列表
(1)容量规划相关
- 本次发布是否与新闻发布会、广告、博客文章或者其他类型的推广活动有关?
- 发布过程中以及发布之后预计的流量和增速是多少?
- 是否已经获取到该服务需要的全部计算资源?
(2)故障模式相关
针对服务进行系统性的故障模式分析可以确保发布时服务的可靠性。在检查列表的这一部分中,我们可以检查每个组件以及每个组件的依赖组件来确定当它们发 生故障时的影响范围
- 该服务是否能够承受单独物理机故障?单数据中心故障?网络故障?
- 如何应对无效或者恶意输入,是否有针对拒绝服务攻击(DoS)的保护?
- 是否已经支持过载保护?
- 如果某个依赖组件发生故障,该服务是否能够在降级模式下继续工作?
- 该服务在启动时能否应对某个依赖组件不可用的情况?在运行时能否处理依赖不可用和 自动恢复情况?
(3)客户端行为相关
最常见的客户端滥发请求的行为,是配置更新间隔的设置问题。比 如,一个每 60s 同步一次的新客户端,会比 600s 同步一次的旧客户端造成 10 倍的负载。重试逻辑也有一些常见问题会影响到用户触发的行为,或者客户端自动触发的行为。假设我 们有一个处于过载状态的服务,该服务由于过载,某些请求会处理失败。如果客户端重试这 些失败请求,会对已经过载的服务造成更大负载,于是会造成更多的重试,更多的负载。客
户端这时应该降低重试的频率,一般需要增加指数型增长的重试延迟,同时仔细考虑哪些错 误值得重试。例如,网络错误通常值得重试,但是 4xx 错误(这一般意味着客户端侧请求 有问题)一般不应该重试。
自动请求的同步性往往还会造成惊群效应。例如,某个手机 APP 开发者可能认为夜里 2 点 是下载更新的好时候,因为用户这时可能在睡觉,不会被下载影响。然而,这样的设计会造 成夜里 2 点时有大量请求发往下载服务器,每天晚上都是如此,而其他时间没有任何请 求。这种情况下,每个客户端应该引入一定随机性。
其他的一些周期性过程中也需要引入随机性。回到之前说的那个重试场景下:某个客户端发 送了一个请求,当遇到故障时,1s 之后重试,接下来是 2s、4s 等。没有随机性的话,短 暂的请求峰值可能会造成错误比例升高,这个周期会一直循环。为了避免这种同步性,每个 延迟都需要一定的抖动,也就是加入一定的随机性
- 客户端在请求失败之后,是否按指数型增加重试延时?
- 是否在自动请求中实现随机延时抖动?
(4)流程与自动化相关
虽然鼓励自动化,但是对于发布这件事情来说,完全自动化 是灾难性的。为了保障可靠性,我们应该尽量减少发布流程中的单点故障源,包括人在内。这些流程应该在发布之前文档化,确保在工程师还记得各种细节的时候就完全转移到文档 中,这样才能在紧急情况下派上用场。流程文档应该做到能使任何一个团队成员都可以在紧 急事故中处理问题。
- 是否已将所有需要手动执行的流程文档化?
- 是否已将构建和发布新版本的流程自动化?
(5)外部依赖相关
有时候某个发布过程依赖于某个不受公司控制的因素。尽早确认这些 因素的存在可以使我们为它们的不确定性做好准备。例如,服务依赖于第三方维护的一个类库,或者另外一个公司提供的服务或者数据。当第三 方提供商出现故障、Bug、系统性的错误、安全问题,或者未预料到的扩展性问题时,尽早 计划可以使我们有办法避免影响到直接用户。
- 这次发布依赖哪些第三方代码、数据、服务,或者事件?
- 是否有任何合作伙伴依赖于你的服务?发布时是否需要通知他们?
- 当我们或者第三方提供商无法在指定截止日期前完成工作时,会发生什么?
4.高可用执行策略
相关文章:
网站高可用架构设计基础——高可用策略和架构原则
一、正面保障与减少损失 要想让系统能够稳定可用,首先要考虑如何避免问题的发生。比如说可以通过 UPS(不间断电源)来避免服务器断电,可以通过事先增加机器来解决硬件资源不足的问题。 然后,如果问题真的发生了&#…...
从入门到精通【MySQL】视图与用户权限管理
文章目录 📕1. 视图✏️1.1 视图的基本概念✏️1.2 试图的基本操作🔖1.2.1 创建视图🔖1.2.2 使用视图🔖1.2.3 修改数据🔖1.2.4 删除视图 ✏️1.3 视图的优点 📕2. 用户与权限管理✏️2.1 用户🔖…...
使用QML Tumbler 实现时间日期选择器
目录 引言相关阅读项目结构示例实现与代码解析示例一:时间选择器(TimePicker)示例二:日期时间选择器(DateTimePicker) 主窗口整合运行效果总结下载链接 引言 在现代应用程序开发中,时间与日期选…...
[golang] 介绍 | 特点 | 应用场景
“编程不仅仅是写代码,更是一种思考方式。” 参考资料 《Unix编程环境》- Brian W. Kernighan, Rob Pike《程序设计实践》- Brian W. Kernighan, Rob PikeGo语言官方网站:https://golang.orgRob Pike的个人博客:http://herpolhode.com/rob/ …...
Python 爬虫实战 | 企名科技
文章目录 一、企名科技1、目标网站2、网站特点3、确定解密位置4、扣js代码 一、企名科技 1、目标网站 网址:https://wx.qmpsee.com/articleDetail?idfeef62bfdac45a94b9cd89aed5c235be目标数据:获取消费行业研究下面的13篇文章数据 2、网站特点 服…...
c加加学习之day06->STL标准库->day01
1.介绍:C 标准模板库(Standard Template Library,简称 STL)是一组泛型编程的模板类和函数,旨在提供常用的数据结构、算法和函数对象。STL 是 C 标准库的一部分,极大地提高了编程效率和代码的可重用性。STL …...
并发设计模式实战系列(6):读写锁
🌟 大家好,我是摘星! 🌟 今天为大家带来的是并发设计模式实战系列,第六章读写锁模式,废话不多说直接开始~ 目录 一、核心原理深度拆解 1. 读写锁三维模型 2. 关键实现原理 二、生活化类比&am…...
【网络原理】从零开始深入理解TCP的各项特性和机制.(一)
本篇博客给大家带来的是网络原理的相关知识.其中传输层这一部分非常重要,面试中只要是涉及到网络这一部分知识,几乎是必定会考传输层TCP的. 🐎文章专栏: JavaEE初阶 🚀若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给…...
基于Pytorch的深度学习-第二章
2.1 CIFAR-10数据集简介 CIFAR-10数据集包含10个类别:plane、car、bird、cat、deer、dog、frog、horse、ship、truck,每个类别有6000张图片。其中训练集图片有50000张,测试集有10000张图片。训练集和测试集的生成方法是,分别从每…...
gitlab-ce容器镜像源(国内)
下载命令 docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/gitlab/gitlab-ce:17.10.4-ce.0 更多参考: https://docker.aityp.com/image/docker.io/gitlab/gitlab-ce:17.10.4-ce.0...
TinyVue v3.22.0 正式发布:深色模式上线!集成 UnoCSS 图标库!TypeScript 类型支持全面升级!
我们非常高兴地宣布,2025年4月7日,TinyVue发布了v3.22.0🎉。 本次 3.22.0 版本主要有以下重大变更: 支持深色模式增加基于 UnoCSS 的图标库更丰富的 TypeScript 类型声明支持 XSS 配置 详细的 Release Notes 请参考:…...
Browser-Use WebUI:让AI自动使用浏览器帮你查询信息执行任务
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
使用PyTorch如何配置一个简单的GTP
目录 一、什么是GPT 1. Transformer Block 的核心结构 2. 关键组件解析 (1) 掩码多头自注意力(Masked Multi-Head Self-Attention) (2) 前馈神经网络(FFN) (3) 层归一化(LayerNorm&…...
【FAQ】针对于消费级NVIDIA GPU的说明
概述 本文概述 HP Anyware 在配备消费级 NVIDIA GPU 的物理工作站上的关键组件、安装说明和重要注意事项。 注意:本文档适用于 NVIDIA 消费级 GPU。NVIDIA Quadro 和 Tesla GPU 也支持 HP Anyware 在公有云、虚拟化或物理工作站环境中运行。请参阅PCoIP Graphi…...
02_java的运行机制以及JDKJREJVM基本介绍
1、运行机制 2、JDK&JRE&JVM JDK 基本介绍 (1) JDK 的全称(Java Development Kit Java开发工具包) JDK JRE java的开发工具 [ java, javac, javadoc, javap等 ] (2)JDK是提供给Java开发人员使用的,其…...
go 的 net 包
目录 一、net包的基本功能 1.1 IP地址处理 1.2 网络协议支持 1.3 连接管理 二、net包的主要功能模块 2.1 IP地址处理 2.2 TCP协议 2.3 UDP协议 2.4 Listener和Conn接口 三、高级功能 3.1 超时设置 3.2 KeepAlive控制 3.3 获取连接信息 四、实际应用场景 4.1 Web服…...
ShenNiusModularity项目源码学习(21:ShenNius.Admin.Mvc项目分析-6)
菜单列表页面用于新建、维护及删除系统所有模块所需的菜单信息,包括菜单名称、菜单中的按钮、菜单关联的后台服务地址及请求方式等。菜单列表页面的后台控制器类MenuController位于ShenNius.Admin.Mvc项目的Areas\Sys\Controllers内,页面文件位于同项目的…...
基于单片机的游泳馆智能管理系统
标题:基于单片机的游泳馆智能管理系统 内容:1.摘要 随着人们生活水平的提高,游泳馆的规模和客流量不断增大,传统的管理方式已难以满足高效、便捷的管理需求。本研究的目的是设计并实现一种基于单片机的游泳馆智能管理系统。方法上,采用单片机…...
开发了一个b站视频音频提取器
B站资源提取器-说明书 一、功能说明 本程序可自动解密并提取B站客户端缓存的视频资源,支持以下功能: - 自动识别视频缓存目录 - 将加密的.m4s音频文件转换为标准MP3格式 - 将加密的.m4s视频文件转换为标准MP4格式(合并音视频流)…...
vue2项目,为什么开发环境打包出来的js文件名是1.js 2.js,而生产环境打包出来的是chunk-3adddd.djncjdhcbhdc.js
Vue2项目开发环境与生产环境JS文件名差异的核心原理及配置逻辑如下: 一、文件名差异的底层机制 1、Webpack默认命名策略 开发环境默认禁用哈希,采用[id].js命名规则(如1.js),生产环境启用[chunkhash]生成chunk-xxx…...
SQL进阶知识:六、动态SQL
今天介绍下关于动态SQL的详细介绍,并结合MySQL数据库提供实际例子。 动态SQL是指在运行时动态构建和执行SQL语句的技术。这种技术在处理复杂的查询逻辑、参数化查询或在某些情况下需要根据用户输入动态调整查询时非常有用。MySQL支持动态SQL,主要通过PRE…...
Spring Boot常用注解详解:实例与核心概念
Spring Boot常用注解详解:实例与核心概念 前言 Spring Boot作为Java领域最受欢迎的快速开发框架,其核心特性之一是通过注解(Annotation)简化配置,提高开发效率。注解驱动开发模式让开发者告别繁琐的XML配置ÿ…...
java 富文本转pdf
前言: 本文的目的是将传入的富文本内容(html标签,图片)并且分页导出为pdf。 所用的核心依赖为iText7。 因为itextpdf-core的核心包在maven中央仓库中,阿里云华为云等拉不下来,中央仓库在外网,并且此包在中央仓库中未…...
17.第二阶段x64游戏实战-人工遍历二叉树结构
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 上一个内容:16.第二阶段x64游戏实战-分析二叉树结构 上一个内容里把二叉树的结构写了写&am…...
C#基于Sunnyui框架和MVC模式实现用户登录管理
C#基于Sunnyui框架和MVC模式实现用户登录管理 1 Controller1.1 UserManagementController.cs(控制器入口) 2 Model2.1 UserRepository.cs(用户管理模型)2.2 User.cs(用户结构体)2.3 SQLiteHelper.cs&#x…...
Spring Boot实战(三十六)编写单元测试
目录 一、什么是单元测试?二、Spring Boot 中的单元测试依赖三、举例 Spring Boot 中不同层次的单元测试3.1 Service层3.2 Controller 层3.3 Repository层 四、Spring Boot 中 Mock、Spy 对象的使用4.1 使用Mock对象的背景4.2 什么是Mock对象,有哪些好处…...
声音分离人声和配乐-从头设计数字生命第4课——仙盟创梦IDE
音频分离在数字人中具有多方面的重要作用,主要体现在以下几个方面: 提高语音合成质量:通过音频分离,可以将原始音频中的语音部分与其他背景噪音或干扰声音分离开来。这样在进行语音合成时,能够获得更纯净的语音信号&am…...
http协议、全站https
一、http协议 1、为何要学http协议? 用户用浏览器访问网页,默认走的都是http协议,所以要深入研究web层,必须掌握http协议 2、什么是http协议 1、全称Hyper Text Transfer Protocol(超文本传输协议) ### 一个请求得到一个响应包 普通…...
Mediamtx与FFmpeg远程与本地推拉流使用
1.本地推拉流 启服 推流 ffmpeg -re -stream_loop -1 -i ./DJI_0463.MP4 -s 1280x720 -an -c:v h264 -b:v 2000k -maxrate 2500k -minrate 1500k -bufsize 3000k -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/stream 拉流 ffplay -rtsp_transport tcp rtsp://43.136.…...
css3新特性第七章(3D变换)
css新特性第七章(3D变换) 一、3d空间和景深 元素进行 3D 变换的首要操作:父元素必须开启 3D 空间! 使用 transform-style 开启 3D 空间,可选值如下: flat : 让子元素位于此元素的二维平面内( 2D 空间&…...
redis经典问题
1.缓存雪崩 指缓存同一时间大面积的失效,所以,后面的请求都会落到数据库上,造成数据库短时间内承受大量请求而崩掉。 解决方案: 1)Redis 高可用,主从哨兵,Redis cluster,避免全盘崩…...
数据仓库是什么?数据仓库架构有哪些?
目录 数据仓库是什么?数据仓库架构有哪些? 一、数据仓库是什么? 二、数据仓库的架构分层 1. 获取层 2. 数据层 3. 应用层 4. 访问层 三、数据仓库的价值体现 1.决策支持 2.业务优化 3.提升竞争力 四、数据仓库的未来发展趋势 总…...
Nginx 通过 Let‘s Encrypt 实现 HTTPS 访问全流程指南
一、Let’s Encrypt 与 Certbot 简介 Let’s Encrypt 是由非营利组织 ISRG 运营的免费证书颁发机构(CA),旨在推动 HTTPS 的普及。其核心工具 Certbot 能自动化完成证书申请、部署与续期,大幅降低 HTTPS 的配置复杂度。通过 Certb…...
网络知识:路由器静态路由与动态路由介绍
目录 一、静态路由 1.1 什么是静态路由? 1.2 静态路由的好处 1.3 静态路由的局限 1.4 静态路由应用场景 微型办公室网络 性能要求高业务流量 安全性要求高的环境 二、动态路由 2.1 什么是动态路由? 2.2 动态路由的好处 2.3 动态路由的局限 2.4 动态路由的应用场…...
LLaMA3微调全流程:从LoRA到QLoRA,7B参数模型推理速度提升4倍的代码实战
LLaMA3微调全流程:从LoRA到QLoRA,7B参数模型推理速度提升4倍的代码实战 发现了一个巨牛的人工智能学习网站,分享一下给大家!https://www.captainbed.cn/ccc 前言 在大模型时代,LLaMA系列作为开源社区的明星模型&#…...
日内组合策略思路
一、策略概述 本策略是一种针对日内交易设计的策略,其核心在于通过识别市场趋势和突破信号,结合动态止损和止盈机制,实现日内交易的盈利。策略以金字塔式的加仓方式控制风险,并通过灵活的平仓策略锁定收益。 二、交易逻辑思路 市场…...
从空气污染监测到嵌入式仿真教学:基于STM32与MQ135的实践探索
一、嵌入式系统在环境监测中的技术演进 随着全球城市化进程加速,世界卫生组织(WHO)数据显示,92%的人口长期暴露于超标PM2.5环境中。在此背景下,基于STM32微控制器的智能监测系统因其高性价比(单节点成本低…...
【数据结构】Map与Set结构详解
数据结构系列五:Map与Set(一) 一、接口的实现 1.方法上 2.成员上 二、Map的内外双接口结构 1.实现 1.1外部Map接口的实现 1.1.1临摹整体 1.1.2外部类实现整体 1.2内部Entry接口的实现 1.2.1临摹内部 1.2.2内部类实现内部 2.关系 3.意义 3.1逻辑内聚 …...
银河麒麟(内核CentOS8)安装rbenv、ruby2.6.5和rails5.2.6
一、安装 rbenv 和 ruby-build 1.安装 rbenv git clone https://github.com/rbenv/rbenv.git ~/.rbenv 2. 添加 rbenv 到 PATH echo export PATH"$HOME/.rbenv/bin:$PATH" >> ~/.bashrc echo eval "$(rbenv init -)" >> ~/.bashrc source ~…...
豆包桌面版 1.47.4 可做浏览器,免安装绿色版
自己动手升级更新办法: 下载新版本后安装,把 C:\Users\用户名\AppData\Local\Doubao\Application 文件夹的文件,拷贝替换 DoubaoPortable\App\Doubao 文件夹的文件,就升级成功了。 再把安装的豆包彻底卸载就可以。 桌面版比网页版…...
Linux 命令行与 vi/vim 编辑器完全指南
一、Linux 命令行基础 (一)命令与命令行简介 命令:Linux 系统内置的操作指令,以字符化形式使用,用于指示系统执行特定任务。 命令行(终端):提供字符化的操作界面,用户通…...
海量聊天消息处理:ShardingJDBC分库分表、ClickHouse冷热数据分离、ES复合查询方案、Flink实时计算与SpringCloud集成
海量聊天消息处理:ShardingJDBC分库分表、ClickHouse冷热数据分离、ES复合查询方案、Flink实时计算与SpringCloud集成 一、背景介绍 每天有2000万条聊天消息,一年下来几千万亿海量数据。为应对这种规模的数据存储和处理需求,本文将从以下几…...
金融系统上云之路:云原生后端架构在金融行业的演化与实践
📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:为什么金融行业也要“云原生”? 金融行业素来以“安全第一、稳定优先”著称,面对每日亿级交易请求、秒级风控响应、PB级数据处理,系统稳定性和性能要求极高。长期以来,大型金融机构往…...
每日c/c++题 备战蓝桥杯 ([洛谷 P1226] 快速幂求模题解)
[洛谷 P1226] 快速幂求模题解 📌 题目链接 https://www.luogu.com.cn/problem/P1226 📝 题目描述 给定正整数 a、b 和质数 p,要求计算: a^b % p其中: 1 ≤ a ≤ 10^90 ≤ b ≤ 10^92 ≤ p ≤ 10^9 💡…...
深度学习小记(包括pytorch 还有一些神经网络架构)
这个是用来增加深度学习的知识面或者就是记录一些常用的命令,会不断的更新 import torchvision.transforms as transforms toPIL transforms.ToPILImage()#可以把tensor转换为Image类型的 imgtoPIL(img) #利用save就可以保存下来 img.save("/opt/data/private/stable_si…...
Spring Boot默认缓存管理
Spring框架支持透明地向应用程序添加缓存,以及对缓存进行管理,其管理缓存的核心是将缓存应用于操作数据的方法,从而减少操作数据的执行次数,同时不会对程序本身造成任何干扰。Spring Boot继承了Spring框架的缓存管理功能ÿ…...
倚光科技:微透镜阵列低成本加工新范式
在光通信、机器视觉、生物医学成像等前沿领域,微透镜阵列凭借其独特的光学特性成为不可或缺的核心部件。然而,传统加工方式往往面临成本高、效率低、精度难控等困境。倚光科技深耕光学加工领域多年,创新运用单点金刚石车床技术,成…...
Vue+Flask豆瓣LSTM影评+推荐算法大数据可视化平台深度学习系统源码
文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 关注B站,有好处! 编号: F011 视频介绍 VueFlask豆瓣LSTM影评推荐算法大数据可视化平台深度学习系统源码(2023重制) 1…...
【MySQL】基本查询
目录 增加 查询 基本查询 where子句 结果排序 筛选分页结果 修改(更新) 删除 普通删除 截断表 插入查询结果 聚合函数 分组查询 这一节的内容是对表内容的增删查改,其中重点是表的查询 增加 语法: INSERT [INTO] table_name [(column [, …...
hive默认的建表格式
在 Hive 中创建表时,默认的建表语法格式如下: CREATE TABLE table_name (column1_type,column2_type,... ) ROW FORMAT DELIMITED FIELDS TERMINATED BY , STORED AS TEXTFILE;在这个语法中: CREATE TABLE table_name:指定要创建…...