雲計算設計模式(五)——計算資源整合模式

雲計算設計模式(五)——計算資源整合模式


合併多個任務或操做成一個單一的計算單元。這種模式能夠提升計算資源的利用率,並下降與雲託管的應用程序進行計算處理相關的成本和管理開銷。web


背景和問題


雲應用程序頻繁執行各類操做。在某些解決方案也多是有意義的最初遵循的關注點分離的設計原則,並把這些操做成託管和獨立部署(例如,如在微軟的Azure雲服務,獨立Azure網站不一樣的角色獨立計算單元或單獨的虛擬機)。然而,儘管這種策略能夠幫助簡化溶液的邏輯設計,部署大量計算單元做爲同一應用能夠提升運行時的託管成本,使系統的管理更加複雜的一部分。 

做爲一個例子,圖1示出了使用多個計算單元被實現的一個雲託管解決方案的簡化的結構。每一個計算單元在其本身的虛擬環境中運行。每一個功能已被實現爲一個單獨的任務(經過任務Ë標任務A)在本身的計算設備上運行。設計模式

圖1  - 經過使用一組專用計算單元運行在雲環境中的任務 


每一個計算單元消耗的資源收費,即便是閒置或不常使用。所以,這種方法可能不老是最有成本效益的解決方案。 

在Azure中,這一問題適用於雲服務的角色,網站和虛擬機。這些產品在他們本身的虛擬環境中執行。運行的單獨做用,網站,或者被設計爲執行一組良好定義的操做的虛擬機的集合,可是須要進行通訊和協做,做爲一個單一的解決方案的一部分,能夠是一個資源利用效率低。安全


解決方案


爲了幫助下降成本,提升利用率,提升通訊速度,減輕了管理工做有可能將多個任務或操做成一個單一的計算單元。 

任務能夠根據各類基於由環境提供的功能,以及與這些功能相關的成本的標準進行分組。一種常見的方法是尋找具備關於它們的可擴展性,壽命和加工要求具備類似的任務。分組這些產品一塊兒使它們可以擴展爲一個單元。由許多雲環境所提供的彈性使一個計算單元的其餘實例,以根據業務負載被啓動和中止。例如,Azure提供自動縮放,能夠適用於雲服務的角色,網站和虛擬機。欲瞭解更多信息,請參閱自動縮放指導。 

做爲一個計數器的例子來講明如何擴展能夠被用於肯定哪些操做可能不該該被分組到一塊兒,考慮如下兩個任務: 
•任務1輪詢發送到隊列罕見的,對時間不敏感的信息。 
•任務2處理網絡流量的高容量陣陣。 

第二任務要求的彈性可能涉及起動和中止的大量的計算單元的實例。應用相同的縮放到第一任務只會致使更多的任務上監聽同一隊列不頻繁的消息,而且是一種資源的浪費。 

在許多雲環境中,它能夠指定在CPU內核,存儲器,磁盤空間等的數量而言,以一個計算單元的可用資源。一般,指定的資源越多,就越有成本。對於金融效率,最大限度地工做的一個昂貴的計算單元執行的數量,而不是讓它變成無活性在較長時間內是很重要的。 

若是存在須要大量的CPU功率的短脈衝串的任務,考慮合併這些成一個單一的計算單元,其提供所需的電源。然而,重要的是平衡這種須要保持昂貴資源忙對它們是否過度強調指出可能發生了爭用是重要的。長時間運行,計算密集型任務可能不該該共享相同的計算單位,例如。網絡

 


問題和注意事項


實施該模式時請考慮如下幾點: 
•可擴展性和彈性。許多雲解決方案實現的可擴展性和彈性,在運算部的經過啓動和中止的狀況下,單位的水平。避免了分組在同一計算單元相互矛盾的可擴展性要求的任務。 
•一輩子。雲計算基礎架構能夠按期回收託管的計算單元的虛擬環境。當執行一個計算單元內許多長期運行的任務,可能須要對設備進行配置,以防止它被回收,直到這些任務已經完成。可替換地,經過使用一個檢查指向的方法,使他們中止乾淨,並繼續在在其中,當所述計算單元被從新啓動他們被中斷的點的設計的任務。 
•釋放節奏。若是一個任務的執行或配置變化頻繁,則可能須要中止計算單位主辦的更新的代碼,從新配置和從新部署的單元,而後從新啓動它。此過程也將須要相同的計算單元中的全部其餘任務被中止,從新部署,並從新啓動。 
•安全性。在相同的計算單元的任務能夠共享相同的安全上下文,並可以訪問相同的資源。必須有高度的任務之間的信任,並且相信,一個任務是不會損壞或其餘不利的影響。此外,增長了在一個計算單元能夠增長計算單元的攻擊面運行的任務的數目;每一個任務是否安全的一個最脆弱性。 
•容錯。若是在一個計算單元中的一個任務失敗或異常狀況,它可能會影響在同一單元內運行的其餘任務。例如,若是有一個任務沒法正常啓動它可能會致使對計算單元失敗,整個啓動邏輯,而且防止在同一單元的其餘任務的運行。 
•爭。避免這種狀況,在相同的計算單元爭奪資源的任務之間引入的爭用。理想狀況下,共享相同的計算單元的任務應該表現出不一樣的資源利用率​​的特徵。例如,兩個計算密集型任務可能不該該駐留在同一個計算單元,並且消耗大量的內存也不該該兩個任務。然而,混合使用須要大量的存儲器能夠是一個可行的組合任務中計算密集型的任務。 


 注意: 

你應該考慮整合計算資源只對已在生產用於在一段時間內,使得操做人員和開發者可以監控系統,並建立熱圖,它標識了每一個任務利用別共資源的系統。此圖能夠用於肯定哪些任務是很好的候選共享計算資源。 


•複雜性。組合多個任務到一個單一的計算單元增長了複雜性中的代碼單元,可能使得更難以進行測試,調試和維護。 
•穩定的邏輯架構。設計和實施中的代碼中的每一個任務,以便它不該該須要改變,即便物理環境中任務運行不會改變。 
•其餘策略。整合計算資源的方法只有一個,以幫助減小同時運行多個任務相關的成本。這須要仔細的規劃和監測,以確保它仍然是一個有效的辦法。其餘策略可能更合適,這取決於所執行的工做的性質和所表明這些任務正在運行的用戶的位置。例如,工做負荷(如所描述的計算分區指南)的功能分解多是一個更好的選擇。架構


當使用這個模式


使用這種模式的任務,若是他們在本身的計算單元運行不符合成本效益。若是一個任務花費大量的時間閒置,運行此任務的專用設備能夠是昂貴的。 
  
這種模式可能不適合於執行關鍵容錯操做處理高度敏感的或私有數據,而且須要其自身的安全上下文的任務或任務。這些任務應該在他們本身的獨立的環境中運行,在一個單獨的計算單元。less


例子


在Azure上構建一個雲服務,它能夠鞏固多任務的處理成一個單一的角色。一般,這是執行的背景或異步處理任務的輔助角色。 

 注意: 

在某些狀況下它可能會包括在Web角色的背景或異步處理任務。這種技術能夠有助於下降成本和簡化部署,雖然它能夠影響由web角色所提供的面向公衆的接口的可擴展性和響應性。該文章合併多個天青工做者角色整天青Web角色包含執行背景或異步處理任務在Web角色的詳細描述。 

的做用是負責啓動和中止的任務。當Azure結構控制器加載的做用,它引起的啓動事件中的做用。您能夠覆蓋WebRole或WorkerRole類的OnStart方法來處理這個事件,也許是爲了初始化數據和其餘資源,在這種方法中,任務依賴。 
當OnStart方法完成後,角色就能夠開始響應請求。您能夠找到有關使用的OnStart和運行方式的做用,在theApplication啓動進程中的模式與實踐指南移動應用程序到雲部分的更多信息和指導。 

 注意: 

請OnStart方法儘可能精簡的代碼。 Azure不上採起這種方法,完成時間強加任何限制,但做用不可以啓動響應發送給它,直到此方法完成的網絡請求。 

當OnStart方法完成後,執行任務的運行方式。在這一點上,該織物控制器可以開始發送請求的做用。 
將實際的運行方法建立任務的代碼。注意,執行命令的方法能夠有效地定義角色實例的生命週期。此方法完成,結構控制器將安排的做用被關閉。 
當一個角色關機或再循環,結構控制器能夠防止從負載平衡器接收任何更多的傳入請求,並提升了中止事件。您能夠經過覆蓋做用的onStop方法捕獲這個事件和角色終止前須要進行任何整理起來。 


注意: 

在的onStop方法執行的任何操做須在5分鐘(或者,若是您使用的是本地計算機上的天青模擬器30秒)內完成;不然Azure結構控制器假定的角色已經中止,並會迫使它停下來。 

圖2示出了一個角色的生命週期,任務和資源,它承載。該任務由運行方法,該方法而後等待任務來完成啓動。任務自己,這實現雲服務的業務邏輯,能夠響應經過天青負載平衡器發佈到角色的消息。
異步

圖2 - 任務和資源的做用,在Azure雲服務的生命週期 
在ComputeResourceConsolidation.Worker項目WorkerRole.cs文件顯示了一個如何實現這個模式在Azure雲服務的例子。 

注意: 

該ComputeResourceConsolidation.Worker項目是ComputeResourceConsolidation解決方案,可用於下載本指導意見的一部分。 
在運行時被初始化的角色建立所需的取消標記和任務來運行的一個列表中的輔助角色,代碼。async

[csharp]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
  1. public class WorkerRole: RoleEntryPoint  
  2. {  
  3.   // The cancellation token source used to cooperatively cancel running tasks.  
  4.   private readonly CancellationTokenSource cts = new CancellationTokenSource ();  
  5.   
  6.   // List of tasks running on the role instance.  
  7.   private readonly List<Task> tasks = new List<Task>();  
  8.   
  9.   // List of worker tasks to run on this role.  
  10.   private readonly List<Func<CancellationToken, Task>> workerTasks    
  11.                         = new List<Func<CancellationToken, Task>>  
  12.     {  
  13.       MyWorkerTask1,  
  14.       MyWorkerTask2  
  15.     };  
  16.     
  17.   ...  
  18. }  


設置在MyWorkerTask1和MyWorkerTask2方法來講明如何在同一輔助角色執行不一樣的任務。下面的代碼顯示MyWorkerTask1。這是休眠30秒,而後輸出一個跟蹤消息的簡單任務。重複這個過程,直到無限期的任務被取消。在MyWorkerTask2代碼很是類似。ide

[csharp]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
  1. // A sample worker role task.  
  2. private static async Task MyWorkerTask1(CancellationToken ct)  
  3. {  
  4.   // Fixed interval to wake up and check for work and/or do work.  
  5.   var interval = TimeSpan.FromSeconds(30);  
  6.   
  7.   try  
  8.   {  
  9.     while (!ct.IsCancellationRequested)  
  10.     {  
  11.       // Wake up and do some background processing if not canceled.  
  12.       // TASK PROCESSING CODE HERE  
  13.       Trace.TraceInformation("Doing Worker Task 1 Work");  
  14.   
  15.       // Go back to sleep for a period of time unless asked to cancel.  
  16.       // Task.Delay will throw an OperationCanceledException when canceled.  
  17.       await Task.Delay(interval, ct);  
  18.     }  
  19.   }  
  20.   catch (OperationCanceledException)  
  21.   {  
  22.     // Expect this exception to be thrown in normal circumstances or check  
  23.     // the cancellation token. If the role instances are shutting down, a  
  24.     // cancellation request will be signaled.  
  25.     Trace.TraceInformation("Stopping service, cancellation requested");  
  26.   
  27.     // Re-throw the exception.  
  28.     throw;  
  29.   }  
  30. }  


注意: 
經過示例代碼示出的方法是一個後臺進程的一個常見的實現。在現實世界的應用程序,你能夠按照這個結構相同,不一樣之處在於,你應該把本身的處理邏輯在等待取消請求的循環體。 

通過工人的角色已初始化它使用的資源,Run方法啓動兩個任務同時,以下圖所示。oop

[csharp]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
  1. ...  
  2. // RoleEntry Run() is called after OnStart().    
  3. // Returning from Run() will cause a role instance to recycle.  
  4. public override void Run()  
  5. {  
  6.   // Start worker tasks and add them to the task list.  
  7.   foreach (var worker in workerTasks)  
  8.     tasks.Add(worker(cts.Token));  
  9.   
  10.   Trace.TraceInformation("Worker host tasks started");  
  11.   // The assumption is that all tasks should remain running and not return,   
  12.   // similar to role entry Run() behavior.  
  13.   try  
  14.   {  
  15.     Task.WaitAny(tasks.ToArray());  
  16.   }  
  17.   catch (AggregateException ex)  
  18.   {  
  19.     Trace.TraceError(ex.Message);  
  20.   
  21.     // If any of the inner exceptions in the aggregate exception   
  22.     // are not cancellation exceptions then re-throw the exception.  
  23.     ex.Handle(innerEx => (innerEx is OperationCanceledException));  
  24.   }  
  25.   
  26.   // If there was not a cancellation request, stop all tasks and return from Run()  
  27.   // An alternative to cancelling and returning when a task exits would be to   
  28.   // restart the task.  
  29.   if (!cts.IsCancellationRequested)  
  30.   {  
  31.     Trace.TraceInformation("Task returned without cancellation request");  
  32.     Stop(TimeSpan.FromMinutes(5));  
  33.   }  
  34. }  
  35. ...  


 

在該示例中,執行命令方法等待要完成的任務。若是任務被取消,運行方法假定的角色正在關閉,並等待剩下的任務完成(這在終止前等待最多5分鐘)以前被取消。若是任務失敗,因爲預期異常,Run方法將取消該任務。 

注意: 

須要注意的是,你能夠實現Run方法更全面的監測和異常處理策略,如從新啓動已失敗的任務,或者包括代碼,使角色中止和啓動單個任務。 
在如下代碼中所示的中止方法時,網絡控制器將關閉角色實例(它是從的onStop方法調用)被調用。該代碼經過取消它優雅地中止每項任務。若是有任何的工做時間超過五分鐘就能完成,在Stop方法取消處理真正地中止等待和做用被終止。

 

[csharp]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
  1. // Stop running tasks and wait for tasks to complete before returning   
  2. // unless the timeout expires.  
  3. private void Stop(TimeSpan timeout)  
  4. {  
  5.   Trace.TraceInformation("Stop called. Canceling tasks.");  
  6.   // Cancel running tasks.  
  7.   cts.Cancel();  
  8.   
  9.   Trace.TraceInformation("Waiting for canceled tasks to finish and return");  
  10.   
  11.   // Wait for all the tasks to complete before returning. Note that the   
  12.   // emulator currently allows 30 seconds and Azure allows five  
  13.   // minutes for processing to complete.  
  14.   try  
  15.   {  
  16.     Task.WaitAll(tasks.ToArray(), timeout);  
  17.   }  
  18.   catch (AggregateException ex)  
  19.   {  
  20.     Trace.TraceError(ex.Message);  
  21.   
  22.     // If any of the inner exceptions in the aggregate exception   
  23.     // are not cancellation exceptions then re-throw the exception.  
  24.     ex.Handle(innerEx => (innerEx is OperationCanceledException));  
  25.   }  
  26. }  


 

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

相關文章
相關標籤/搜索