云计算设计模式(十九)——运行重构模式

简介: 云计算设计模式(十九)——运行重构模式 设计应用程序,使得它可以在不需要重新部署或者重新启动应用程序重新配置。这有助于保持可用性并减少停机时间。

云计算设计模式(十九)——运行重构模式


设计应用程序,使得可以在不需要重新部署或者重新启动应用程序重新配置。这有助于保持可用性并减少停机时间。

背景和问题


一个主要目的为重要的应用,如商业和企业网站是尽量减少停机时间以及由此引发的中断给客户和用户。但是,有时有必要重新配置应用程序改变特定行为设置,而在部署使用。因此是用于该应用程序设计成这样一种方式,以允许在运行时要应用这些配置的变化,为应用程序,以检测所述变化并且尽快地应用它们的部件的优点。

要应用可能被调整记录,以协助与应用程序调试问题,交换使用不同数据存储的连接字符串或者打开或关闭特定的部分应用程序功能粒度配置变化的例子。

解决方案


实施这一模式的解决方案依赖于应用程序托管环境中可用的功能典型地,应用程序代码将响应于由检测到的变化对应用程序配置时,主机基础设施提出的一个或多个事件。这通常是上载新的配置文件,或响应于改变通过管理门户的配置或者通过访问的API的结果。

处理的配置变化事件可以检查变化,并将其应用该应用程序的组件。有必要对这些部件进行检测和反应的变化因此它们的值通常会被公开为可写的属性或方法,在事件处理程序的代码可以设置为值,或执行从这一点来说,部件应使用新的值,以便在需要改变应用程序的行为发生

如果这是不可能部件,以应用更改在运行时,这将是必要的,重新启动该应用程序,从而当应用程序启动时再次这些更改应用一些托管环境中它可能会检测到这些类型的变化并指出对环境应用程序必须重新启动。在其他情况下,可能有必要执行该分析设置更改,并强制必要的应用程序重新启动的代码。

图1示出了本模式的概述。

图1 - 此模式的基本概述


大多数环境中暴露响应配置更改引发的事件那些不这样做定期检查更改配置并应用这些变化将是必要的轮询机制可能有必要重新启动应用程序,如果变化不能在运行时被应用。例如有可能以比较预设的时间间隔一个配置文件的日期和时间,并运行代码以应用更改的较新版本中找到。另一种方法是,其中包含一个控制中的应用程序的管理用户界面或使一个安全端点可以从应用程序外部进行访问其执行读取,并应用更新的配置的代码。

或者,该应用程序可以反应以在环境中的一些其他变化例如,发生于特定的运行时错误可能会改变日志配置自动收集更多的信息或者代码可以使用当前日期读取和应用主题,反映了季节或特殊事件

问题和注意事项


在决定如何实现这个模式时,请考虑以下几点
配置设置必须存储在部署的应用程序之外,使得它们可以在不需要整个包被重新部署更新。典型设置被存储在配置文件中或者在外部存储库中,如一个数据库网络存储访问运行时配置机制,应严格控制以及使用时严格审核
如果托管的基础设施不会自动检测配置更改的事件,揭露这些事件对应用程序代码您必须实现一种替代机制来检测和应用更改可以是通过轮询机制或者通过暴露交互式控制端点发起更新过程。
如果您需要实现一个轮询机制考虑如何经常检查更新的配置应该发生轮询间隔将意味着变化可能不被应用了一段时间。的间隔可能会产生不利影响,通过吸收现有的计算和I / O资源的操作。
•如果是应用程序的多个实例附加的考虑因素,这取决于如何变化进行检测。如果改变是通过宿主基础结构引发的事件自动检测到,这些变化可能不被同时应用的所有实例进行检测。意味着,某些情况下,将要使用的原始配置一个周期,而有些则使用新的设置如果该更新是通过轮询机制检测到,这必须保持一致性通信改变所有实例。
一些配置的变化可能要求应用程序重新启动甚至要求托管服务器重新启动。必须确定这些类型的配置设置和执行每一个相应的操作例如,要求应用程序重新启动的变化可能会自动执行此操作,或者它可能是管理员负责发起重新启动在适当的时间时,应用过大的负荷应用程序可以处理的其他实例的负载。
更新并确认他们是成功的,而更新的应用程序实例正在执行正确将更新应用到所有实例之前分阶段部署计划由此,能够防止发生错误应用程序的总的中断更新需要重新启动或应用程序重新启动,特别是在应用程序有一个显著启动或热身的时候,用一个分阶段部署的方式,以防止多个实例脱机在同一时间
•考虑如何将回滚造成的问题配置更改导致申请失败。例如应该能够滚动等待轮询间隔,以检测所述变化背部的变化立即代替。
•考虑如何配置设置的位置可能会影响应用程序的性能例如,你应该处理将发生,如果使用外部存储不可用错误,当应用程序启动时,或配置更改将被应用比如用一个默认的配置或通过本地缓存的设置在服务器和重用这些值重试访问远程数据存储。
高速缓存可以帮助减少延迟,如果一个组件需要多次访问配置设置。然而,当配置改变时,应用程序代码将需要无效缓存设置,该组件必须使用更新后的设置。

何时使用这个模式


这种模式非常适合于
•应用程序,而您必须避免一切不必要的停机时间同时仍然能够将更改应用到应用程序配置
环境,揭露事件自动提出的主要配置更改时通常,这是当检测到一个新的配置文件或者更改了现有的配置文件
•应用的地方,往往配置更改变化可以应用于组件,而不要求应用程序重新启动,无需托管服务器必须重新启动。

这种模式可能不是合适的,如果运行时组件的设计使得它们只能在初始化时被配置更新这些部件的努力不能相比,重新启动应用程序和持久的一个的停机时间是合理的。

例子


微软Azure云服务的角色发现和揭露提了两个事件,当主机环境检测变化ServiceConfiguration.cscfg文件:


RoleEnvironment.Changing引发此事件被检测到的结构变化但在此之前被施加到该应用程序。可以处理查询变化,并取消运行时重新配置活动如果取消了变化,网页辅助角色将自动以使新配置被应用程序使用的重新启动。
RoleEnvironment.Changed引发此事件后,应用程序的配置得到了应用。可以处理该事件来查询所应用的改变。

当取消RoleEnvironment.Changing事件改变要表示到Azure,一个新的设置不能被应用于该应用程序正在运行时并且它必须使用新的被重新启动。有效地,你会取消更改只有在您的应用程序或组件无法反应在运行时改变,需要重新启动才能使用新的值

注意:

欲了解更多信息,请参阅RoleEnvironment.Changing事件并使用RoleEnvironment.Changing事件MSDN上



处理RoleEnvironment.ChangingRoleEnvironment.Changed事件,你通常会添加一个自定义处理该事件例如,你可以下载本手册的例子运行时重新配置的解决方案的Global.asax.cs下面的代码显示了如何添加一个名为RoleEnvironment_Changed事件处理链中的自定义函数实施例的的Global.asax.cs文件

注意:

这种模式例子是,在RuntimeReconfiguration解决方案RuntimeReconfiguration.Web项目

protected void Application_Start(object sender, EventArgs e)
{
  ConfigureFromSetting(CustomSettingName);
  RoleEnvironment.Changed += this.RoleEnvironment_Changed;
}


 

在Web或工作的角色,你可以处理RoleEnvironment.Changing事件的作用的OnStart事件处理程序中使用类似的代码实施例的WebRole.cs文件

public override bool OnStart()
{
  // Add the trace listener. The web role process is not configured by web.config.
  Trace.Listeners.Add(new DiagnosticMonitorTraceListener());

  RoleEnvironment.Changing +=   this.RoleEnvironment_Changing;
  return base.OnStart();
}


 

要注意的是,在网页的角色的情况下,所述的OnStart事件处理程序从Web应用程序本身的单独进程中运行。这就是为什么你通常会处理在Global.asax文件中RoleEnvironment.Changed事件处理程序,让您可以更新您的Web应用程序的运行时配置RoleEnvironment.Changing事件中的角色本身辅助角色的情况下您可以订阅双方RoleEnvironment.ChangingRoleEnvironment.Changed的OnStart事件处理程序中的事件

注意:

可以在服务配置文件存储自定义的配置设置自定义配置文件在数据库中,如在虚拟机中的Azure SQL数据库或SQL Server或者天青blob和表存储您需要创建一个可以访问自定义配置设置和应用程序设置组件的属性,这些适用于应用程序通常代码。


例如下面的自定义函数读取设置其名称作为参数传递Azure的服务配置文件中,然后将它应用到一个名为SomeRuntimeComponent运行时组件的当前实例。实施例的的Global.asax.cs文件

private static void ConfigureFromSetting(string settingName)
{
  var value = RoleEnvironment.GetConfigurationSettingValue(settingName);
  SomeRuntimeComponent.Instance.CurrentValue = value;
}


 

注意:

一些配置设置,那些用于Windows标识框架不能存储在Azure服务配置文件中,并且必须在App.configWeb.config文件。


Azure中一些配置的变化检测,并自动应用这包括Diagnostics.wadcfg文件寡妇天青诊断系统,它指定的信息类型来收集和如何保持日志文件的结构因此仅需要编写处理添加到服务配置文件自定义设置的代码。你的代码应该:
从更新的配置应用自定义设置您的应用程序在运行时相应组件,使他们的行为体现了新的配置
•取消改变,以指示到Azure新的值不能在运行时应用,该应用程序必须按顺序重新开始要应用的变化

例如,你可以下载本手册的例子运行时重新配置的解决方案WebRole.cs下面的代码显示了如何使用RoleEnvironment.Changing事件取消所有设置更新,除了可应用于那些在运行时,不需要重新启动。此示例允许在运行时应用无需重新启动应用程序使用此设置将能够读取新的值,并相应地在运行时改变其行为组成部分更改为“CustomSetting的设置任何其他更改的配置将自动使网页或工作的角色重新启动

private void RoleEnvironment_Changing(object sender,
                               RoleEnvironmentChangingEventArgs e)
{
  var changedSettings = e.Changes.OfType<RoleEnvironmentConfigurationSettingChange>()
                                 .Select(c => c.ConfigurationSettingName).ToList();
  Trace.TraceInformation("Changing notification. Settings being changed: "
                         + string.Join(", ", changedSettings));

  if (changedSettings
    .Any(settingName => !string.Equals(settingName, CustomSettingName,
                               StringComparison.Ordinal)))
  {
    Trace.TraceInformation("Cancelling dynamic configuration change (restarting).");

    // Setting this to true will restart the role gracefully. If Cancel is not 
    // set to true, and the change is not handled by the application, the 
    // application will not use the new value until it is restarted (either 
    // manually or for some other reason).
    e.Cancel = true; 
  }
  Else
  {
    Trace.TraceInformation("Handling configuration change without restarting. ");
  }
}


 

注意:

这种方法证明了好的做法,因为它确保了更改应用程序代码不知道任何设置(因此不能确保它可以在运行时应用)将导致重新启动。如果更改任何一个被取消角色将被重新启动


然后可以检测到并应用于应用程序的组件新的配置已被接受Azure的框架更新RoleEnvironment.Changing事件处理程序取消。例如,在该示例解决方案Global.asax文件以下代码处理RoleEnvironment.Changed事件检查每个配置设置,并且当它找到名为“CustomSetting”的设置调用一个函数前面所示),该应用新的设置,以应用程序中的适当组件。

private void RoleEnvironment_Changed(object sender, 
                               RoleEnvironmentChangedEventArgs e)
{
  Trace.TraceInformation("Updating instance with new configuration settings.");

  foreach (var settingChange in
           e.Changes.OfType<RoleEnvironmentConfigurationSettingChange>())
  {
    if (string.Equals(settingChange.ConfigurationSettingName, 
                      CustomSettingName, 
                      StringComparison.Ordinal))
    {
      // Execute a function to update the configuration of the component.
      ConfigureFromSetting(CustomSettingName );
    }
  }
}


 

需要注意的是,如果你不取消配置的变化,但不将新值应用到您的应用程序组件那么更改将不会生效下一次重新启动应用程序之前可能会导致不可预测的行为,尤其是当所述宿主角色实例由Azure的自动重启在其日常维护操作在该点新的设定将被应用的一部分。

本文翻译自MSDN:http://msdn.microsoft.com/en-us/library/dn589785.aspx

 

 

目录
相关文章
|
15天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
2月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
3月前
|
存储 安全 JavaScript
云计算浪潮中的网络安全之舵探索Node.js中的异步编程模式
【8月更文挑战第27天】在数字化时代的风帆下,云计算如同一片广阔的海洋,承载着企业与个人的数据梦想。然而,这片海洋并非总是风平浪静。随着网络攻击的波涛汹涌,如何确保航行的安全成为了每一个船员必须面对的挑战。本文将探索云计算环境下的网络安全策略,从云服务的本质出发,深入信息安全的核心,揭示如何在云海中找到安全的灯塔。
|
18天前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
5天前
|
人工智能 边缘计算 云计算
2024.11|云计算行业的商业模式创新方法及实践
截至2024年,全球云计算行业迈入全新阶段,从IaaS到大规模AI模型平台,技术与商业模式不断创新。本文分析全球最新技术进展,探讨云计算商业模式创新策略与实践,解析云服务厂商如何通过技术革新实现价值最大化,推动企业数字化与智能化转型。重点讨论AI与云计算的深度融合、边缘计算与去中心化发展、平台化与生态系统建设,以及数据安全与绿色云计算等关键议题。
54 30
|
11天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
29 1
|
1月前
|
设计模式 Java Kotlin
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
本教程详细讲解Kotlin语法,适合希望深入了解Kotlin的开发者。对于快速学习Kotlin语法,推荐查看“简洁”系列教程。本文重点介绍了构建者模式在Kotlin中的应用与改良,包括如何使用具名可选参数简化复杂对象的创建过程,以及如何在初始化代码块中对参数进行约束和校验。
21 3
|
2月前
|
设计模式 算法 安全
设计模式——模板模式
模板方法模式、钩子方法、Spring源码AbstractApplicationContext类用到的模板方法
设计模式——模板模式
|
2月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:如何提高代码的可维护性与扩展性在软件开发领域,PHP 是一种广泛使用的服务器端脚本语言。随着项目规模的扩大和复杂性的增加,保持代码的可维护性和可扩展性变得越来越重要。本文将探讨 PHP 中的设计模式,并通过实例展示如何应用这些模式来提高代码质量。
设计模式是经过验证的解决软件设计问题的方法。它们不是具体的代码,而是一种编码和设计经验的总结。在PHP开发中,合理地使用设计模式可以显著提高代码的可维护性、复用性和扩展性。本文将介绍几种常见的设计模式,包括单例模式、工厂模式和观察者模式,并通过具体的例子展示如何在PHP项目中应用这些模式。
|
2月前
|
设计模式 Java Spring
spring源码设计模式分析-代理设计模式(二)
spring源码设计模式分析-代理设计模式(二)