软件架构的演变与趋势(软件架构演变的阶段、综合案例分析:在线电商平台架构演变、开发补充)

随着软件开发技术的不断进步,软件架构从最初的简单结构演变为如今的复杂系统,架构设计不再是简单的代码组合,而是战略性的系统设计,确保系统具备可扩展性、可靠性、安全性和可维护性。

文章目录

  • 1. 软件架构演变的阶段
    • 1.1 单体架构 (Monolithic Architecture)
      • 示例:
    • 1.2 分层架构 (Layered Architecture)
      • 示例:
    • 1.3 微服务架构 (Microservices Architecture)
      • 示例:
    • 1.4 服务网格架构 (Service Mesh Architecture)
      • 示例:
    • 1.5 云原生架构 (Cloud-Native Architecture)
      • 示例:
  • 2. 综合案例分析:在线电商平台架构演变
    • 阶段 1:单体架构 —— 系统初创期
    • 阶段 2:微服务架构 —— 业务增长期
    • 阶段 3:服务网格架构 —— 稳定发展期
    • 阶段 4:云原生架构 —— 大规模扩展期
      • 总结
  • 3. 开发补充
    • 3.1 渐进式架构演进
    • 3.2 结合团队能力与组织结构
    • 3.3 技术选型要务实
    • 3.4 可观测性与监控体系建设
    • 3.5 业务需求驱动与架构技术演进的平衡

1. 软件架构演变的阶段

软件架构的演变可以大致分为以下几个阶段:

阶段主要特点典型案例
单体架构所有功能集中在一个代码库中,模块之间紧耦合。早期的银行系统,CRM系统
分层架构通过分离关注点,拆分为表示层、业务逻辑层和数据访问层。MVC架构模式,早期的ERP系统
微服务架构将系统划分为多个独立部署的小服务,服务之间通过API通信。Netflix, Amazon
服务网格架构专注于微服务间的通信管理、安全、负载均衡等问题。Istio, Linkerd
云原生架构利用云计算的能力构建弹性、高可用的分布式系统。Kubernetes,AWS Lambda

1.1 单体架构 (Monolithic Architecture)

在软件开发的早期,单体架构是最主流的设计。所有的功能和模块都包含在一个大代码库中,系统模块之间紧耦合。这种架构简单、易于开发,但随着系统复杂度增加,维护和扩展难度极大。

  • 优点:

    • 开发初期简单,易于部署。
    • 整个应用作为一个整体进行测试和交付。
  • 缺点:

    • 随着应用增长,代码库变得庞大且难以维护。
    • 发布周期缓慢,任何小变动都需要重新部署整个应用。
    • 难以做到弹性扩展(scale horizontally)。

示例:

+--------------------+
|                    |
|    单体应用         |
|                    |
+--------------------+

在这个模型中,所有业务逻辑、数据库访问、UI渲染等都位于一个应用程序中。任何模块的更改都需要重新构建和部署整个系统。

1.2 分层架构 (Layered Architecture)

为了解决单体架构中关注点分离不清的问题,分层架构通过分离关注点,将系统分为表示层(UI层)、业务逻辑层(Service层)和数据访问层(DAO层)。这种方式促进了代码的可维护性和可扩展性。

  • 优点:

    • 模块化设计,便于开发和维护。
    • 通过明确的层次结构,每一层可以独立更改和替换。
  • 缺点:

    • 层与层之间的依赖导致系统的复杂性增加。
    • 系统仍然是一个整体,扩展和部署问题依旧存在。

示例:

+--------------------+
|      表示层(UI层)  |
+--------------------+
|  业务逻辑层(Service层) |
+--------------------+
|  数据访问层(DAO层) |
+--------------------+

1.3 微服务架构 (Microservices Architecture)

随着企业应用规模的进一步扩大,单体架构和分层架构的缺点愈发明显。微服务架构将一个大系统拆分为多个独立部署的小服务,每个服务专注于一个功能,并通过轻量的通信协议(如HTTP REST, gRPC)进行交互。

  • 优点:

    • 每个服务可以独立开发、部署和扩展。
    • 增强了系统的容错性,一个服务的故障不会影响到其他服务。
    • 支持技术多样性,可以针对不同的服务使用最合适的技术栈。
  • 缺点:

    • 服务间通信复杂度增加,可能需要设计合适的API网关。
    • 数据一致性和事务处理变得复杂。
    • 分布式系统带来的运维复杂性增加。

示例:

+-------------------+      +-------------------+
|     服务A          |  --> |     服务B          |
+-------------------+      +-------------------+↓                     ↓+-------------+      +--------------+|   API 网关   | <--> |    服务C       |+-------------+      +--------------+

1.4 服务网格架构 (Service Mesh Architecture)

在微服务架构的基础上,随着服务数量的不断增加,服务间的通信、负载均衡、安全、认证等问题日益突出。服务网格架构为了解决这些问题应运而生。它为服务之间的通信提供了一种专用的基础设施层,独立于业务逻辑之外。

  • 优点:

    • 提供全面的服务发现、流量管理和安全控制。
    • 提高了微服务间的可观察性和可靠性。
  • 缺点:

    • 增加了架构复杂性,管理和运维成本上升。
    • 对团队的技术要求更高,通常需要专门的DevOps团队。

示例:

+-------------------------------------------+
|                                           |
|                服务网格                   |
|   +---------+  +---------+  +---------+   |
|   |  服务A  |  |  服务B  |  |  服务C  |   |
|   +---------+  +---------+  +---------+   |
|                                           |
+-------------------------------------------+

1.5 云原生架构 (Cloud-Native Architecture)

随着云计算的广泛应用,企业越来越多地采用云原生架构来构建弹性、高可用的分布式系统。云原生架构通常结合容器化技术(如Docker)、编排工具(如Kubernetes)以及无服务器架构(Serverless)来构建和部署应用。

  • 优点:

    • 自动扩展、容错机制和高可用性。
    • 弹性架构,能够应对动态的工作负载需求。
    • DevOps友好,支持快速迭代和持续集成。
  • 缺点:

    • 依赖于云服务提供商,可能存在供应商锁定问题。
    • 开发和运维门槛较高。

示例:

+-------------------------------+
|    Kubernetes 编排平台         |
+-------------------------------+
|   +---------+   +---------+    |
|   | 容器A   |   | 容器B   |    |
|   +---------+   +---------+    |
+-------------------------------+

2. 综合案例分析:在线电商平台架构演变

让我们以一个假设的 在线电商平台 为例,来展示软件架构如何随着业务需求和技术挑战逐渐演变。这个案例可以帮助理解从单体架构到微服务架构,再到云原生架构的过程。

阶段 1:单体架构 —— 系统初创期

背景
当电商平台刚刚上线时,团队规模较小,业务需求较为简单,主要集中在用户登录、商品展示、购物车和订单等基础功能上。此时,系统采用单体架构,所有功能都集中在一个代码库中,部署一个大规模的应用程序。

架构特点

  • 模块:用户、商品、购物车、订单等功能模块都在同一个应用内。
  • 数据库:一个共享的关系型数据库,用于存储所有模块的数据。
  • 发布周期:每次发布时,所有代码一起打包和部署。
+-------------------------------------------------+
|                    单体架构                     |
|   +----------+  +-----------+  +-------------+  |
|   |  用户模块  |  |  商品模块  |  |  订单模块   |  |
|   +----------+  +-----------+  +-------------+  |
|                 +--------------------+          |
|                 | 共享数据库            |        |
|                 +--------------------+          |
+-------------------------------------------------+

优点

  • 开发初期简单,团队不需要复杂的架构设计,快速上线。
  • 一个部署包,方便管理和调试。

缺点

  • 扩展性差:系统负载增加时,整个应用只能进行垂直扩展(例如升级服务器配置),无法单独扩展某个模块。
  • 发布效率低:每次改动都需要重新部署整个应用,即使修改的只是一个模块。
  • 维护难度大:随着代码规模增长,模块间的耦合变得越来越紧,bug容易传播到不同模块。

业务挑战

  • 用户量快速增长,尤其是在促销期间,系统负载激增,影响了整个网站的性能。
  • 每次发布新功能或修复bug时,都需要重新构建整个应用,导致上线时间变长。

阶段 2:微服务架构 —— 业务增长期

背景
随着电商平台的业务扩展,功能不断增加,包括用户个性化推荐、订单管理优化、库存管理等。单体架构难以适应快速变化的需求,于是系统逐步演变为微服务架构。每个模块被拆分为独立的微服务,负责单一功能,并通过API进行通信。

架构特点

  • 模块解耦:每个服务独立开发和部署,比如用户服务、订单服务、商品服务、库存服务等。
  • 数据库分离:每个服务拥有自己的数据库或数据库表,避免数据访问的冲突。
  • 通信方式:服务之间通过轻量协议(如REST API或gRPC)进行通信。
+-------------------------------------------+
|                API 网关                   |
+--------+-----------+----------+-----------+
|        |           |          |           |
| 用户服务 |  商品服务  | 订单服务  | 库存服务  |
+--------+-----------+----------+-----------+
| 数据库 1 |  数据库 2 | 数据库 3 | 数据库 4   |
+--------+-----------+----------+-----------+

优点

  • 弹性扩展:可以根据流量动态扩展不同服务。例如在促销活动期间,仅扩展商品服务和订单服务,而不用扩展整个系统。
  • 独立部署:每个微服务可以独立部署,减少了发布的复杂性。只需更新有变化的服务,而不是重新部署整个系统。
  • 容错性:某个服务的故障不会影响整个系统,其他服务可以正常运行。

缺点

  • 复杂性增加:微服务之间的通信、服务发现、负载均衡等问题增加了系统的复杂性。需要专门设计API网关、服务注册与发现机制。
  • 数据一致性:由于服务分离,跨服务的数据一致性变得复杂,通常需要引入分布式事务或者最终一致性方案。

业务挑战

  • 系统需要处理更多的跨服务通信,例如订单服务需要调用库存服务检查商品库存,用户服务需要处理用户的订单历史等。
  • 由于数据分散到不同服务,如何保证数据一致性和事务性成为新的挑战。
  • 系统运维的复杂度显著增加,需要对每个服务进行独立的监控和管理。

阶段 3:服务网格架构 —— 稳定发展期

背景
随着电商平台的用户量不断增长,微服务之间的依赖关系也变得越来越复杂。团队面临微服务之间通信、流量控制、安全管理和监控等难题。此时,平台引入了服务网格架构,以更好地管理微服务之间的通信、安全和可观测性。

架构特点

  • 服务网格:通过引入服务网格(如Istio或Linkerd),系统不再需要在微服务内部处理复杂的通信逻辑。服务网格负责流量控制、认证、负载均衡和监控等功能。
  • Sidecar 代理模式:每个微服务旁边部署一个sidecar代理,负责服务间的通信。这样业务代码可以专注于核心功能,而不必处理通信、安全等问题。
+-------------------------------------------+
|                服务网格                   |
|   +---------+  +---------+  +---------+   |
|   | 用户服务 |  | 订单服务 |  | 商品服务 |   |
|   +----+----+  +----+----+  +----+----+   |
|        |              |             |     |
|  +-----+----+    +----+-----+   +----+----+|
|  | Sidecar  |    | Sidecar  |   | Sidecar  |
+--+----------+----+----------+---+----------+

优点

  • 统一管理:服务网格提供统一的管理平台,控制服务间的流量、监控和安全策略,简化了微服务管理。
  • 负载均衡和流量分配:能够基于服务网格自动进行流量控制,如蓝绿发布、灰度发布、服务重试等。
  • 服务可观察性:可以通过服务网格收集各个服务的通信数据,提供详细的监控、日志和分布式追踪信息,增强系统的可观察性。

缺点

  • 引入复杂性:虽然服务网格简化了业务代码,但整体架构的复杂性增加,运维和管理服务网格本身也需要经验和能力。
  • 性能开销:Sidecar模式会带来一定的网络和计算开销,可能影响系统性能。

业务挑战

  • 系统内部服务之间的通信和安全变得复杂,需要通过流量控制、认证和加密来保障通信的可靠性和安全性。
  • 服务网格的引入带来了运维和管理的额外成本,需要确保服务网格的高可用性和性能。

阶段 4:云原生架构 —— 大规模扩展期

背景
为了应对电商平台不断增长的用户需求,系统需要具备高弹性和动态扩展能力。同时,业务不再局限于单一市场,平台需要全球部署和跨区域的高可用性支持。此时,引入云原生架构,结合容器化、Kubernetes编排和Serverless架构来实现全自动化扩展和部署。

架构特点

  • 容器化:所有微服务都以容器的形式运行,确保环境的一致性和隔离性。
  • Kubernetes 编排:通过Kubernetes来进行容器的自动化管理,实现服务的动态扩展、弹性负载和自动恢复。
  • 无服务器架构:部分服务可以采用Serverless架构(如AWS Lambda),按需执行函数,进一步提高资源利用率和成本效益。
+--------------------------------------------------+
|          Kubernetes 集群                          |
+-----------------------+--------------------------+
|   +---------+   +---------+   +---------+        |
|   | 容器A   |   | 容器B   |   | Lambda  |        |
|   +---------+   +---------+   +---------+        |
|   自动扩展、负载均衡、服务发现、弹性伸缩          |
+--------------------------------------------------+

优点

  • 弹性和可扩展性:系统可以根据实际的流量需求自动扩展或缩减资源,提升了服务的弹性和可靠性。
  • 快速部署和迭代:通过容器和编排工具,能够快速部署和更新

系统,支持持续交付和快速迭代。

  • 全球可用性:通过云平台的支持,可以轻松实现跨区域的服务部署,提供全球用户的高可用性服务。

缺点

  • 依赖云平台:依赖于云提供商的基础设施,可能存在供应商锁定问题。
  • 运维复杂性:尽管云原生架构带来了自动化和弹性,但对于运维团队来说,管理Kubernetes集群、容器和Serverless等组件仍然需要较高的技术门槛。

业务挑战

  • 全球用户的高并发需求和复杂的跨区域部署要求系统具备高度的弹性和可靠性。
  • 云原生架构虽然解决了资源弹性问题,但如何优化资源利用率和成本控制仍然是一个难题。

总结

通过这一案例分析,我们可以清晰看到系统架构的演变过程。架构的演进是伴随业务增长和技术挑战逐步进行的,而每种架构都有其适用的阶段和场景。在架构设计过程中,团队需要结合实际业务需求、技术能力和未来发展计划,选择合适的架构模式,逐步引入新技术,以确保系统具备良好的扩展性、稳定性和维护性。

3. 开发补充

在架构设计的过程中,架构的演变并不是一蹴而就的,往往需要结合业务需求、技术发展趋势和团队的技术能力,逐步引入合适的架构模式。以下是我从开发中总结的一些经验,供大家在设计系统时参考。

3.1 渐进式架构演进

架构的演进不是一次性的大规模重构,而是一个渐进的过程。在系统初创阶段,单体架构往往是最简单、最合适的选择,因为它易于开发、测试和部署。随着系统的发展,业务复杂度增加,才逐步引入微服务、服务网格或云原生架构。

  • 避免过早优化:不要一开始就引入复杂的架构,特别是在业务和技术不成熟时。过早地引入微服务或云原生架构可能带来不必要的复杂性和技术负担。
  • 分阶段重构:将架构重构作为一个持续的过程,逐步将单体架构拆分为独立的服务或模块,保证每次重构带来的风险最小化。

3.2 结合团队能力与组织结构

架构不仅是技术选择,还应反映团队的组织结构和能力。在不同的架构演变阶段,团队能力和组织形式将直接影响到架构设计的复杂度和成功率。

  • 组织适配架构:在大规模系统中,微服务架构往往反映了团队的组织结构。每个独立的微服务往往由一个团队独立开发和维护。因此,在引入微服务架构时,需要保证团队之间的职责清晰且能独立负责各自的服务。
  • 技术培训与引导:随着架构的演进,引入新的技术(如Kubernetes、服务网格等)需要确保团队有足够的能力进行维护和开发。这不仅包括开发人员,还需要DevOps团队的支持。

3.3 技术选型要务实

技术选型是架构演变过程中极其重要的一环。虽然新兴技术(如Serverless、服务网格、云原生等)非常流行,但并不总是最优选择。务实的技术选型需要结合项目的实际需求、团队技术栈以及可持续发展计划。

  • 业务优先:在做技术选型时,首先考虑的是业务需求。比如,如果系统目前的瓶颈是性能问题,那么优先选择能解决性能问题的技术,而非追求时髦的新技术。
  • 技术稳定性:尽量选择有较好社区支持、经过验证的技术栈,以减少日后的维护成本。对于非常前沿的技术,除非有明确的业务需求,不应轻易引入。

3.4 可观测性与监控体系建设

随着架构的复杂化(特别是在微服务和云原生架构下),系统的可观测性和监控变得至关重要。一个分布式系统的故障排查要比单体架构复杂得多,因此需要确保系统具有良好的监控、日志和追踪体系。

  • 全链路追踪:在分布式系统中,引入全链路追踪工具(如Jaeger、Zipkin),能够帮助开发者快速定位跨服务调用中的性能瓶颈和故障原因。
  • 监控和告警:搭建完善的监控系统(如Prometheus、Grafana)来跟踪服务的健康状态、响应时间、CPU和内存使用情况,及时发现和应对问题。

3.5 业务需求驱动与架构技术演进的平衡

架构演进往往是为了应对快速变化的业务需求,但过度的技术驱动架构变革可能会导致与实际业务需求脱节。因此,架构设计应以业务需求为主导,技术演进应服务于业务的长期发展。

  • 适时引入新技术:技术的引入应服务于业务需求,而非为新技术而引入。如果当前架构能够满足业务需求,那么可以推迟引入复杂的微服务、云原生架构等。
  • 技术债务的管理:在架构演进过程中,可能会积累一些技术债务,这些债务应在合适的时候得到清理,以避免影响系统的可维护性和稳定性。

通过以上几点补充,可以看到,架构演进不仅仅是一个技术问题,它需要结合实际业务需求、团队能力和技术栈,稳步推进。同时,在开发过程中,务实的技术选型、有效的监控和观测系统,以及团队能力的培养,都是确保架构演进成功的重要因素。

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

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

相关文章

汽车总线之----CAN总线

Introduction 早期的车辆网络是点对点的模式&#xff0c;臃肿繁杂且效率低下 现在是以总线的模式&#xff0c;很明显线路简洁清爽了很多。 高速CAN可以支持1M/s的速率&#xff0c;低速CAN可以支持125k/s的速率 CAN节点的内部结构图(Structure of CAN-Bus and electronic C…

*C++:list

一.list简介 1. list 是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list 的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向其前一个元素和后一个元素…

redisson 延迟队列实现任务过期监听

一、需求&#xff1a; 任务超过一个小时以后&#xff0c;如果还为待执行状态&#xff0c;则自动转为结束状态。 二、实现: 创建延迟队列的监听任务RedisDelayedQueueListener&#xff0c;消费延迟队列&#xff1b;创建新增延迟队列的类&#xff0c;用于创建延迟队列&#xf…

ACM MM24 | Hi3D: 3D生成领域再突破!新视角生成和高分辨率生成双SOTA(复旦智象等)

文章链接&#xff1a;https://arxiv.org/pdf/2409.07452 Github 链接&#xff1a;https://github.com/yanghb22-fdu/Hi3D-Official 亮点直击 本文提出了高分辨率图像到3D模型&#xff08;Hi3D&#xff09;&#xff0c;这是一种基于视频扩散的新范式&#xff0c;将单个图像重新定…

Codeforces Round 974 (Div. 3) G. Milky Days

题目 题解 #include<bits/stdc.h> using namespace std; #define int long long #define ll long long #define ld long double #define pb push_back #define fi first #define se second #define pii pair<int, int> #define lson p << 1 #define rson p …

Mapper核心配置文件

文章目录 environment 数据库环境typeAlias 起别名 environment 数据库环境 typeAlias 起别名

PMBOK® 第六版 估算活动持续时间

目录 读后感—PMBOK第六版 目录 在项目管理中&#xff0c;尤其是在软件开发这样的复杂项目中&#xff0c;工作内容是多种多样的。从需求分析、设计、编码到测试和部署&#xff0c;每个阶段都有其独特的挑战和不确定性。 没有人能独自完成所有估算工作并做到绝对精准。估算涉及…

股指期货交割方式是什么?

说起股指期货&#xff0c;这可是个高大上的金融玩意儿。咱们平时买卖股票&#xff0c;那是看准了哪只股就下手&#xff0c;赚了就卖&#xff0c;赔了就扛&#xff0c;挺直接的。但股指期货呢&#xff0c;它玩的是未来的预期&#xff0c;就像是你跟人打赌明天天气好不好&#xf…

开源推理库介绍:ZML,Distributed Llama,EXO | LeetTalk Daily

“LeetTalk Daily”&#xff0c;每日科技前沿&#xff0c;由LeetTools AI精心筛选&#xff0c;为您带来最新鲜、最具洞察力的科技新闻。 开源推理库的出现为机器学习模型的部署、监控和扩展提供了强大的支持。我们介绍三个重要的开源推理库&#xff1a;ZML、Distributed Llama …

机器人速度雅可比矩阵求解(2自由度平面关节机器人)

关节速度和末端速度空间的映射需要计算雅可比矩阵的逆矩阵,在博途PLC里如何计算一个方阵的逆矩阵,大家可以参考下面这篇文章: 博途PLC矩阵求逆 矩阵求逆 博图SCL_博图矩阵运算-CSDN博客文章浏览阅读839次。本文介绍如何用C语言实现矩阵求逆的过程,详细解析了相关代码,适…

Spring实战——入门讲解

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 Spring介绍 Spring实战的入门讲解主要涵盖了Spring框架的基本概念、核心功能以及应用场景。以下是关于Spring实战入门的具体介绍&#xff1a; Spring框架概述&#xff1a;Spring是一个轻量级的Java开发框架…

【有啥问啥】探索累计推理(Cumulative Reasoning, CR)——大型语言模型中的复杂推理新框架

探索累计推理&#xff08;Cumulative Reasoning, CR&#xff09;——大型语言模型中的复杂推理新框架 引言 随着人工智能&#xff08;AI&#xff09;的快速发展&#xff0c;大型语言模型&#xff08;LLMs&#xff09;在自然语言处理上的表现令人瞩目。然而&#xff0c;LLMs在…

【HTTPS】—— HTTPS协议原理详解

目录 &#xff08;一&#xff09;Https是什么 1.1 什么是加密 1.2 为什么要加密 1.3 常见的加密方式 1.4 数据摘要 && 数据指纹 &#xff08;二&#xff09;Https工作过程研究 方案一&#xff1a;只使用对称秘钥 方案二&#xff1a;只使用非对称秘钥 方案三&a…

14年数据结构

第一题 解析&#xff1a; 求时间复杂度就是看程序执行了多少次。 假设最外层执行了k次&#xff0c;我们看终止条件是kn&#xff0c;则&#xff1a; 有, 内层是一个j1到jn的循环&#xff0c;显然执行了n次。 总的时间复杂度是内层外层 答案选C。 第二题 解析&#xff1a; 一步一…

如何用ChatGPT制作一款手机游戏应用

有没有想过自己做一款手机游戏&#xff0c;并生成apk手机应用呢&#xff1f;有了人工智能&#xff0c;这一切就成为可能。今天&#xff0c;我们就使用ChatGPT来创建一个简单的井字棋游戏&#xff08;Tic-Tac-Toe&#xff09;&#xff0c;其实这个过程非常轻松且高效。 通过Cha…

【Linux】常用指令【更详细,带实操】

Linux全套讲解系列&#xff0c;参考视频-B站韩顺平&#xff0c;本文的讲解更为详细 目录 一、文件目录指令 1、cd【change directory】指令 ​ 2、mkdir【make dir..】指令​ 3、cp【copy】指令 ​ 4、rm【remove】指令 5、mv【move】指令 6、cat指令和more指令 7、less和…

【Python】Maya:为人类打造的 Python 日期时间库

不知道少了什么&#xff0c;总感觉没有以前快乐。 在编程中处理日期和时间总是一个挑战&#xff0c;尤其是当涉及到时间和时区的转换时。Maya 是一个由 Kenneth Reitz 开发的 Python 库&#xff0c;旨在简化日期时间的处理&#xff0c;使其对人类开发者更加友好。本文将介绍 M…

【二等奖论文】2024年华为杯研究生数学建模F题成品论文(后续会更新)

您的点赞收藏是我继续更新的最大动力! 一定要点击如下的卡片&#xff0c;那是获取资料的入口&#xff01; 点击链接获取【2024华为杯研赛资料汇总】&#xff1a; https://qm.qq.com/q/alQjz21npu https://qm.qq.com/q/alQjz21npu X射线脉冲星光子到达时间建模 摘要 脉冲星是…

2024年最新前端工程师 TypeScript 基础知识点详细教程(更新中)

1. TypeScript 概述 TypeScript 是由微软开发的、基于 JavaScript 的一种强类型编程语言。它是在 JavaScript 的基础上添加了静态类型检查、面向对象编程等功能的超集&#xff0c;最终会被编译为纯 JavaScript 代码。由于其扩展了 JavaScript 的功能&#xff0c;TypeScript 特…

【Linux 21】线程安全

文章目录 &#x1f308; 一、线程互斥⭐ 1. 线程间互斥的相关概念&#x1f319; 1.1 临界资源和临界区&#x1f319; 1.2 互斥和原子性 ⭐ 2. 互斥量 mutex⭐ 3. 互斥量接口&#x1f319; 3.1 初始化互斥量&#x1f319; 3.2 销毁互斥量&#x1f319; 3.3 互斥量上锁&#x1f3…