云计算设计模式(五)——计算资源整合模式

简介: 云计算设计模式(五)——计算资源整合模式 合并多个任务或操作成一个单一的计算单元。这种模式可以提高计算资源的利用率,并降低与云托管的应用程序进行计算处理相关的成本和管理开销。

云计算设计模式(五)——计算资源整合模式


合并多个任务或操作成一个单一的计算单元这种模式可以提高计算资源的利用率,并降低与托管的应用程序进行计算处理相关的成本和管理开销


背景和问题


应用程序频繁执行各种操作在某些解决方案可能是有意义的最初遵循关注点分离设计原则把这些操作托管和独立部署例如,如在微软的Azure云服务,独立Azure网站不同的角色独立计算单元单独的虚拟然而,尽管这种策略可以帮助简化溶液的逻辑设计部署大量计算单元作为同一应用可以提高运行时的托管成本,使系统管理更加复杂的一部分。

作为一个例子,图1示出使用多个计算单元被实现的一个云托管解决方案的简化的结构每个计算单元在其自己的虚拟环境中运行每个功能已被实现为一个单独的任务(通过任务Ë任务A在自己的计算设备上运行

图1  - 通过使用一组专用计算单元运行在云环境中的任务


每个计算单元消耗的资源收费即使是闲置或不常使用因此,这种方法可能不总是最有成本效益的解决方案

Azure中这一问题适用于云服务的角色,网站和虚拟机这些产品他们自己的虚拟环境中执行运行单独作用,网站,或者被设计为执行一组良好定义的操作的虚拟机的集合,但是需要进行通信协作,作为一个单一的解决方案的一部分可以是一个资源利用效率低


解决方案


为了帮助降低成本提高利用率提高通信速度,减轻管理工作有可能将多个任务或操作成一个单一的计算单元

任务可以根据各种基于由环境提供的功能以及与这些功能相关的成本的标准进行分组。一种常见的方法是寻找具有关于它们的可扩展性,寿命和加工要求具有相似的任务。分组这些产品一起使它们能够扩展为一个单元许多云环境所提供的弹性使一个计算单元的其他实例,以根据业务负载被启动和停止例如Azure提供自动缩放,可以适用于云服务的角色,网站和虚拟机欲了解更多信息,请参阅自动缩放指导

作为一个计数器的例子来说明如何扩展可以被用于确定哪些操作可能不应该被分组到一起,考虑以下两个任务:
任务1轮询发送到队列罕见的对时间不敏感的信息
任务2处理网络流量高容量阵阵

第二任务要求的弹性可能涉及起动和停止的大量的计算单元的实例。应用相同的缩放到第一任务只会导致更多的任务上监听同一队列不频繁的消息并且一种资源的浪费

许多环境中,它可以指定CPU内核存储器,磁盘空间数量而言,以一个计算单元的可用资源通常指定的资源越多,就越有成本对于金融效率,最大限度地工作的一个昂贵的计算单元执行的数量而不是让它变成无活性在较长时间内很重要的。

如果存在需要大量的CPU功率的脉冲串的任务,考虑合并这些成一个单一的计算单元,其提供所需的电源然而,重要的是平衡这种需要保持昂贵资源它们是否过分强调指出可能发生争用是重要的。长时间运行计算密集型任务可能不应该共享相同的计算单位,例如


问题和注意事项


实施该模式时请考虑以下几点
可扩展性和弹性。许多云解决方案实现的可扩展性弹性,在运算部通过启动和停止情况下,单位水平避免分组在同一计算单元相互矛盾的可扩展性要求的任务
一生云计算基础架构可以定期回收托管的计算单元虚拟环境当执行一个计算单元许多长期运行的任务,可能需要对设备进行配置,以防止它被回收,直到这些任务已经完成可替换地,通过使用一个检查指向的方法,使他们停止干净继续其中,当所述计算单元被重新启动他们被中断的点的设计的任务。
•释放节奏。如果一个任务执行或配置变化频繁则可能需要停止计算单位主办更新的代码重新配置和重新部署单元然后重新启动它过程将需要相同的计算单元中的所有其他任务被停止重新部署并重新启动。
安全性相同的计算单元的任务可以共享相同的安全上下文,并能够访问相同的资源必须有高度任务之间的信任而且相信,一个任务是不会损坏或其他不利的影响。此外,增加了一个计算单元可以增加计算单元的攻击面运行的任务的数目;每个任务是否安全一个脆弱性
容错如果一个计算单元中的一个任务失败异常情况可能会影响在同一单元内运行其他任务。例如,如果有一个任务无法正常启动它可能会导致计算单元失败,整个启动逻辑并且防止同一单元的其他任务的运行。
避免这种情况,在相同的计算单元争夺资源的任务之间引入的争用。理想情况下,共享相同的计算单元的任务应该表现出不同的资源利用率​​的特征。例如,两个计算密集型任务可能不应该驻留在同一个计算单元而且消耗大量的内存也不应该两个任务。然而混合使用需要大量的存储器可以是一个可行的组合任务中计算密集型的任务。


 注意:

你应该考虑整合计算资源只对已在生产用于在一段时间内,使得操作人员和开发者能够监控系统,并创建热图,它标识了每个任务利用别共资源的系统。图可以用于确定哪些任务是很好的候选共享计算资源


复杂性组合多个任务到一个单一的计算单元增加了复杂性中的代码单元,可能使得更难以进行测试,调试和维护。
•稳定的逻辑架构设计实施中的代码的每个任务,以便它不应该需要改变即使物理环境中任务运行不会改变
其他策略。整合计算资源的方法只有一个,以帮助减少同时运行多个任务相关的成本需要仔细的规划和监测,以确保它仍然是一个有效的办法。其他策略可能更合适,这取决于所执行的工作的性质所代表这些任务正在运行用户的位置。例如,工作负荷所描述计算分区指南)功能分解可能是一个更好的选择。


使用这个模式


使用这种模式任务,如果他们在自己的计算单元运行不符合成本效益如果一个任务花费大量时间闲置,运行此任务专用设备可以是昂贵的
  
这种模式可能不适合于执行关键容错操作处理高度敏感的私有数据,并且需要其自身的安全上下文的任务或任务这些任务应该在他们自己的独立的环境中运行,在一个单独的计算单元


例子


Azure上构建一个云服务可以巩固多任务的处理成一个单一的角色通常,这是执行的背景或异步处理任务的辅助角色 

 注意:

在某些情况下它可能会包括在Web角色的背景或异步处理任务。这种技术可以有助于降低成本简化部署,虽然它可以影响由web角色所提供的面向公众的接口的可扩展性响应性。文章合并多个天青工作者角色天青Web角色包含执行背景异步处理任务Web角色的详细描述

的作用负责启动和停止的任务。Azure结构控制器加载的作用,它引发启动事件中的作用您可以覆盖WebRoleWorkerRole类的OnStart方法来处理这个事件,也许是为了初始化数据和其他资源,在这种方法中,任务依赖
OnStart方法完成后,角色就可以开始响应请求。您可以找到有关使用的OnStart和运行方式作用,在theApplication启动进程中的模式与实践指南移动应用程序到云部分的更多信息和指导 

 注意:

OnStart方法尽量精简的代码。 Azure不采取这种方法,完成时间强加任何限制作用能够启动响应发送给它,直到方法完成的网络请求

OnStart方法完成后,执行任务运行方式。在这一点上,该织物控制器能够开始发送请求的作用。
实际运行方法创建任务的代码。注意,执行命令的方法可以有效地定义角色实例的生命周期此方法完成结构控制器将安排的作用被关闭
一个角色关机或再循环结构控制器可以防止从负载平衡器接收任何更多的传入请求,并提高了停止事件。您可以通过覆盖作用的onStop方法捕获这个事件和角色终止前需要进行任何整理起来


注意:

的onStop方法执行的任何操作须在5分钟(或者,如果您使用的是本地计算机上的天青模拟器30秒)内完成;否则Azure结构控制器假定的角色已经停止,并会迫使它停下来。

图2示出了一个角色的生命周期,任务和资源,它承载任务由运行方法,该方法然后等待任务来完成启动。任务本身,这实现云服务的业务逻辑可以响应通过天青负载平衡器发布到角色的消息。

图2 - 任务和资源作用,Azure云服务生命周期
ComputeResourceConsolidation.Worker项目WorkerRole.cs文件显示了一个如何实现这个模式Azure云服务的例子

注意:

ComputeResourceConsolidation.Worker项目是ComputeResourceConsolidation解决方案,可用于下载本指导意见的一部分
运行被初始化的角色创建所需的取消标记和任务来运行一个列表中的辅助角色代码

public class WorkerRole: RoleEntryPoint
{
  // The cancellation token source used to cooperatively cancel running tasks.
  private readonly CancellationTokenSource cts = new CancellationTokenSource ();

  // List of tasks running on the role instance.
  private readonly List<Task> tasks = new List<Task>();

  // List of worker tasks to run on this role.
  private readonly List<Func<CancellationToken, Task>> workerTasks  
                        = new List<Func<CancellationToken, Task>>
    {
      MyWorkerTask1,
      MyWorkerTask2
    };
  
  ...
}


设置在MyWorkerTask1MyWorkerTask2方法来说明如何在同一辅助角色执行不同的任务下面的代码显示MyWorkerTask1这是休眠30秒,然后输出一个跟踪消息的简单任务重复这个过程,直到无限期任务被取消。MyWorkerTask2代码非常相似

// A sample worker role task.
private static async Task MyWorkerTask1(CancellationToken ct)
{
  // Fixed interval to wake up and check for work and/or do work.
  var interval = TimeSpan.FromSeconds(30);

  try
  {
    while (!ct.IsCancellationRequested)
    {
      // Wake up and do some background processing if not canceled.
      // TASK PROCESSING CODE HERE
      Trace.TraceInformation("Doing Worker Task 1 Work");

      // Go back to sleep for a period of time unless asked to cancel.
      // Task.Delay will throw an OperationCanceledException when canceled.
      await Task.Delay(interval, ct);
    }
  }
  catch (OperationCanceledException)
  {
    // Expect this exception to be thrown in normal circumstances or check
    // the cancellation token. If the role instances are shutting down, a
    // cancellation request will be signaled.
    Trace.TraceInformation("Stopping service, cancellation requested");

    // Re-throw the exception.
    throw;
  }
}


注意:
通过示例代码示出的方法是一个后台进程一个常见的实现现实世界的应用程序,你可以按照这个结构相同,不同之处在于,你应该把自己的处理逻辑等待取消请求循环体

经过工人的角色已初始化它使用资源Run方法启动两个任务同时如下图所示

...
// RoleEntry Run() is called after OnStart().  
// Returning from Run() will cause a role instance to recycle.
public override void Run()
{
  // Start worker tasks and add them to the task list.
  foreach (var worker in workerTasks)
    tasks.Add(worker(cts.Token));

  Trace.TraceInformation("Worker host tasks started");
  // The assumption is that all tasks should remain running and not return, 
  // similar to role entry Run() behavior.
  try
  {
    Task.WaitAny(tasks.ToArray());
  }
  catch (AggregateException ex)
  {
    Trace.TraceError(ex.Message);

    // If any of the inner exceptions in the aggregate exception 
    // are not cancellation exceptions then re-throw the exception.
    ex.Handle(innerEx => (innerEx is OperationCanceledException));
  }

  // If there was not a cancellation request, stop all tasks and return from Run()
  // An alternative to cancelling and returning when a task exits would be to 
  // restart the task.
  if (!cts.IsCancellationRequested)
  {
    Trace.TraceInformation("Task returned without cancellation request");
    Stop(TimeSpan.FromMinutes(5));
  }
}
...


 

该示例中, 执行命令 方法等待 要完成的任务 如果任务被 取消, 运行 方法假定 的角色 正在关闭 ,并等待 剩下的 任务 完成 在终止前 等待 最多 5分钟) 之前 被取消 如果任务失败 ,由于 预期异常 Run方法 将取消 该任务

注意:

需要注意的是 ,你可以 实现 Run方法 更全面的监测 和异常处理 策略, 如重新启动 失败的任务 或者 包括 代码,使 角色 停止和启动 单个任务
以下代码 中所示的 停止 方法 时, 网络控制器 将关闭 角色实例 它是从 的onStop 方法 调用 )被调用。 该代码 通过取消 优雅地 停止 每项任务 如果有任何 的工作 时间超过 五分钟就能完成 Stop方法 取消 处理 真正地停止 等待 作用 被终止。

 

// Stop running tasks and wait for tasks to complete before returning 
// unless the timeout expires.
private void Stop(TimeSpan timeout)
{
  Trace.TraceInformation("Stop called. Canceling tasks.");
  // Cancel running tasks.
  cts.Cancel();

  Trace.TraceInformation("Waiting for canceled tasks to finish and return");

  // Wait for all the tasks to complete before returning. Note that the 
  // emulator currently allows 30 seconds and Azure allows five
  // minutes for processing to complete.
  try
  {
    Task.WaitAll(tasks.ToArray(), timeout);
  }
  catch (AggregateException ex)
  {
    Trace.TraceError(ex.Message);

    // If any of the inner exceptions in the aggregate exception 
    // are not cancellation exceptions then re-throw the exception.
    ex.Handle(innerEx => (innerEx is OperationCanceledException));
  }
}


 

本文翻译自MSDN: http://msdn.microsoft.com/en-us/library/dn589778.aspx
目录
相关文章
|
设计模式 Java 数据库连接
【设计模式】【创建型模式】工厂方法模式(Factory Methods)
一、入门 什么是工厂方法模式? 工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定实例化哪个类。工厂方法模式使类的实例化延迟
332 16
|
存储 人工智能 物联网
云计算助力医疗信息化,推动智慧医疗新模式。
云计算正深刻改变医疗行业,通过高效数据存储、管理与共享,优化医疗资源分配,推动远程医疗发展。它解决了“数据孤岛”问题,强化了数据安全与隐私保护,同时助力智慧医疗建设,降低信息化成本并提升服务效率。未来,云计算将与5G、AI等技术融合,进一步促进医疗服务智能化与规范化,为医疗行业带来全新可能。
732 7
|
12月前
|
设计模式 负载均衡 监控
并发设计模式实战系列(2):领导者/追随者模式
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发设计模式实战系列,第二章领导者/追随者(Leader/Followers)模式,废话不多说直接开始~
338 0
|
12月前
|
设计模式 监控 Java
并发设计模式实战系列(1):半同步/半异步模式
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发设计模式实战系列,第一章半同步/半异步(Half-Sync/Half-Async)模式,废话不多说直接开始~
466 0
|
12月前
|
设计模式 安全 Java
并发设计模式实战系列(12):不变模式(Immutable Object)
🌟 大家好,我是摘星!🌟今天为大家带来的是并发设计模式实战系列,第十二章,废话不多说直接开始~
280 0
|
存储 弹性计算 调度
云计算,何为云,又何以计算?
本文由笠泱撰写,是“拥抱云计算”系列的第一篇章,旨在分享云计算的概念及其诞生背景,重点介绍了阿里云飞天操作系统。文章从虚拟化技术的起源讲起,探讨了其如何演变为云计算的基础,并详细解释了云计算的关键特性:按需使用、按量付费和弹性。文中还分类介绍了云计算的主要服务模式(IaaS、PaaS、SaaS等)及部署方式(公共云、私有云、混合云),并分析了亚马逊AWS和阿里云在云计算领域的领导地位。最后,文章通过对比OpenStack与阿里云飞天架构,深入浅出地解析了阿里云飞天系统如何调度算力,帮助读者理解云计算的实际运作机制。阅读本文大约需要30分钟,内容详实,值得一读。
2896 5
云计算,何为云,又何以计算?
|
设计模式 前端开发 搜索推荐
前端必须掌握的设计模式——模板模式
模板模式(Template Pattern)是一种行为型设计模式,父类定义固定流程和步骤顺序,子类通过继承并重写特定方法实现具体步骤。适用于具有固定结构或流程的场景,如组装汽车、包装礼物等。举例来说,公司年会节目征集时,蜘蛛侠定义了歌曲的四个步骤:前奏、主歌、副歌、结尾。金刚狼和绿巨人根据此模板设计各自的表演内容。通过抽象类定义通用逻辑,子类实现个性化行为,从而减少重复代码。模板模式还支持钩子方法,允许跳过某些步骤,增加灵活性。
917 11
|
12月前
|
设计模式 算法 Java
设计模式觉醒系列(04)策略模式|简单工厂模式的升级版
本文介绍了简单工厂模式与策略模式的概念及其融合实践。简单工厂模式用于对象创建,通过隐藏实现细节简化代码;策略模式关注行为封装与切换,支持动态替换算法,增强灵活性。两者结合形成“策略工厂”,既简化对象创建又保持低耦合。文章通过支付案例演示了模式的应用,并强调实际开发中应根据需求选择合适的设计模式,避免生搬硬套。最后推荐了JVM调优、并发编程等技术专题,助力开发者提升技能。
|
设计模式
「全网最细 + 实战源码案例」设计模式——模式扩展(配置工厂)
该设计通过配置文件和反射机制动态选择具体工厂,减少硬编码依赖,提升系统灵活性和扩展性。配置文件解耦、反射创建对象,新增产品族无需修改客户端代码。示例中,`CoffeeFactory`类加载配置文件并使用反射生成咖啡对象,客户端调用时只需指定名称即可获取对应产品实例。
311 40
|
12月前
|
设计模式 Prometheus 监控
并发设计模式实战系列(20):扇出/扇入模式(Fan-Out/Fan-In)(完结篇)
🌟 大家好,我是摘星!🌟今天为大家带来的是并发设计模式实战系列,第二十章,废话不多说直接开始~
379 0