Go应用性能优化的8个最佳实践,快速提升资源利用效率!

news2024/11/18 15:39:35

作者|Ifedayo Adesiyan
翻译|Seal软件
链接|https://earthly.dev/blog/optimize-golang-for-kubernetes/

 
优化服务器负载对于确保运行在 Kubernetes 上的 Golang 应用程序的高性能和可扩展性至关重要。随着企业越来越多地采用容器化的方式和 Kubernetes 来部署和管理应用程序,采取减少服务器负载的最佳实践势在必行,进而达到最佳的资源利用效率、成本效益并改善用户体验。
 

运行 Golang 应用程序的多个容器可以放在一个 Kubernetes 集群内,并部署在多个节点上。每个容器可以使用 CPU、内存以及存储等系统资源。如果这些资源没有被高效地管理起来,可能会导致服务器负载不断增加,从而降低性能并增加支出。
 

因此,针对 Kubernetes 的 Golang 应用优化对于完成有效的资源利用、降低服务器负载以及保证应用在生产环境中顺利运行至关重要。
 

在本文中,我们将研究在 Kubernetes 上优化 Golang 应用的最佳方法,重点是降低服务器负载。我们会讨论一些方法,包括用 readiness 和 liveness 探针进行监控,利用弹性伸缩等功能来优化资源利用。
 

通过采取这些最佳实践,可以提高在 Kubernetes 上运行的 Golang 应用的性能和可扩展性,这将改善用户体验、节约成本,并提升运维效率。
 

本文中所有代码示例可以访问下方网址查看:
https://github.com/theifedayo/earthly.dev/tree/main/01-optimizing-go-k8s
 

前期准备

本文需要你对 Go 和 Kubernetes 有中等程度的了解。此外,需要你已经安装 Go、Docker 和 Kubernetes (及其他运行 Kubernetes 的工具,如kubectl)并且已经在系统内配置完毕。
 

你可以通过终端输入以下命令验证是否已经安装 Go:
go version
 

如果已经安装,应该返回以下内容:
go version go1.19.3 darwin/amd64
 

使用以下命令可以验证 Docker 是否安装:
docker --version
 

输出应为(或其他类似的内容):
Docker version 20.10.22, build 3a2c30b
 

验证 Kubernetes 是否安装也是类似的方法。
 

理解 Golang 应用程序和 Kubernetes

谷歌开发了 Golang,也称“Go”,其目标是高效、多并发和可扩展。它对创建高性能软件很有效,特别是对需要并发处理的应用,如网络服务器、网络软件和分布式系统。
 

容器化应用的部署、扩展和管理都可以由开源容器编排引擎 Kubernetes 自动化。通过抽象化底层基础设施的细节,并促进有效的资源利用率、可扩展性和容错率,它提供了一个灵活和可扩展的框架,用于部署和管理跨节点集群的容器化应用程序。
 


Docker 容器
 

当 Golang 应用程序被部署到 Kubernetes 上时,它们通常被打包为 Docker 容器。这些独立的、轻量级的环境隔离了程序及其所有的依赖项。这些容器可以通过 Kubernetes 简单地部署和管理,实现有效的资源利用并且能够根据应用程序的要求进行弹性伸缩。
 


Dockerfile 到 Kubernetes pod 的生命周期
 

运行在 Kubernetes 上的 Golang 应用能够利用几个特性来提升性能、可扩展性以及可靠性。例如,Kubernetes 能够在不同的集群节点上部署同一应用程序的多个实例,以分散负载并提升可用性。Golang 程序的部署、维护和可扩展性也可以通过 Kubernetes 中的负载均衡、服务发现和滚动更新工具来加强。
 

为了确保资源效率,防止资源争夺或无节制使用,Golang 应用程序还可以利用 Kubernetes 的内置资源管理功能,包括 CPU 和内存限制、资源配额和资源剖析等。
 

此外,Kubernetes 提供了日志和监控能力,以了解 Golang 程序的功能运转和健康状况,高效推动问题解决和 debug。
 

并发性、效率、简洁性、社区驱动以及与云原生原则的一致性,使 Golang 成为开发基于 Kubernetes 应用的热门选项,因为它可以让开发者创建高性能、可扩展和有弹性的应用程序,并能在容器化环境中轻松部署和管理。
 

总而言之,Golang 和 Kubernetes 的结合可以提供一个高性能、可扩展以及可靠的应用程序构建和部署平台。为 Kubernetes 优化 Golang 应用,需要利用 Kubernetes 提供的功能来实现高效的资源利用、扩展、请求、响应和错误处理,以确保在容器化环境中的最佳性能和可靠性。
 

优化 Golang 应用程序的最佳实践

为 Kubernetes 优化 Golang 应用程序包括利用 Kubernetes 的功能,如资源限制、服务发现和监控,以确保在容器化环境中的最佳性能和可靠性,并优化 Go 代码,如使用 Go 垃圾回收和连接池。这种优化有助于确保在 Kubernetes 上运行的 Golang 应用程序能够有效地处理高负载,动态扩展,并为用户提供可靠的服务。
 

1、使用最小化和高效的容器基础镜像

容器性能和资源利用可能会受到你为 Golang 应用程序使用的基础镜像的影响。使用专门为运行容器化应用程序而创建的最小的基础镜像是至关重要的。
 

最受欢迎的选择之一是 Docker Hub 提供的官方 Golang 基础镜像,它基于官方 Golang 发行版,提供基本的运行环境。你也可以考虑采用更轻量的选择,比如建立在 Alpine 是一个轻量级的 Linux 发行版,通常用于 Docker 镜像,以最小化镜像的大小进而减少攻击面。
 

下方是使用官方 Golang 基础镜像的 Docker 代码的例子:

# Use the official Golang base image
FROM golang:1.16

# Set working directory
WORKDIR /app

# Copy and build the Go application
COPY . .
RUN go build -o myapp

# Run the application
CMD ["./myapp"]

 

下面的 Docker 命令使用的是基于 Alpine Linux 的官方 Go 基础镜像的一个特定版本:
FROM golang:1.16-alpine
 

FROM docker 语句指定了要使用的基础镜像,在本例中是 golang:1.16-alpine。
 

2、优化资源分配

对于减少服务器负载和优化性能来说,高效分配资源到 Golang 容器是至关重要的。它对于提高应用性能、避免过度配置和实现可扩展性至关重要。如果资源(如 CPU 和内存)没有被有效分配,某些容器可能没有足够的资源,从而导致性能不佳。
 

通过优化资源分配,可以确保所有容器都足够的资源来保证它们顺利运行,这可以提高性能。Kubernetes 提供了为容器设置资源限制和请求的机制,这可以帮助防止资源的过度分配或分配不足。根据你的 Golang 应用程序的资源需求,仔细配置这些设置非常重要。
 

我们将创建一个 YAML 文件,为容器设置资源限制和请求,以演示如何优化资源分配:

#.....
#   .....
      containers:
        - name: my-golang-container
          image: my-golang-image
          resources:
            limits:
              cpu: 500m
              memory: 512Mi
            requests:
              cpu: 200m
              memory: 256Mi

 

在 YAML 文件中,容器被定义了具体的资源限制和对CPU和内存的请求。

  • resources 部分定义了 CPU、内存资源限制以及容器请求。
  • limits 指定了容器消耗的最大资源量。在本例,限制为 500 milliCPU(0.5 CPU 内核)以及 512MB内存。
  • requests 指定了容器运行所需的最小资源量。在本例,限制为 200 milliCPU(0.2 CPU 内核)以及256MB 内存。
     

在 Kubernetes 中,CPU 资源被分配给容器,以确保每个容器都能获得必要的计算能力。通过设置 CPU 限制和请求,可以防止容器消耗过多的 CPU,导致其他容器没有资源。这种对 CPU 资源的有效分配有助于确保你的应用程序顺利运行,并确保服务器负载保持稳定。
 

通过谨慎设置 CPU 和内存限制,容器内运行的应用程序的要求也会影响容器的大小。例如,如果应用需要大量内存来处理数据,可能需要相应地增加内存限制。在部署容器后,需要监控其资源使用并在必要时优化其大小。可以通过使用一些工具实现,如 Kubernetes 的 HPA 以基于资源使用状况来自动调整副本数量。
 

设置资源限制和请求的完整 Kubernetes 部署配置如下所示:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-golang-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-golang-app
  template:
    metadata:
      labels:
        app: my-golang-app
    spec:
      containers:
        - name: my-golang-container
          image: my-golang-image
          resources:
            limits:
              cpu: 500m
              memory: 512Mi
            requests:
              cpu: 200m
              memory: 256Mi

 

3、优化垃圾回收

垃圾回收(GC)是 Golang 应用中内存管理的重要方面。Kubernetes 提供了垃圾回收设置的配置选项,如 GOGC 环境变量,它能够控制触发垃圾回收周期的条件。通过优化垃圾回收设置,你可以减少内存使用并优化 Golang 容器的整体性能。
 

当在 Kubernetes 集群内运行 Golang app 时,未经优化的 GC 可能导致一些影响服务器性能的问题。最常见的问题是内存泄漏,进而使得 app 去消耗更多内存,从而导致更糟糕的性能和更高的服务器负载。
 

以下代码在 Golang 中优化了垃圾回收设置。在代码里,我们需要导入2个包:“os”和“fmt”。fmt 包用于格式化输入和输出,“os”包提供一个独立于平台的操作系统功能接口:

package main

import (
    "fmt"
    "os"
)

 

定义 Go 程序的主要功能:
func main() {
 

我们决定使用 fmt.Println() 函数将 "GOGC "变量的当前值发送到控制台。GOGC 变量是一个控制 Go 中垃圾回收器的设置。

 // Get current GOGC value
    gogc := os.Getenv("GOGC")
    fmt.Println("Current GOGC value:", gogc);

 

现在,我们可以将 GOGC 变量值设置为50。这会更改 Go 垃圾回收的行为,可能会提升程序性能:

  // Set GOGC value to 50
   os.Setenv("GOGC", "50")

   // Run your Golang application
   // ...
}

 

完整代码如下:

package main

import (
    "fmt"
    "os"
)

func main() {
    // Get current GOGC value
    gogc := os.Getenv("GOGC")
    fmt.Println("Current GOGC value:", gogc);

    // Set GOGC value to 50
    os.Setenv("GOGC", "50")

    // Run your Golang application
    // ...
}

 

通过 os.Setenv("GOGC", "50") ,将 GOGC 设置为50。GOGC 参数决定了 Go 中触发垃圾回收的 heap 的百分比。较低的值(如 50)意味着垃圾回收机制会被频繁触发,而较高的值(如100)意味着垃圾回收机制触发次数较少。
 

频繁的垃圾回收能够帮助确保程序只使用它所需要的内存,为在同一服务器上运行的其他进程释放资源。监控程序性能和在必要时调整 GOGC 值以平衡内存使用和垃圾回收十分重要。
 

4、使用连接池

连接池是一种允许重复使用数据库连接的技术,无需为每个请求建立新连接。这可以大大减少建立和拆除连接的开销,从而提高性能和减少服务器负载。
 

在 Kubernetes 环境中,连接池可以通过尽量减少对数据库的连接数来帮助降低服务器负载。当运行在 Kubernetes 的应用程序建立一个连接到数据库中,它使用特定资源数量,如 CPU、内存和网络带宽。这些资源是有限的,如果建立了太多连接就会被耗尽。
 

Golang提供了像“database/sql”这样的库,支持开箱即用的连接池。下面是如何在 Golang 中实现连接池的方法:
 

我们首先定义 package main 语句以将此 Go 代码文件标识为主包的一部分。创建可执行程序需要主包:
package main
 

我们还必须导入这个 Go 程序需要的外部包的列表。我们导入了标准库包 database/sql、fmt 和 log,以及第三方包 github.com/go-sql-driver/mysql,它为 database/sql 包提供了一个 MySQL 驱动:

import (
    "database/sql"
    "fmt"
    "log"
    "time"

    _ "github.com/go-sql-driver/mysql"
)

 

我们使用 sql.Open() 函数创建新数据库连接池,它需要2个参数:要使用的数据库驱动程序的名称(mysql)和一个包含用户证书、主机名、端口和数据库名称的连接器字符串。如果与数据库的连接失败,该程序会记录错误信息并且使用 log.Fatal() 的方式退出。否则,程序将关闭数据库连接推迟到函数结束:

    // Create a database connection pool
    db, err := sql.Open("mysql", "user:password@tcp(db-hostname:3306)/mydb")
    if err != nil {
        log.Fatal("Failed to connect to database:", err)
    }
    defer db.Close()

 

我们有一个连接池,但我们需要使用 db 对象上的方法来配置数据库连接池设置。SetMaxOpenConns() 方法设置了数据库的最大开放连接数(本例中为10),而 SetMaxIdleConns() 方法设置了在池中保留的最大空闲连接数(5)。最后,SetConnMaxLifetime() 方法设置了一个连接的最大寿命(本例中为5分钟):

    // Set connection pool settings
    db.SetMaxOpenConns(10)
    db.SetMaxIdleConns(5)
    db.SetConnMaxLifetime(time.Minute * 5)

    // Use the connection pool to perform database operations
    // ...
}

 

完整代码如下:

package main

import (
    "database/sql"
    "fmt"
    "log"
    "time"

    _ "github.com/go-sql-driver/mysql"
)

func main() {
    // Create a database connection pool
    db, err := sql.Open("mysql", "user:password@tcp(db-hostname:3306)/mydb")
    if err != nil {
        log.Fatal("Failed to connect to database:", err)
    }
    defer db.Close()

    // Set connection pool settings
    db.SetMaxOpenConns(10)
    db.SetMaxIdleConns(5)
    db.SetConnMaxLifetime(time.Minute * 5)

    // Use the connection pool to perform database operations
    // ...
}

 

确定 db.SetMaxOpenConns()db.SetMaxIdleConns()db.SetConnMaxLifetime() 方法的适当值取决于各种因素,如:

  • 数据库上的预期流量和工作负载
  • 预计的并发连接的数量
  • 数据库服务器的容量
  • 数据库查询的平均响应时间
  • 其他使用同一数据库的应用程序的预期负载和性能

 
总而言之,先设置这些值:

  • db.SetMaxOpenConns() 应该被设置为一个小于或等于数据库服务器可以处理的最大连接数的值。这个值应该设置得足够高,以处理预期的流量和工作量,但又足够低,以避免数据库服务器不堪重负。对于大多数网络应用来说,5到50之间的值通常是合理的。

  • db.SetMaxIdleConns() 应该被设置为一个足以处理预期的空闲连接的值。如果应用程序经常打开和关闭连接,这个值应该设置得更高。一个在2到10之间的值通常是合理的。

  • db.SetConnMaxLifetime() 应该被设置为一个大于数据库查询平均时间的值。这个值应该设置得足够高,以避免频繁的连接更换,但又要足够低,以防止长期闲置的连接不必要地消耗数据库资源。几分钟到几小时之间的值通常是合理的。

 
值得注意的是,这些值应该根据不断变化的工作负载和性能要求定期审查和调整。监控数据库服务器和应用程序的性能指标可以帮助确定这些值是否需要调整。
 

5、利用健康检查和 readiness 探针


健康检查和 readiness 探针
 

Kubernetes 提供了健康检查和 readiness 探针,允许你监控容器的状态,并确定它们是否准备好接收流量。通过利用这些功能,你可以确保只有健康和准备好的容器才能接收流量,减少由不健康或不准备好的容器引起的服务器负载。你可以在 Golang 应用中实现自定义的健康检查和 readiness 探针,以提供关于其状态的准确信息。
 

为了监控容器的状态,让我们从添加一个 readiness 探针开始:

....
    ....
        containers:
            ....
            readinessProbe:
            httpGet:
              path: /health
              port: 8080
            initialDelaySeconds: 10
            periodSeconds: 5

 

  • readinessProbe 定义容器的 readiness 探针。readiness 探针被用于检查容器是否准备好接收流量。

  • httpGet 指定 readiness 探针应该使用的 HTTP GET 请求以检查容器的健康状况。

  • path: /health 表示用于检查容器健康状况的 HTTP GET 请求的路径。在这种情况下,它被设置为"/health"。

  • initialDelaySeconds: 10 指定在容器启动后,在启动准备状态探针之前的等待秒数。在本例中,它被设置为10秒。

  • periodSeconds: 5 指定连续的 readiness 探针检查之间的时间间隔,单位是秒。在本例,它被设置为5秒。

 
现在,我们可以立刻添加 liveness 探针:

....
    ....
        containers:
            ....
            readinessProbe:
            .....
            livenessProbe:
            httpGet:
              path: /health
              port: 8080
            initialDelaySeconds: 30
            periodSeconds: 10

 

  • livenessProbe 定义容器的 liveness 探针。liveness 探针被用于检查容器是否正常运行和健康。

  • httpGet 指定 liveness 探针应该使用 HTTP GET 请求来检查容器健康状况。

  • path: /health 指用于 HTTP GET 请求的路径以检查容器的健康状况。在本例中,被设置为“/health”。

  • initialDelaySeconds: 10 设置了在容器启动后,liveness 探针启动之前所等待的秒数。在本例中为10秒。

  • periodSeconds: 5 指 liveness 探针连续检查的间隔时间,单位是秒。本例为5秒。

 
YAML 文件如下所示:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-golang-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-golang-app
  template:
    metadata:
      labels:
        app: my-golang-app
    spec:
      containers:
        - name: my-golang-container
          image: my-golang-image
          ports:
            - containerPort: 8080
          readinessProbe:
            httpGet:
              path: /health
              port: 8080
            initialDelaySeconds: 10
            periodSeconds: 5
          livenessProbe:
            httpGet:
              path: /health
              port: 8080
            initialDelaySeconds: 30
            periodSeconds: 10

 

为 Kubernetes 优化 Golang 应用程序需要仔细考虑资源分配、垃圾回收设置、网络通信和容器健康状况。通过遵循以上最佳实践,可以在 Kubernetes 中减少服务器负载和优化 Golang 应用程序的性能。通过利用 Kubernetes 和 Golang 应用的能力,您可以构建一个专为现代云环境优化好的可扩展、高性能的容器化应用程序。
 

减轻服务器负载技巧

1、实现自动弹性伸缩:自动弹性伸缩允许基于资源利用率来自动调整 pod 数量。使用 Kubernetes HPA 可以实现,该功能会基于 CPU 或内存的利用率来自动增加或减少 pod 数量。
 


 

如上图所示,集群自动伸缩可以在 Kubernetes 集群内自动配置新节点以处理增加的负载,确保高效的资源利用并防止服务器过载。
 

2、Kubernetes 的负载均衡:Kubernetes 提供内置的机制进行负载军训,如服务和 ingress。服务将 pod 暴露到网络并使用 round-robin 或 IP hash 等负载均衡算法,将进入的流量分配到多个pod上。
 

3、缓存和利用Kubernetes缓存系统:Kubernetes 提供缓存系统,如 Memcached 和 Redis,它们可以被部署为 pod 并用于存储经常访问的数据,减少重复查询后端服务的需要,降低服务器负载。
 

总结

总而言之,为 Kubernetes 优化 Golang 应用程序对于确保高效、可靠地在容器化环境内部署和运维至关重要。通过遵循文中提到的最佳实践,可以有效降低服务器负载,从而提升应用性能、提高成本效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/670241.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HOOPS Native Platform 2023 cRACK

将高级 3D 工作流程添加到桌面和移动应用程序 HOOPS 原生平台集成了三种用于桌面和移动应用程序开发的先进 HOOPS 技术,包括高性能图形 SDK、CAD 数据访问工具包和 3D 数据发布 API。 ​ ​ 构建 3D 原生应用 借助桌面和移动设备上的 HOOPS 原生平台,快…

一个初级程序员该在哪接项目练手?

作为一个初级程序员,想要通过兼职接单赚钱,离不开项目练手。但不得不说,初级程序员想要通过接私活获取收入还是相对比较困难的,如果对接私活比较感兴趣的朋友,可以参考这条路径: 在GitHub上学习大佬的项目…

【WebLogic】WebLogic 10.3.6.0部署应用包后报错

问题背景: WebLogic 10.3.6.0部署应用包后出现报错【posted content exceeds max post size】,此报错会导致应用部署的目标服务实例无法成功启动。 报错信息截图如下所示: 根据报错信息,查询相关MOS文档,发现问题原因是…

网络能成为AI加速器吗

网络能成为AI加速器吗 摘要 人工神经网络(NNs)在许多服务和应用中扮演越来越重要的角色,并对计算基础设施的工作负载做出了重要贡献。在用于延迟敏感的服务时,NNs通常由CPU处理,因为使用外部专用硬件加速器会效率低下…

Magisk hide/Denylist 核心原理分析 ROOT隐藏的实现浅论

前言 当手机安装magisk后,全局的挂载空间会受到变更,magisk给我们挂载上了一个su二进制,这就是我们能够访问到su命令的原因 无论是Magisk hide还是Denylist,我们都可以将它们的工作分成两个部分,第一个部分是如何监控…

vue2中引入天地图及相关配置

前言 项目中需要引入特殊用途的地图,发现天地图比高德地图、百度地图要更符合需求,于是看了看天地图。 正文 vue2项目中如何引入天地图并对相关的配置进行修改使用呢?官方给的4.0版本的使用说明。 引入: 进入到public/index.html中…

使用逻辑回归LogisticRegression来对我们自己的数据excel或者csv数据进行分类--------python程序代码,可直接运行

文章目录 一、逻辑回归LogisticRegression是什么?二、逻辑回归LogisticRegression进行分类的具体步骤二、逻辑回归LogisticRegression进行二分类的详细代码三、逻辑回归LogisticRegression的广泛用途总结 一、逻辑回归LogisticRegression是什么? 逻辑回…

小白白也能学会的 PyQt 教程 —— QRadioButton 介绍以及基本使用

文章目录 一、QRadioButton快速入门1. QRadioButton简介2. QRadioButton快速上手 二、响应单选按钮点击事件1、信号和槽机制:2、创建槽函数来响应单选按钮点击:3、示例:执行特定操作或显示相关内容: 三、单选按钮的常用功能和属性…

三维形体投影面积

🎈 算法并不一定都是很难的题目,也有很多只是一些代码技巧,多进行一些算法题目的练习,可以帮助我们开阔解题思路,提升我们的逻辑思维能力,也可以将一些算法思维结合到业务代码的编写思考中。简而言之&#…

petalinux 生成SDK报错排除

AAA: 在项目文件下新建Qt5文件夹文件夹内新建文件并且设置对应参数 文件夹路径: project-spec/meta-user/recipes-qt/qt5 新建文件 vim ./qt5/qt3d_%.bbappend vim ./qt5/qtquickcontrols2_%.bbappend vim ./qt5/qtserialbus_%.bbappend 文件内容 qt3d_%.bbap…

完美解决Non-terminating decimal expansion; no exact representable decimal result.异常

我们在使用BigDecimal进行精确计算时常常会出现Non-terminating decimal expansion; no exact representable decimal result.异常。 出现这个异常的原因在于 BigDecimal 是不可变的、任意精度的有符号十进制数,所以可以做精确计算。但在除法中,准确的商…

ernie-layout笔记

1: 识别文档中文字以及准确的对这些文字排序是必须的一步骤 采用 OCR技术识别文字以及对应的图像坐标信息,光栅扫描以生成输入序列按照从左到右,从上到下的顺序;但是以上方法针对复杂的结构就会出现问题;因此文章使用了Document-P…

Spring源码核心剖析 | 京东云技术团队

前言 SpringAOP作为Spring最核心的能力之一,其重要性不言而喻。然后需要知道的是AOP并不只是Spring特有的功能,而是一种思想,一种通用的功能。而SpringAOP只是在AOP的基础上将能力集成到SpringIOC中,使其作为bean的一种&#xff…

算法程序设计 之 循环赛日程表(2/8)

一、实验目的: 理解并掌握分治算法的基本思想和设计步骤。 二、实验内容 设有n个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次; (2&#xff0…

HOOPS Web SDK 2023 Crack

在 HOOPS WEB 平台上释放 3D 的力量 HOOPS Web 平台加速 Web 应用程序开发,提供先进的 3D Web 可视化、准确快速的 CAD 数据访问和 3D 数据发布软件开发工具包 (SDK)。 构建 3D WEB 应用程序 借助 HOOPS Web 平台,快速构建适用于…

值得收藏的 10个 Android 手机恢复丢失文件的工具榜单

尽管我们尽可能避免这种情况,但有时我们还是会不小心删除 Android 设备上的重要文件。无论是照片、视频、文档还是任何其他形式的数据,数据丢失都会带来巨大的痛苦。不幸的是,Android 设备没有内置恢复工具。但是,有一些第三方恢复…

里程碑式突破!关键的薛定谔猫编码能带来更好的量子比特

​ 薛定谔的猫编码插图(图片来源:网络) 来自瑞士洛桑联邦理工学院(EPFL)的科学家提出了一种突破性的量子计算容错方案,称为“关键的薛定谔猫编码”。这种新颖的系统在混合状态下运行,具有强大的…

容灾与备份区别、灾备技术、容灾体系规划

1.容灾备份的区别 容灾 (Disaster Tolerance):就是在上述的灾难发生时,在保证生产系统的数据尽量少丢失的情况下,保持生存系统的业务不间断地运行。 容错 (Fault Tolerance):指在计…

激光显示技术路线之争:超级全色激光技术ALPD5.0更先进

5月以来,智能投影市场爆发的激光显示技术路线之争愈演愈烈,各厂家带领自有的技术路线你方唱罢我登场,犹如一出愈演愈烈的大戏,吸引了业内外各界的目光。 从极米在5月10日2023春季新品发布会上率先向三色激光技术发难,再到坚果投影首席产品官在朋友圈发文炮轰极米的技术路线,随…

MarkDown常用功能

快捷键 撤销:Ctrl/Command Z 重做:Ctrl/Command Y 加粗:Ctrl/Command B 斜体:Ctrl/Command I 标题:Ctrl/Command Shift H 无序列表:Ctrl/Command Shift U 有序列表:Ctrl/Command Shif…