43、云开发与架构:从混合解决方案到设计模式

云开发与架构:从混合解决方案到设计模式

1. 混合、合规与消息传递基础

在云开发领域,混合解决方案、合规性以及消息传递是至关重要的方面。首先,我们来了解一些关键术语,如高级消息队列协议(AMQP)、灾难恢复(DR)、身份验证(AuthN)等。

混合解决方案是云资源与本地或其他私有数据中心资源的组合,涵盖安全、网络、计算和数据等多个方面。例如,Azure Active Directory、Azure Virtual Network、Azure Virtual Machine 等都可用于创建混合解决方案。

Azure Policy 是一项强大的功能,管理员可通过它对管理组、订阅或资源组实施限制,这些限制可与合规标准或企业需求对齐,比如要求所有暴露 HTTP 接口的端点使用 TLS 1.2。

使用标签可以进一步组织已配置的 Azure 资源。当资源组无法满足需求时,标签可作为额外的标记方式,帮助区分开发、测试或生产环境的资源。

Security Center 是管理安全配置和监控 Azure 资源的核心位置。在这里,你可以获取合规性问题报告、合规性分数,以及如何配置不合规资源的指导。

Service Bus 是基于消息的存储队列,用于解耦 IT 解决方案。发送者将消息放入队列,队列可监控重复消息,并按接收顺序存储和处理。多个接收者可以并行处理同一队列中的消息,或者通过 Service Bus 主题,多个接收者可以根据自身需求接收和处理消息。

Event Grid 适用于遥测、流数据或大数据消息处理。Event Hub 可以有单个分区,生产者将消息添加到分区中,由单个消费者组和单个接收者进行处理。最多可配置 32 个分区,每个分区都有一个消费者,这使得处理此类数据的并行性、速度和效率极高。

以下是一些关键术语的总结表格:
| 术语 | 描述 |
| — | — |
| Advanced Message Queueing Protocol (AMQP) | 高级消息队列协议 |
| disaster recovery (DR) | 灾难恢复 |
| authentication (AuthN) | 身份验证 |
| authorization (AuthZ) | 授权 |
| Azure Policy | 用于实施资源限制的功能 |
| Security Center | 管理安全配置和监控资源的地方 |
| Service Bus | 消息存储队列,用于解耦 IT 解决方案 |
| Event Grid | 用于遥测、流数据或大数据消息处理 |

2. 相关概念的应用与实践

下面通过一些问题来加深对这些概念的理解:
1. 以下哪个不能使用 Azure 产品创建混合解决方案?
- A. Azure Active Directory
- B. Azure Virtual Network
- C. Azure Policy
- D. Azure Virtual Machine
答案是 C,Azure Policy 主要用于实施限制,而非直接用于创建混合解决方案。
2. 哪些网络产品有助于创建混合网络解决方案?
- A. API Management
- B. Network Watcher
- C. Hybrid Connection Manager
- D. Single - sign on
答案是 B 和 C,Network Watcher 可监控网络,Hybrid Connection Manager 有助于建立混合连接。
3. 以下哪些有助于实施和监控合规标准?
- A. Azure Compliance Standards
- B. Azure Policy
- C. Security Center
- D. Azure Blueprint
答案是 A、B、C 和 D,它们都在合规性方面发挥着重要作用。
4. 以下哪些有助于分组资源,便于管理和概览?
- A. 资源组
- B. Event Grid 域
- C. 订阅
- D. 标签
答案是 A、C 和 D,资源组、订阅和标签都可用于资源分组。
5. 判断题:可靠性意味着系统可以从瞬态故障中快速恢复。弹性是可靠系统的结果。
- A. 正确
- B. 错误
答案是 B,可靠性强调系统的稳定性,弹性是指系统在故障时的恢复能力。
6. 判断题:GDPR 和 PIPA 是数据隐私合规标准。
- A. 正确
- B. 错误
答案是 A,它们都是重要的数据隐私合规标准。
7. Security Center 中可配置的功能有哪些?
- A. 策略和合规性分析
- B. 资源安全卫生
- C. 多因素认证(MFA)
- D. 威胁检测
答案是 A、B、C 和 D,这些功能都可以在 Security Center 中进行配置。
8. 判断题:一旦 Azure 产品配置被标记为不符合其关联的合规标准,Security Center 会自动强制执行合规标准。
- A. 正确
- B. 错误
答案是 B,Security Center 会提供报告和指导,但不会自动强制执行。
9. 如果要将流数据或遥测信息摄入数据源并使用消息服务进行排队,应选择哪个?
- A. Event Grid
- B. Event Hub
- C. Service Bus
- D. Azure Storage Queue
答案是 B,Event Hub 专门用于处理流数据。
10. 如果需要按接收顺序处理队列中的消息,应选择哪个 Azure 消息服务?
- A. Azure Storage Queue
- B. Event Hub
- C. Event Grid
- D. Service Bus
答案是 D,Service Bus 可以确保消息按顺序处理。

3. 云开发的架构风格

在云开发中,架构风格的选择至关重要。常见的架构风格包括:
- Multitiered (n - tier) :这是最传统的架构风格,将应用角色按物理机器划分。客户端连接到 Web 服务器,Web 服务器再连接到应用服务器和/或数据库服务器。Azure Virtual Machines 可用于实现这种架构。
- Big Data :用于非结构化数据的收集和分析,Azure Cosmos DB、Azure Synapse Analytics 和 Data Lake Analytics 等产品可支持此类架构。
- Microservices :将业务逻辑按服务划分,通过 API 暴露。Service Fabric 和 Azure Kubernetes Service (AKS) 是实现微服务架构的常用产品。
- Web - queue - worker :使用消息队列解耦 IT 解决方案,Service Bus 和 Azure Storage Queue 可用于实现这种架构。
- Event - driven :生产者创建数据,消费者接收和处理数据。Event Hub 和 Event Grid 适用于事件驱动架构。
- Big Compute :需要大量内存或 CPU 的数据分析,Azure Batch(又名 HPC)和 Azure Virtual Machines 可满足此类需求。
- Workflow management :使用当前 IT 应用程序自动化业务流程,Logic Apps 可用于实现工作流管理。
- Serverless computing :事件触发的计算模型,无需预配机器,Azure Functions 是典型的无服务器计算产品。
- Web applications :通过互联网访问,使用 HTTP 和 HTTPS 协议的应用程序,Azure App Service 可用于开发和部署 Web 应用程序。

以下是架构风格及其对应 Azure 产品的表格总结:
| 架构风格 | 描述 | Azure 产品 |
| — | — | — |
| Multitiered (n - tier) | 按物理机器划分应用角色 | Azure Virtual Machines |
| Big Data | 非结构化数据收集和分析 | Azure Cosmos DB、Azure Synapse Analytics、Data Lake Analytics |
| Microservices | 按服务划分业务逻辑,通过 API 暴露 | Service Fabric、Azure Kubernetes Service (AKS) |
| Web - queue - worker | 使用消息队列解耦 IT 解决方案 | Service Bus、Azure Storage Queue |
| Event - driven | 生产者创建数据,消费者接收和处理 | Event Hub、Event Grid |
| Big Compute | 需要大量内存或 CPU 的数据分析 | Azure Batch(又名 HPC)、Azure Virtual Machines |
| Workflow management | 自动化业务流程 | Logic Apps |
| Serverless computing | 事件触发的计算模型,无需预配机器 | Azure Functions |
| Web applications | 通过互联网访问,使用 HTTP 和 HTTPS 协议的应用程序 | Azure App Service |

4. 设计原则

在设计云解决方案时,需要遵循一些重要的设计原则:
- Redundancy, Resiliency, and Reliance
- Redundancy :在多个位置拥有系统配置、源代码和数据的多个副本,以应对中长期故障和永久数据丢失。在 Azure 中,可以考虑使用可用性区域、故障和更新域、故障转移数据库实例以及 ZRS 和 GRS 存储选项。
- Resiliency :指应用程序从瞬态问题中自动恢复的能力。例如,Retry 模式会在执行代码出错时等待几秒后重试,这比简单抛出异常更具弹性。
- Reliance :用户对系统的依赖程度取决于他们与应用程序的交互体验。可靠的系统是具有弹性和冗余性的结果。
- Self and Automatic Healing :云环境中的组件通常是通用化的,当硬件组件出现故障时,直接替换比进行根本原因分析和修复更高效。应用程序需要能够处理事务执行中的突然中断,确保事务符合 ACID 原则(原子性、一致性、隔离性和持久性)。同时,要捕获软件异常,避免未处理异常导致进程崩溃。
- Scaling and Decoupling
- Scaling :云环境的重要特性之一是按需预配和扩展资源。应用程序需要能够适应这种动态变化,例如在多服务器环境中,可通过客户端亲和性或粘性会话确保会话请求始终路由到同一服务器。对于长时间运行的任务,需要编写代码来处理可能的中断,例如在后台作业中添加启动逻辑,检查处理状态。
- Decoupling :与消息服务相关,通过将长时间运行或资源密集型任务转移到离线服务,可减少系统之间的耦合度。例如,采用 Web - queue - worker 模型可以使客户端请求不依赖于多个系统的可用性和弹性。
- Use SaaS, PaaS, and IaaS, in That Order :尽量选择 SaaS、PaaS 而非 IaaS,以减少直接负责的任务,提高成功的概率。如果可以在 PaaS 上运行工作负载,就优先选择 PaaS,这样可以减少对网络、硬件和操作系统管理的担忧。
- Design for Change :事物变化迅速,设计应考虑到变化因素,如解耦、异步模型和微服务/无服务器概念。将特定逻辑与整体分离,便于进行更改。例如,NoSQL 数据库(如 Azure Cosmos DB)比关系数据库更容易进行数据结构的更改。

5. 云设计模式

从编码角度来看,有几种重要的云设计模式:
- Retry :在云环境中,由于瞬态故障的概率较高,Retry 模式尤为重要。传统的异常捕获模式往往缺乏恢复逻辑,而在云环境中,应在 catch 表达式中实现重试逻辑。例如,对于 HttpRequestException,可以在满足一定条件下等待 5 秒后重试:

catch (HttpRequestException ex)
{
    writeLog($"This exception happened {ex.Message}")
    if currentRetryCount < allowedRetryCount && IsTransient(ex)
        await Task.Delay(5000)
        theMethodWhichFailed()
}
  • Gatekeeper :监控服务的入口点,确保只有授权实体可以访问。可以使用 Azure Front Door、Azure Firewall 等产品实现 Gatekeeper 模式,将暴露公共端点的层与运行敏感或关键处理的层分离。
  • Throttling :通过限制请求数量或计算资源,防止系统过载。例如,在 Internet Information Services (IIS) 中,可以限制 CPU 消耗,当阈值被突破时,拒绝处理请求。Dynamic IP Restrictions (DIPR) 可用于限制来自同一 IP 地址的请求,防止分布式拒绝服务(DDoS)攻击。
  • Sharding :将大量数据划分为较小的、逻辑结构化的子集。水平分片可根据行键的字母顺序将数据划分为行,垂直分片可将频繁访问的列与不常访问的列分开,以提高性能和稳定性。
  • Circuit Breaker :当远程资源或服务不可用时,停止与它们的所有通信。通过监控依赖资源或服务的状态(如 Closed、Open 和 Half - Open 状态),可以实现 Circuit Breaker 模式。当状态为 Closed 时,资源正常工作;当状态为 Open 时,停止对依赖资源的请求,并提供临时服务不可用页面或存储事务细节以便后续处理;当状态为 Half - Open 时,限制请求数量,待资源恢复正常后,将状态设置回 Closed。
6. 反模式

在编码和设计应用程序时,需要避免以下反模式:
- Superfluous Fetching :在 SELECT 子句中只选择执行任务所需的列,并使用严格的 WHERE 子句,避免从数据存储中检索不必要的数据。
- Not Caching :合理使用缓存,只将经常从数据源检索的数据加载到缓存中,以减少数据存储的负载和应用程序的延迟。
- Synchronous I/O :在编程中尽量使用异步方法,避免同步 I/O 导致线程阻塞。异步方法使用 async/await 关键字,可使线程在等待 I/O 操作时重新分配到线程池,提高资源利用率。
- Monolithic Persistence :将在线事务处理(OLTP)数据存储与包含日志、遥测或历史数据的存储分开,以提高 OLTP 数据存储的响应性能。
- Improperly Instantiating Objects :在连接数据库或 REST API 时,避免在每次调用代码块时都实例化新的连接对象。推荐在类中创建静态实例,并在构造函数中进行实例化,以减少 SNAT 端口的使用,提高性能和可扩展性。例如:

public class CsharpGuitarHttpClientController : ApiController
{
    private static readonly HttpClient httpClient;
}

通过遵循这些架构风格、设计原则和设计模式,同时避免反模式,可以提高云应用程序的性能、可靠性和可维护性。在实际开发中,根据具体需求选择合适的技术和方法,不断优化和改进,才能在云开发领域取得成功。

云开发与架构:从混合解决方案到设计模式

7. 架构风格的实际应用与案例分析

为了更好地理解各种架构风格在实际中的应用,我们来看一些具体的案例。

假设一家电商公司需要开发一个新的在线购物平台。考虑到业务的复杂性和未来的扩展性,他们可能会采用多种架构风格的组合。

  • Multitiered (n - tier) 架构 :可以使用 Azure Virtual Machines 搭建 Web 服务器、应用服务器和数据库服务器。Web 服务器负责处理用户的请求,应用服务器处理业务逻辑,数据库服务器存储商品信息、订单信息等。这种架构可以清晰地划分不同层次的职责,便于管理和维护。
  • Microservices 架构 :将不同的业务功能拆分成独立的微服务,如商品管理服务、订单管理服务、用户服务等。每个微服务可以独立开发、部署和扩展。使用 Service Fabric 或 Azure Kubernetes Service (AKS) 来管理这些微服务,提高系统的灵活性和可扩展性。
  • Event - driven 架构 :在商品库存更新、订单状态改变等场景下,使用 Event Hub 和 Event Grid 实现事件驱动的处理。当商品库存发生变化时,触发一个事件,相关的服务可以监听这个事件并做出相应的处理,如更新商品页面的库存显示、通知供应商补货等。

通过这种架构风格的组合,电商公司可以构建一个高效、灵活、可扩展的在线购物平台。

8. 设计原则的实践要点

在实践设计原则时,需要注意以下要点:

  • Redundancy, Resiliency, and Reliance

    • 实现冗余时,要确保多个副本的数据一致性。例如,在使用 Azure 的存储服务时,选择合适的存储冗余选项,如 ZRS(区域冗余存储)或 GRS(全局冗余存储),并定期进行数据备份和恢复测试。
    • 提高弹性时,要根据不同的异常类型制定合理的重试策略。对于一些可能是瞬态故障的异常,如网络连接超时,可以设置适当的重试次数和间隔时间;对于一些永久性故障的异常,如数据库表结构错误,需要及时记录错误信息并进行人工干预。
    • 增强可靠性时,要从用户体验的角度出发,确保系统在出现故障时能够提供友好的提示信息,如临时的服务不可用页面,并及时通知用户故障的处理进度。
  • Self and Automatic Healing

    • 在应用程序中实现事务的 ACID 特性时,要注意数据库的隔离级别和锁机制。例如,在高并发的场景下,选择合适的隔离级别可以避免数据不一致的问题。
    • 捕获异常时,要详细记录异常信息,包括异常类型、发生时间、调用栈等,以便后续的故障排查和修复。同时,要提供合理的重试机制,避免因一次异常导致整个业务流程中断。
  • Scaling and Decoupling

    • 实现弹性扩展时,要根据业务的实际需求设置合理的扩展规则。例如,根据 CPU 使用率、内存使用率等指标自动调整实例数量。同时,要考虑到扩展过程中的数据一致性和性能问题。
    • 解耦系统时,要选择合适的消息队列和通信协议。例如,使用 Service Bus 或 Azure Storage Queue 时,要根据消息的重要性和处理顺序设置不同的队列和优先级。
  • Use SaaS, PaaS, and IaaS, in That Order

    • 在选择云服务时,要充分评估业务需求和成本效益。如果业务只需要简单的计算资源和存储服务,优先选择 SaaS 或 PaaS 服务,避免不必要的基础设施管理工作。
    • 对于一些特殊的业务需求,如需要定制化的操作系统或应用程序,可以考虑使用 IaaS 服务,但要注意增加的管理成本和安全风险。
  • Design for Change

    • 在设计系统时,要采用模块化的设计思想,将不同的功能模块独立开发和部署。例如,使用微服务架构可以将业务逻辑拆分成多个独立的服务,每个服务可以独立更新和扩展。
    • 采用异步模型和事件驱动架构可以提高系统的响应性能和可扩展性。例如,在处理大量的用户请求时,使用消息队列和异步处理机制可以避免阻塞主线程,提高系统的吞吐量。
9. 云设计模式的实施步骤

下面详细介绍几种云设计模式的实施步骤:

  • Retry 模式
    1. 定义异常类型 :确定需要重试的异常类型,如 HttpRequestException、TimeoutException 等。
    2. 设置重试策略 :定义重试次数、重试间隔时间和重试条件。例如,可以设置最大重试次数为 3 次,每次重试间隔时间为 5 秒,只有当异常是瞬态故障时才进行重试。
    3. 实现重试逻辑 :在 catch 表达式中实现重试逻辑,如以下示例代码:
int currentRetryCount = 0;
int allowedRetryCount = 3;
try
{
    // 调用可能会抛出异常的方法
    theMethodWhichFailed();
}
catch (HttpRequestException ex)
{
    writeLog($"This exception happened {ex.Message}");
    while (currentRetryCount < allowedRetryCount && IsTransient(ex))
    {
        await Task.Delay(5000);
        try
        {
            theMethodWhichFailed();
            break;
        }
        catch (HttpRequestException innerEx)
        {
            currentRetryCount++;
            writeLog($"Retry {currentRetryCount} failed: {innerEx.Message}");
        }
    }
    if (currentRetryCount >= allowedRetryCount)
    {
        // 重试次数达到上限,进行错误处理
        handleFinalFailure();
    }
}
  • Gatekeeper 模式

    1. 确定保护资源 :明确需要保护的资源,如敏感数据、关键业务服务等。
    2. 选择防护产品 :根据资源的特点和安全需求,选择合适的 Azure 产品,如 Azure Front Door、Azure Firewall 等。
    3. 配置访问规则 :设置访问规则,只允许授权的用户或系统访问保护资源。例如,配置 Azure Firewall 的网络规则,只允许特定 IP 地址的请求访问内部网络。
    4. 监控和审计 :对访问请求进行监控和审计,及时发现异常行为并采取相应的措施。
  • Throttling 模式

    1. 确定限流指标 :选择合适的限流指标,如请求数量、CPU 使用率、带宽等。
    2. 设置阈值 :根据系统的性能和负载能力,设置合理的阈值。例如,设置每分钟的最大请求数量为 1000 次。
    3. 实现限流逻辑 :在应用程序或服务中实现限流逻辑,当请求超过阈值时,拒绝处理请求并返回相应的错误信息。例如,在 IIS 中配置 Dynamic IP Restrictions (DIPR) 来限制来自同一 IP 地址的请求。
  • Sharding 模式

    1. 分析数据特点 :分析数据的访问模式和分布情况,确定是否适合进行分片。例如,如果数据的访问具有明显的地域特征或时间特征,可以考虑进行水平分片。
    2. 选择分片策略 :根据数据的特点选择合适的分片策略,如水平分片或垂直分片。
    3. 实施分片 :将数据按照分片策略进行划分,并存储到不同的存储节点中。同时,要确保分片之间的数据一致性和负载均衡。
  • Circuit Breaker 模式

    1. 监控资源状态 :实时监控依赖资源或服务的状态,如通过调用健康检查接口获取资源的状态信息。
    2. 设置状态转换规则 :定义 Closed、Open 和 Half - Open 状态之间的转换规则。例如,当连续出现一定数量的异常时,将状态从 Closed 转换为 Open;当异常停止出现一段时间后,将状态从 Open 转换为 Half - Open。
    3. 实现状态处理逻辑 :根据不同的状态,实现相应的处理逻辑。当状态为 Open 时,显示临时的服务不可用页面或将请求重定向到备用服务;当状态为 Half - Open 时,限制请求数量,进行少量的测试请求,当请求成功率达到一定阈值时,将状态转换为 Closed。
10. 避免反模式的注意事项

为了避免反模式,在开发过程中需要注意以下几点:

  • Superfluous Fetching

    • 在编写 SQL 查询时,仔细分析业务需求,只选择必要的列。避免使用 SELECT * 语句,减少不必要的数据传输和处理。
    • 使用索引优化查询性能,确保 WHERE 子句中的条件能够利用索引进行快速查找。
  • Not Caching

    • 评估数据的访问频率和更新频率,对于访问频繁且更新不频繁的数据,使用缓存进行存储。例如,将热门商品的信息缓存到内存中,减少对数据库的查询次数。
    • 选择合适的缓存策略和缓存过期时间。例如,对于一些时效性要求较高的数据,可以设置较短的缓存过期时间;对于一些静态数据,可以设置较长的缓存过期时间。
  • Synchronous I/O

    • 在编写代码时,优先使用异步方法和异步编程模型。例如,在使用 HttpClient 进行网络请求时,使用 await 关键字进行异步调用,避免阻塞线程。
    • 合理配置线程池的大小,避免线程池耗尽导致系统性能下降。
  • Monolithic Persistence

    • 对数据进行分类存储,将 OLTP 数据和日志、遥测、历史数据分开存储。例如,使用关系数据库存储 OLTP 数据,使用 NoSQL 数据库或文件系统存储日志和历史数据。
    • 定期清理和归档历史数据,避免数据量过大影响系统性能。
  • Improperly Instantiating Objects

    • 在类中创建静态实例,并在构造函数中进行实例化。避免在每次调用代码块时都创建新的对象,减少资源消耗和连接开销。
    • 使用连接池技术,提高数据库连接和网络连接的复用率。例如,在使用 HttpClient 时,使用单例模式的 HttpClient 实例,避免频繁创建和销毁连接。
11. 总结与展望

云开发是一个不断发展和变化的领域,选择合适的架构风格、遵循设计原则、应用设计模式以及避免反模式是构建高效、可靠、可扩展的云应用程序的关键。

在未来,随着云计算技术的不断进步,新的架构风格和设计模式可能会不断涌现。例如,边缘计算、人工智能与机器学习在云开发中的应用将越来越广泛,这将对现有的架构和设计带来新的挑战和机遇。

开发者需要不断学习和掌握新的技术和方法,结合实际业务需求,灵活运用各种架构和设计原则,才能在云开发的浪潮中取得成功。同时,要注重系统的安全性、性能优化和用户体验,为用户提供高质量的云服务。

通过不断地实践和总结经验,我们可以更好地应对云开发中的各种问题,推动云应用程序的发展和创新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值