万字长文深入浅出负载均衡器
前言
本篇博客主要分享Load Balancing(负载均衡),将从以下方面循序渐进地全面展开阐述:
- 介绍什么是负载均衡
- 介绍常见的负载均衡算法
负载均衡简介
初识负载均衡
负载均衡是系统设计中的一个关键组成部分,它有助于将传入的请求和流量均匀分布到多个服务器上。负载均衡的主要目标是通过避免单个服务器过载和减少停机时间来确保高可用性、可靠性和性能。
通常,负载均衡器位于客户端和服务器之间,接收传入的网络和应用程序流量,并使用各种算法将流量分布到多个后端服务器上。通过将应用程序请求分散到多个服务器上,负载均衡器减轻了单个服务器的负载,并防止任何一个服务器成为单点故障,从而提高了整体应用程序的可用性和响应速度。
为了充分利用可扩展性和冗余性,我们可以尝试在系统的每一层进行负载均衡。我们可以在三个地方添加负载均衡器(LB):
- 在用户和Web服务器之间:这有助于在多个Web服务器之间分配用户请求,以防单个服务器过载并提高网站的响应速度和可用性。
- 在Web服务器和内部平台层之间:如应用服务器或缓存服务器。这一层的负载均衡可以进一步提高处理效率,优化资源的使用,并确保应用层的稳定性和效率。
- 在内部平台层和数据库之间:通过在多个数据库或数据库服务器之间分配请求,可以提高数据库查询的效率和速度,同时也增强数据存储的可靠性。
通过在这些关键点设置负载均衡,系统可以在多个层面上实现高效运行,避免任何单一组件的故障影响整个系统的稳定性和性能。
关键术语和概念
下面是一些关键术语和概念:
-
负载均衡器:一种设备或软件,根据预定义的规则或算法将网络流量分配到多个服务器上。
-
后端服务器:接收并处理由负载均衡器转发的请求的服务器。也被称为服务器池或服务器群。
-
负载均衡算法:负载均衡器用来决定如何在后端服务器之间分配进来的流量的方法。
-
健康检查:负载均衡器执行的定期测试,用以确定后端服务器的可用性和性能。不健康的服务器会被从服务器池中移除,直到它们恢复正常。
-
会话持久性:一种技术,用来确保来自同一客户端的后续请求被引导到同一后端服务器,维护会话状态并提供一致的用户体验。
-
SSL/TLS终止:在负载均衡器层级对SSL/TLS加密流量进行解密的过程,从后端服务器上卸载解密负担,并允许集中管理SSL/TLS。
负载均衡器的工作流程
负载均衡器通过将传入的网络流量分配到多个服务器或资源上来工作,以确保计算资源的高效利用并防止过载。以下是负载均衡器分配流量的一般步骤:
- 接收请求:负载均衡器从客户端或用户那里接收到一个请求。
- 评估请求:负载均衡器评估传入的请求,并根据预定义的负载均衡算法确定哪个服务器或资源应处理该请求。这一算法会考虑服务器容量、服务器响应时间、活跃连接数和地理位置等因素。
- 转发流量:负载均衡器将传入的流量转发给选定的服务器或资源。
- 处理请求:服务器或资源处理请求并将响应发送回负载均衡器。
- 发送响应:负载均衡器接收来自服务器或资源的响应,并将其发送给发起请求的客户端或用户。
通过这些步骤,负载均衡器能够有效管理网络流量,提高资源利用率,增强应用的可用性和性能。
负载均衡算法
负载均衡算法是负载均衡器用来将传入流量和请求分配到多个服务器或资源上的方法。负载均衡算法的主要目的是确保有效利用可用资源,提高整体系统性能,并维持高可用性和可靠性。
负载均衡算法有助于防止任何单一服务器或资源过载,这可能导致性能下降或失败。通过分散工作负载,负载均衡算法可以优化响应时间,最大化吞吐量,并提升用户体验。这些算法可以考虑服务器容量、活动连接数、响应时间和服务器健康状况等因素,以做出关于如何最佳分配传入请求的明智决策。
下面将依次介绍一些最著名的负载均衡算法:
- Round Robin(轮询法)
- Least Connections(最少连接数法)
- Weighted Round Robin(加权轮询)
- Weighted Least Connections(加权最少连接数法)
- IP Hash(IP哈希法)
- Least Response Time(最短响应时间法)
- Random(随机法)
- Least Bandwidth(最小带宽法)
- Custom Load(自定义负载均衡算法)
1. Round Robin
轮询法(Round Robin)它以周期性顺序将传入的请求分发到服务器。该算法先将请求分配给第一个服务器,然后依次转移到第二个、第三个等服务器,当到达列表末尾后,再次从第一个服务器开始分配。
优点:
-
平等分配请求:确保请求在服务器之间平均分配,因为每个服务器按固定顺序轮流处理请求。
-
易于实现和理解:这种方法结构简单,容易编程实现。
-
适用于服务器能力相近:当所有服务器的处理能力相近时,这种方法工作得很好。
缺点:
-
无负载意识:不考虑每个服务器当前的负载或容量。无论其当前状态如何,所有服务器都被平等对待。
-
无会话亲和性:来自同一客户端的后续请求可能被引导到不同的服务器,这对于需要状态维持的应用程序可能造成问题。
-
不同容量的性能问题:当服务器容量或工作负载有差异时,可能无法达到最佳性能。
-
可预测的分配模式:轮询法在请求分配模式上是可预测的,这可能被攻击者利用,他们可以观察流量模式并可能通过预测哪个服务器将处理他们的请求来找到特定服务器的漏洞。
适用场景:
-
同质环境:适用于所有服务器具有相似容量和性能的环境。在这种环境下,每台服务器都具备相似的处理能力,因此使用轮询法分配请求可以保证比较公平和均匀的负载分配。
-
无状态应用:适用于无状态的应用程序,这类应用程序的每个请求都可以独立处理,不需要维持客户端的会话状态。由于轮询法不保持会话亲和性,即后续请求可能被发送到不同的服务器,所以它特别适合于无状态的场景,其中每个请求都是自包含的,不依赖于之前的任何请求状态。
2. Least Connections
最少连接数算法(Least Connections),这是一种动态负载均衡技术,它将传入请求分配给当前活跃连接数最少的服务器。该方法确保了服务器之间负载分配更加均衡,尤其是在流量模式不可预测且请求处理时间不同的环境中。
优点:
- 负载意识:通过考虑每个服务器的活跃连接数,考虑到每台服务器当前的负载,从而更好地利用服务器资源。
- 动态分配:适应不断变化的流量模式和服务器负载,确保没有单个服务器成为瓶颈。
- 异质环境中的效率:在服务器容量和工作负载不同的情况下表现良好,因为它能动态地将请求分配给较不繁忙的服务器。
缺点:
- 更高的复杂性:与简单的算法(如轮询法)相比,实现起来更复杂,因为它需要实时监控活动连接。
- 状态维护:负载均衡器需要维持活动连接的状态,这可能增加开销。
- 连接峰值潜在问题:在连接持续时间短的情况下,服务器可能会经历迅速的连接数量增加,导致需要频繁重新平衡。
适用场景:
-
异质环境:适合于服务器容量和工作负载不同的环境,需要动态地分配负载。
-
变化多端的流量模式:适合于流量模式不可预测或高度变化的应用程序,确保没有单个服务器被压垮。
-
有状态应用:对于需要维护会话状态的应用程序来说,这种技术非常有效,因为它有助于更均匀地分配活动会话。
Comparison to Round Robin
轮询法(Round Robin)和最少连接数算法(Least Connections)的区别:
-
轮询法:按固定的循环顺序分配请求,不考虑每个服务器当前的负载。这意味着每个服务器轮流接收一个请求,不管它的当前工作量如何。这种方法简单、易于实现,但可能不适合服务器性能差异大的环境,或者在处理负载较重的应用时可能导致某些服务器过载。
-
最少连接数算法:根据当前的负载分配请求,将新请求指向活跃连接数最少的服务器。这种方法考虑了各服务器的实时负载情况,通过将请求导向负载较轻的服务器,帮助平衡服务器间的工作量,提高资源的整体利用率。这种算法尤其适合于服务器性能不均或流量波动大的环境。
3. Weighted Round Robin
加权轮询法(Weighted Round Robin, WRR)是轮询法的增强版本。它根据每个服务器的容量或性能分配权重,并按照这些权重比例分配传入请求。这样可以确保性能更强的服务器处理更大份额的负载,而性能较弱的服务器处理较小份额的负载。
优点:
- 根据容量分配负载:容量更大的服务器处理更多请求,从而更好地利用资源。
- 灵活性:可以轻松调整以适应服务器容量的变化或新服务器的添加。
- 提升性能:通过防止性能较弱的服务器过载,帮助优化整体系统性能。
缺点:
- 权重分配的复杂性:为每个服务器确定适当的权重可能具有挑战性,需要准确的性能指标。
- 增加的开销:管理和更新权重可能引入额外的开销,尤其是在服务器性能波动的动态环境中。
- 对高度变化的负载不理想:在负载模式高度变化的环境中,加权轮询法可能无法始终提供最优的负载均衡,因为它不考虑实时服务器负载。
适用场景:
- 异质服务器环境:非常适合服务器处理能力不同的环境,确保资源的有效使用。
- 可扩展的网络应用:适用于不同服务器可能具有不同性能特征的网络应用。
- 数据库集群:在一些节点具有更高处理能力并能处理更多查询的数据库集群中非常有用。
4. Weighted Least Connections
加权最少连接数算法是一种高级的负载均衡算法,结合了最少连接数算法和加权轮询法的原则。它考虑了每个服务器上的当前负载(活跃连接数)以及每个服务器的相对容量(权重)。这种方法确保性能更强的服务器处理比例更大的负载,同时也能动态调整以适应每个服务器的实时负载。
优点:
- 动态负载均衡:根据每个服务器的实时负载调整,确保请求分配更均衡。
- 容量意识:考虑到每个服务器的相对容量,从而更好地利用资源。
- 灵活性:能有效处理服务器异质性和负载模式变化的环境。
缺点:
- 复杂性:相比如轮询法和最少连接数算法等简单算法,实现更复杂。
- 状态维护:负载均衡器需要跟踪活动连接和服务器权重,这增加了开销。
- 权重分配:为每个服务器确定适当的权重可能具有挑战性,需要准确的性能指标。
适用场景:
- 异质服务器环境:非常适合服务器处理能力和工作负载不同的环境。
- 高流量网络应用:适用于流量模式变化的网络应用,确保没有单一服务器成为瓶颈。
- 数据库集群:在节点性能能力和查询负载各不相同的数据库集群中非常有用。
5. IP Hash
IP 哈希负载均衡是一种根据客户端的 IP 地址将客户请求分配给服务器的技术。负载均衡器使用哈希函数将客户端的 IP 地址转换成哈希值,然后用这个哈希值来确定哪个服务器应该处理请求。这种方法确保来自同一客户端 IP 地址的请求始终被路由到同一台服务器,从而提供会话持久性。
示例:
假设有三台服务器(服务器 A、服务器 B 和服务器 C)以及一个客户端 IP 地址为 192.168.1.10。负载均衡器对这个 IP 地址应用哈希函数,得到一个哈希值。如果哈希值为 2,并且有三个服务器,负载均衡器会将请求路由到服务器 C(2 % 3 = 2)。
优点:
- 会话持久性:确保来自同一客户端 IP 地址的请求始终被路由到同一服务器,这对于需要状态维护的应用程序非常有益。
- 简单性:易于实现,不需要负载均衡器维护连接状态。
- 确定性:基于客户端 IP 地址的可预测和一致的路由。
缺点:
- 分配不均:如果客户端 IP 地址分布不均,某些服务器可能会接收到比其他服务器更多的请求,导致负载不均。
- 动态变化:增加或移除服务器可能会打乱哈希映射,导致某些客户被路由到不同的服务器。
- 灵活性有限:不考虑服务器的当前负载或容量,可能导致效率低下。
适用场景:
- 有状态应用:适合需要维护会话持久性的应用,如在线购物车或用户会话。
- 地理分布的客户端:当客户分布在不同地区并且需要一致的路由时,此方法非常有用。
6. Least Response Time
最小响应时间负载均衡是一种动态算法,它将传入请求分配给响应时间最短的服务器,从而确保服务器资源的有效利用和优化客户体验。这种方法旨在将流量引导至基于最近性能指标能最快处理请求的服务器。
最小响应时间负载均衡的工作原理:
- 监控响应时间:负载均衡器持续监控每个服务器的响应时间。响应时间通常从请求发送到服务器到收到响应的时间计算。
- 分配请求:当新请求到达时,负载均衡器将其分配给平均响应时间最低的服务器。
- 动态调整:负载均衡器根据实时性能数据动态调整请求的分配,确保最快的服务器处理下一个请求。
优点:
- 优化性能:确保请求由最快的可用服务器处理,降低延迟并改善客户体验。
- 动态负载均衡:持续适应服务器性能的变化,确保负载的最优分配。
- 有效资源利用:通过将流量引导至能快速响应的服务器,帮助更好地利用服务器资源。
缺点:
- 复杂性:相比如轮询法这类简单算法,实现更复杂,因为需要持续监控服务器性能。
- 开销:监控响应时间和动态调整负载可能引入额外的开销。
- 短期变化性:由于网络波动或服务器的临时问题,响应时间可能在短期内变化,可能导致频繁的重新平衡。
适用场景:
- 实时应用:非常适合需要低延迟和快速响应时间的应用,如在线游戏、视频流媒体或金融交易平台。
- Web服务:对于需要快速响应用户请求的Web服务和API非常有用。
- 动态环境:适合负载和服务器性能波动的环境。
7. Random
随机负载均衡是一种简单的算法,它随机地将传入请求分配给服务器。与遵循固定序列或使用性能指标不同,负载均衡器随机选择一个服务器来处理每个请求。在负载相对均匀且服务器容量相似的场景中,这种方法可能非常有效。
例如,如果你有三台服务器:服务器A、服务器B和服务器C。当一个新请求到达时,负载均衡器随机选择这些服务器中的一个来处理请求。如果随机性是均匀的,那么随着时间的推移,每个服务器应该接收到大致相同数量的请求。
优点:
- 简单性:非常易于实现和理解,需要的配置很少。
- 无需维护状态:负载均衡器不需要跟踪服务器的状态或性能,从而减少了开销。
- 长期均匀分配:如果随机选择是均匀的,负载将在长时间内在服务器之间均匀分配。
缺点:
- 无负载意识:不考虑服务器的当前负载或容量,如果服务器性能有差异,可能导致分配不均。
- 可能的不平衡:短期内,随机选择可能导致请求分配不均。
- 无会话亲和性:来自同一客户的请求可能被引导到不同的服务器,这对于需要状态维护的应用程序可能会造成问题。
- 安全系统挑战:如果使用随机算法,由于请求分配的不可预测性,依赖于检测异常的安全系统(例如,用于缓解DDoS攻击的系统)可能会发现识别恶意模式更具挑战性,这可能会削弱对攻击模式的可见性。
适用场景:
- 同质环境:适用于服务器容量和性能相似的环境。
- 无状态应用:适合于每个请求都可以独立处理的无状态应用。
- 简单部署:对于不需要其他负载均衡算法的复杂性的简单部署来说,理想的选择。
8. Least Bandwidth
最小带宽负载均衡算法根据当前的带宽使用情况分配传入请求。它将每个新请求路由到此时正在使用最少带宽的服务器。这种方法通过确保没有单个服务器因数据流量过大而负载过重,帮助更有效地平衡网络负载。
优点:
- 动态负载均衡:持续调整以适应当前的网络负载,确保流量的最佳分配。
- 防止过载:帮助防止任何单个服务器因数据流量过大而过载,从而提高性能和稳定性。
- 高效资源利用:通过平衡带宽使用,确保所有服务器更有效地利用。
缺点:
- 复杂性:与如轮询法这样的简单算法相比,实现更复杂,因为需要持续监控带宽使用。
- 开销:监控带宽并动态调整负载可能引入额外的开销。
- 短期变动性:带宽使用可能会在短期内波动,可能导致频繁重新平衡。
适用场景:
- 高带宽应用:非常适合带宽使用高的应用,如视频流媒体、文件下载和大数据传输。
- 内容分发网络(CDN):对于需要有效平衡流量以快速交付内容的CDN非常有用。
- 实时应用:适合于需要保持低延迟的实时应用。
9. Custom Load
自定义负载均衡是一种灵活且高度可配置的方法,允许您根据自己的特定需求和条件定义用于跨服务器池分配传入流量的指标和规则。与使用预定义标准(如连接数或响应时间)的标准负载均衡算法不同,自定义负载均衡使您能够根据应用程序或基础设施的独特要求定制分配策略。
自定义负载均衡的工作方式:
- 定义自定义指标:确定最能代表与您的应用相关的负载或性能特征的指标。这些指标可以包括CPU使用率、内存使用量、磁盘I/O、应用程序特定指标或几种指标的组合。
- 实施监控:持续监控池中每个服务器上定义的指标。这可能涉及集成监控工具或自定义脚本,收集和报告必要的数据。
- 创建负载均衡规则:建立使用监控指标来做出负载均衡决策的规则和算法。这可以是指标的简单加权和,或者是优先考虑某些指标的更复杂逻辑。
- 动态调整:使用收集的数据和规则动态调整传入请求的分配,确保流量按照自定义负载标准进行平衡。
优点:
- 灵活性:允许为应用的具体需求和性能特征量身定制高度定制的负载均衡策略。
- 优化资源利用:通过考虑一套全面的指标,可以更有效地利用服务器资源。
- 适应性:易于适应变化的条件和要求,适用于复杂和动态的环境。
缺点:
- 复杂性:相比标准负载均衡算法,实现和配置更为复杂。
- 监控开销:需要持续监控多个指标,可能带来额外的开销。
- 配置错误的潜在风险:如果指标或规则定义不正确,可能导致负载均衡和性能问题。
适用场景:
- 复杂应用:非常适合性能特性复杂且资源需求多变的应用。
- 高度动态环境:适合工作负载和服务器性能可能迅速且不可预测地变化的环境。
- 自定义需求:在标准负载均衡算法无法满足应用的特定需求时非常有用。
相关文章:
万字长文深入浅出负载均衡器
前言 本篇博客主要分享Load Balancing(负载均衡),将从以下方面循序渐进地全面展开阐述: 介绍什么是负载均衡介绍常见的负载均衡算法 负载均衡简介 初识负载均衡 负载均衡是系统设计中的一个关键组成部分,它有助于…...
使用递归解决编程题
题目:递归实现组合型枚举 从 1−n 这 n 个整数中随机选取 m 个,每种方案里的数从小到大排列,按字典序输出所有可能的选择方案。 输入 输入两个整数 n,m。(1≤m≤n≤10) 输出 每行一组方案,每组方案中…...
Nginx 中文文档
文章来源:nginx 文档 -- nginx中文文档|nginx中文教程 nginx 文档 介绍 安装 nginx从源构建 nginx新手指南管理员指南控制 nginx连接处理方法设置哈希调试日志记录到 syslog配置文件测量单位命令行参数适用于 Windows 的 nginx支持 QUIC 和 HTTP/3 nginx 如何处理…...
2.策略模式(Strategy)
定义 定义一系列算法,把它们一个个封装起来,并且使他们可互相替换(变化)。该模式使算法可独立于使用它的客户程序(稳定)而变化(拓展,子类化)。 动机(Motiva…...
浔川AI翻译v6.0延迟上线说明
浔川社团官方联合会关于浔川AI翻译v6.0版本的说明 尊敬的各位用户: 大家好! 首先,衷心感谢大家一直以来对浔川社团官方联合会以及浔川AI翻译的关注与支持。在此,我们怀着十分遗憾的心情向大家发布一则重要通知:原计划推…...
git基础使用--4---git分支和使用
文章目录 git基础使用--4---git分支和使用1. 按顺序看2. 什么是分支3. 分支的基本操作4. 分支的基本操作4.1 查看分支4.2 创建分支4.3 切换分支4.4 合并冲突 git基础使用–4—git分支和使用 1. 按顺序看 -git基础使用–1–版本控制的基本概念 -git基础使用–2–gti的基本概念…...
[paddle] 矩阵相关的指标
行列式 det 行列式定义参考 d e t ( A ) ∑ i 1 , i 2 , ⋯ , i n ( − 1 ) σ ( i 1 , ⋯ , i n ) a 1 , i 1 a 2 , i 2 , ⋯ , a n , i n det(A) \sum_{i_1,i_2,\cdots,i_n } (-1)^{\sigma(i_1,\cdots,i_n)} a_{1,i_1}a_{2,i_2},\cdots, a_{n,i_n} det(A)i1,i2,⋯,in…...
CH340G上传程序到ESP8266-01(S)模块
文章目录 概要ESP8266模块外形尺寸模块原理图模块引脚功能 CH340G模块外形及其引脚模块引脚功能USB TO TTL引脚 程序上传接线Arduino IDE 安装ESP8266开发板Arduino IDE 开发板上传失败上传成功 正常工作 概要 使用USB TO TTL(CH340G)将Arduino将程序上传…...
CMake的QML项目中使用资源文件
Qt6.5的QML项目中,我发现QML引用资源文件并不像QtWidgets项目那样直接。 在QtWidgets的项目中,我们一般是创建.qrc资源文件,然后创建前缀/new/prefix,再往该前缀中添加一个图片文件,比如:test.png。…...
FBX SDK的使用:读取Mesh
读取顶点数据 要将一个Mesh渲染出来,必须要有顶点的位置,法线,UV等顶点属性,和三角面的顶点索引数组。在提取这些数据之前,先理解FBX SDK里面的几个概念: Control Point 顶点的位置,就是x,y,z…...
无人机PX4飞控 | PX4源码添加自定义uORB消息并保存到日志
PX4源码添加自定义uORB消息并保存到日志 0 前言 PX4的内部通信机制主要依赖于uORB(Micro Object Request Broker),这是一种跨进程的通信机制,一种轻量级的中间件,用于在PX4飞控系统的各个模块之间进行高效的数据交换…...
在C#中,什么是多态如何实现
在C#中,什么是多态?如何实现? C#中的多态性 多态性是面向对象编程的一个核心概念,他允许对象以多种形式表现.在C#中,多态主要通过虚方法,抽象方法和接口来实现. 多态性的存在使得同一个行为可以有多个不同的表达形式 即同一个接口可以使用不同的实例来执行不同的操作 虚方…...
Vue指令v-text
目录 一、Vue中的v-text指令是什么?二、v-text指令内部支持写表达式。 一、Vue中的v-text指令是什么? v-text指令用于设置标签的文本值(textContent)。 二、v-text指令内部支持写表达式。 注意:v-text指令的默认写法会替换全部内容&#x…...
基于springboot+vue的航空散货调度系统
开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…...
FFmpeg(7.1版本)在Ubuntu18.04上的编译
一、从官网上下载FFmpeg源码 官网地址:Download FFmpeg 点击Download Source Code 下载源码到本地电脑上 二、解压包 tar -xvf ffmpeg-7.1.tar.xz 三、配置configure 1.准备工作 安装编译支持的软件 ① sudo apt-get install nasm //常用的汇编器,用于编译某些需要汇编…...
ZK-ALU-在有限域上实现左移
先看在实数域上实现左移, 再看在有限域上的实现 左移-整数 计算机中的左移计算(<< 操作)通常由处理器的硬件电路直接支持,因此效率非常高。在编程语言中,左移操作可以通过位移运算符(例如 C/C 中的 <<&a…...
建表注意事项(2):表约束,主键自增,序列[oracle]
没有明确写明数据库时,默认基于oracle 约束的分类 用于确保数据的完整性和一致性。约束可以分为 表级约束 和 列级约束,区别在于定义的位置和作用范围 复合主键约束: 主键约束中有2个或以上的字段 复合主键的列顺序会影响索引的使用,需谨慎设计 添加…...
PyTorch生态系统中的连续深度学习:使用Torchdyn实现连续时间神经网络
神经常微分方程(Neural ODEs)是深度学习领域的创新性模型架构,它将神经网络的离散变换扩展为连续时间动力系统。与传统神经网络将层表示为离散变换不同,Neural ODEs将变换过程视为深度(或时间)的连续函数。…...
【PyQt】keyPressEvent键盘按压事件无响应
问题描述 通过load ui 文件加载程序时,keyPressEvent键盘按压事件无响应 原因 主要是由于事件处理的方式和窗口的显示方式不正确所导致的。 解决代码 self:这里的self作为loadUi函数的第二个参数,意味着加载的界面将被设置为当前类实例&…...
redis的分片集群模式
redis的分片集群模式 1 主从哨兵集群的问题和分片集群特点 主从哨兵集群可应对高并发写和高可用性,但是还有2个问题没有解决: (1)海量数据存储 (2)高并发写的问题 使用分片集群可解决,分片集群…...
PHP Composer:高效依赖管理工具详解
PHP Composer:高效依赖管理工具详解 引言 在PHP开发领域,依赖管理是项目构建过程中的重要环节。Composer的出现,极大地简化了PHP项目的依赖管理,使得开发者可以更加高效地构建和维护PHP应用程序。本文将深入探讨PHP Composer的使用方法、功能特点以及它在项目开发中的应用…...
【VUE案例练习】前端vue2+element-ui,后端nodo+express实现‘‘文件上传/删除‘‘功能
近期在做跟毕业设计相关的数据后台管理系统,其中的列表项展示有图片展示,添加/编辑功能有文件上传。 “文件上传/删除”也是我们平时开发会遇到的一个功能,这里分享个人的实现过程,与大家交流谈论~ 一、准备工作 本次案例使用的…...
【B站保姆级视频教程:Jetson配置YOLOv11环境(六)PyTorchTorchvision安装】
Jetson配置YOLOv11环境(6)PyTorch&Torchvision安装 文章目录 1. 安装PyTorch1.1安装依赖项1.2 下载torch wheel 安装包1.3 安装 2. 安装torchvisiion2.1 安装依赖2.2 编译安装torchvision2.2.1 Torchvisiion版本选择2.2.2 下载torchvisiion到Downloa…...
relational DB与NoSQL DB有什么区别?该如何选型?
Relational Database(关系型数据库,简称RDB)与NoSQL Database(非关系型数据库)是两类常见的数据库类型。它们在设计理念、数据存储方式、性能优化、扩展性等方面有许多差异。下面我们将会详细分析它们的区别,以及如何根据应用场景进行选型。 一、数据模型的区别 关系型…...
解决对axios请求返回对象进行json化时报“TypeError Converting circular structure to JSON“错误的问题
发现直接对axios请求返回对象进行json化会报"TypeError: Converting circular structure to JSON"错误,而对返回对象下的data属性进行json化就没问题 如果想对循环引用的对象进行json化,解决方案可参考: TypeError: Converting c…...
优化代码性能:利用CPU缓存原理
在计算机的世界里,有一场如同龟兔赛跑般的速度较量,主角便是 CPU 和内存 。龟兔赛跑的故事大家都耳熟能详,兔子速度飞快,乌龟则慢吞吞的。在计算机中,CPU 就如同那敏捷的兔子,拥有超高的运算速度࿰…...
Rust场景示例:为什么要使用切片类型
通过对比 不用切片 和 使用切片 的场景,说明切片类型在 Rust 中的必要性: 场景:提取字符串中的单词 假设我们需要编写一个函数,从一个句子中提取第一个单词。我们将分别展示 不用切片 和 使用切片 的实现,并对比二者的…...
ubuntu直接运行arm环境qemu-arm-static
qemu-arm-static 嵌入式开发有时会在ARM设备上使用ubuntu文件系统。开发者常常会面临这样一个问题,想预先交叉编译并安装一些应用程序,但是交叉编译的环境配置以及依赖包的安装十分繁琐,并且容易出错。想直接在目标板上进行编译和安装&#x…...
HTTP 黑科技
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
【Vite + Vue + Ts 项目三个 tsconfig 文件】
Vite Vue Ts 项目三个 tsconfig 文件 为什么 Vite Vue Ts 项目会有三个 tsconfig 文件?首先我们先了解什么是 tsconfig.json ? 为什么 Vite Vue Ts 项目会有三个 tsconfig 文件? 在使用 Vite 创建 vue-ts 模板的项目时,会发现除了 ts…...
Mac怎么彻底卸载软件,简单彻底的卸载方式
一个阳光明媚的下午,咖啡厅里,珂珂正在和他的好友帅帅讨论如何优化他们的Mac电脑,特别是谈到Mac怎么彻底卸载软件的时候,帅帅就特别感同身受,因为他近期就遇到了这个的麻烦,并且找了很久才找到号的解决方案…...
15 刚体变换模块(rigid.rs)
rigid.rs是一个表示三维刚体变换(Rigid Transformation)的结构体定义,用于在计算机图形学、机器人学以及物理模拟等领域中表示物体在三维空间中的旋转和平移。在这个定义中,所有长度在变换后都保持不变,这是刚体变换的…...
springboot使用rabbitmq
使用springboot创建rabbitMQ的链接。 整个项目结构如下: 1.maven依赖 <dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>3.4.1</version> </dependency>application.y…...
【Linux】一文带你入门了解线程和虚拟地址空间中页表映射的秘密(内附手绘底层逻辑图 通俗易懂)
绪论 每日激励:“努力去做自己该做的,但是不要期待回报,不是付出了就会有回报的,做了就不要后悔,不做才后悔。—Jack” 绪论: 本章是LInux中非常重要的线程部分,通过了解线程的基本概念&am…...
高并发、高可用的消息队列(MQ)设计与实战
目录 背景与历史消息队列的核心功能高并发、高可用的业务场景消息队列的实用性企业规模与消息队列的选择Java实战案例:基于RabbitMQ的高并发、高可用消息队列 6.1 环境准备6.2 RabbitMQ的安装与配置6.3 Java客户端集成6.4 生产者与消费者实现6.5 高并发处理6.6 高可…...
nginx 新手指南
文章来源:https://nginx.cadn.net.cn/beginners_guide.html 本指南对 nginx 进行了基本的介绍,并描述了一些 可以用它完成的简单任务。 假设 nginx 已经安装在阅读器的机器上。 如果不是,请参阅 安装 nginx 页面。 本指南介绍如何启动和停止…...
7-4 西安距离
小明来到了古都西安,想去参观大唐西市! 西安的道路可以看做是与x轴或y轴垂直的直线,小明位于(a,b),而目的地位于(c,d),问最少几步可以到达。 输入格式: 一行中四个整数,a,b,c,d,表示坐标为(a…...
VScode+Latex (Recipe terminated with fatal error: spawn xelatex ENOENT)
使用VSCode编辑出现Recipe terminated with fatal error: spawn xelatex ENOENT问题咋办? 很好解决,大概率的原因是因为latex没有添加到系统环境变量中,所有设置的编译工具没有办法找到才出现的这种情况。 解决方法: winR 然后输…...
使用 Elastic Cloud Hosted 优化长期数据保留:确保政府合规性和效率
作者:来自 Elastic Jennie Davidowitz 在数字时代,州和地方政府越来越多地承担着管理大量数据的任务,同时确保遵守严格的监管要求。这些法规可能因司法管辖区而异,通常要求将数据保留较长时间 —— 有时从一年到七年不等。遵守刑事…...
51单片机 02 独立按键
一、独立按键控制LED亮灭 轻触按键:相当于是一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开。 #include <STC89C5xRC.H> void main() { // P20xFE;while(1){…...
海外问卷调查渠道查,具体运营的秘密
相信只要持之以恒并逐渐掌握技巧,每一位调查人在踏上征徐之时都会非常顺利的。并在日后的职业生涯中拥有捉刀厮杀的基本技能!本文会告诉你如何做好一个优秀的海外问卷调查人。 在市场经济高速发展的今天,众多的企业为了自身的生存和发展而在…...
Vue.js 的介绍与组件开发初步
Vue.js 的介绍与组件开发初步 Vue.js 的介绍与组件开发初步引言第一部分:Vue.js 基础入门1.1 什么是 Vue.js?1.2 搭建 Vue.js 开发环境安装 Node.js 和 npm安装 Vue CLI创建新项目运行示例 1.3 第一个 Vue.js 示例 第二部分:Vue.js 组件开发基…...
Shadow DOM举例
这东西具有隔离效果,对于一些插件需要append一些div倒是不错的选择 <!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"utf-8"> <title>演示例子</title> </head> <body> <style&g…...
kamailio-Core 说明书 版本:Kamailio SIP Server v6.0.x(稳定版)
Core 说明书 版本:Kamailio SIP Server v6.0.x(稳定版) 概述 本教程收集了 Kamailio 导出的函数和参数 core 添加到配置文件中。 注意:此页面上的参数不按字母顺序排列。 结构 kamailio.cfg 的结构可以看作是三个部分ÿ…...
PHP XML操作指南
PHP XML操作指南 引言 随着互联网的快速发展,数据交换和共享变得越来越重要。XML(可扩展标记语言)作为一种灵活的标记语言,被广泛应用于各种数据交换场景。PHP作为一种流行的服务器端脚本语言,具有强大的XML处理能力…...
一文了解DeepSeek
1. DeepSeek 的起源 创立时间:DeepSeek 于 2023 年由中国的梁文锋创立。 V3 模型训练成本:最终训练成本为 600 万美元。 开源:DeepSeek 提供开源版本。 流行度:DeepSeek R1 模型成为 Apple 应用商店中下载量最高的应用。 2. …...
三角形的最大周长(976)
976. 三角形的最大周长 - 力扣(LeetCode) 可以一起总结的题目:三数之和(15)-CSDN博客 官方解法: class Solution { public://官方解法int largestPerimeter(vector<int>& nums) {sort(nums.be…...
10:预处理
预处理 1、宏替换2、头文件包含3、条件编译4、typedef和#define的区别5、#define中的注意点5.1、使用do....while(0)5.2、#和##的含义 C语言编译器在编译程序之前,会先使用预处理器(预处理器)处理代码,代码经过预处理之后再送入编译器进行编译。预处理器…...
一文讲解HashMap线程安全相关问题(上)
HashMap不是线程安全的,主要有以下几个问题: ①、多线程下扩容会死循环。JDK1.7 中的 HashMap 使用的是头插法插入元素,在多线程的环境下,扩容的时候就有可能导致出现环形链表,造成死循环。 JDK 8 时已经修复了这个问…...
C++泛型编程指南04-(对默认调用参数的类型推断)
文章目录 问题描述解决方案示例代码 关键点解释进一步改进:结合概念约束 你提到的情况确实是一个常见的问题:在C中,类型推断不适用于默认调用参数。这意味着如果你希望函数模板能够通过默认参数来实例化,你需要为模板参数提供一个…...