2015-04-22 15 views
12

Tôi đã triển khai Cloud Service với 4 vai trò công nhân, một trong số đó đã bật tự động mở rộng quy mô. Ngay sau khi tự động mở rộng quy mô xảy ra, tất cả các trường hợp của tất cả các vai trò được tái chế.Các trường hợp vai trò của Dịch vụ đám mây Azure - tự động mở rộng - Thay đổi sự kiện không kích hoạt

Lý tưởng nhất, tôi muốn dừng vai trò tái chế hoặc ít nhất là chấm dứt công việc của tất cả các vai trò khác theo cách được kiểm soát.

Tôi phát hiện ra rằng bạn có thể react to the RoleEnvironment.Changing event và hủy để yêu cầu tắt máy duyên dáng (tức là thực hiện OnStop). Tuy nhiên, bằng cách thêm đầu ra truy tìm vào trình xử lý sự kiện Thay đổi, tôi nhận thấy rằng sự kiện Thay đổi rõ ràng là thậm chí không bị sa thải, do đó việc hủy bỏ cũng không được đăng ký.

private void RoleEnvironmentChanging(object sender, RoleEnvironmentChangingEventArgs e) 
{ 
    // This tracing output does not show up in the logs table. 
    Trace.TraceInformation("RoleEnvironmentChanging event fired."); 
    if ((e.Changes.Any(change => change is RoleEnvironmentConfigurationSettingChange))) 
    { 
     // This one neither. 
     Trace.TraceInformation("One of the changes is a RoleEnvironmentConfigurationSettingChange. Cancelling.."); 

     e.Cancel = true; 
    } 
    if ((e.Changes.Any(change => change is RoleEnvironmentTopologyChange))) 
    { 
     // This one neither. 
     Trace.TraceInformation("One of the changes is a RoleEnvironmentTopologyChange. Cancelling."); 

     e.Cancel = true; 
    } 
} 

public override bool OnStart() 
{ 
    // Hook up to the changing event to prevent roles from unnecessarily restarting. 
    RoleEnvironment.Changing += RoleEnvironmentChanging; 

    // Set the maximum number of concurrent connections 
    ServicePointManager.DefaultConnectionLimit = 12; 

    bool result = base.OnStart(); 

    return result; 
} 

Ngoài ra adding an internal endpoint cho mỗi vai trò không mang lại thay đổi. Ở đây cấu hình từ .csdef:

<WorkerRole name="MyRole" vmsize="Medium"> 
[...ConfigurationSettings...] 
<Endpoints> 
    <InternalEndpoint name="Endpoint1" protocol="http" /> 
</Endpoints> 
</WorkerRole> 

Đồng thời thay đổi giao thức thành "bất kỳ" không thành công.

Làm thế nào tôi có thể dừng các trường hợp vai trò của mình sau khi tái chế?

EDIT:
» đang bao gồm snippets
» lỗi chính tả cố định

Trả lời

-3

Vai trò phương pháp Môi trường và sự kiện Có năm địa điểm chính, nơi bạn có thể viết mã để đáp ứng với những thay đổi môi trường. Hai trong số này, OnStart và OnStop, là các phương thức trên lớp RoleEntryPoint mà bạn có thể ghi đè trong lớp vai trò chính của bạn (được gọi là WebRole hoặc WorkerRole theo mặc định). Ba sự kiện còn lại là các sự kiện trong lớp RoleEnvironment mà bạn có thể đăng ký: Thay đổi, Thay đổi và Dừng.

Mục đích của các phương pháp này là khá rõ ràng từ tên của họ:

OnStart gets called when the instance is first started. 
Changing gets called when something about the role environment is about to change. 
Changed gets called when something about the role environment has just been changed. 

Dừng được gọi khi dụ là về để được dừng lại. OnStop được gọi khi phiên bản đang được dừng lại. Trong mọi trường hợp, không có mã nào của bạn có thể thực hiện để ngăn hành động tương ứng xảy ra, nhưng bạn có thể trả lời theo bất kỳ cách nào bạn muốn. Trong trường hợp của sự kiện Changing, bạn cũng có thể chọn xem instance có nên được tái chế để xử lý thay đổi cấu hình hay không bằng cách đặt e.Cancel = true.

Tại sao không thay đổi và thay đổi kích hoạt trong ứng dụng của tôi? Khi tôi lần đầu tiên bắt đầu khám phá chủ đề này, tôi quan sát thấy các hành vi bất thường sau trong cả Windows Azure Tính Emulator (trước đây được gọi là vải phát triển) và trong đám mây:

Các Thay đổi và thay đổi các sự kiện đã không bắn vào bất kỳ trường hợp khi tôi thực hiện thay đổi cấu hình. RoleEnvironment.CurrentRoleInstance.Role.Instances.Count luôn trả về 1, ngay cả khi có nhiều trường hợp trong vai trò. Nó chỉ ra rằng đây là hành vi mong đợi khi một vai trò không có thiết bị đầu cuối nội bộ được xác định, như tài liệu trong bài viết MSDN này. Vì vậy, giải pháp đơn giản là xác định điểm cuối nội bộ trong tệp ServiceDefinition.csdef của bạn như sau:

<Endpoints> 
    <InternalEndpoint name=”InternalEndpoint1″ protocol=”http” /> 
</Endpoints> 

Sự kiện cháy ở đâu và khi nào? Mặc dù tên của các sự kiện có vẻ khá tự giải thích, hành vi chính xác khi triển khai mở rộng quy mô lên và xuống không nhất thiết là những gì bạn có thể mong đợi. Sơ đồ sau đây cho biết các sự kiện nào sẽ kích hoạt trong một kịch bản ví dụ có chứa một vai trò duy nhất. 2 trường hợp được triển khai ban đầu, triển khai sau đó được chia tỷ lệ thành 4 phiên bản, sau đó quay lại 3 và cuối cùng triển khai bị dừng.

lấy từ http://azure.microsoft.com/blog/2011/01/04/responding-to-role-topology-changes/

+2

Cảm ơn câu trả lời. Nhưng chỉ cần sao chép-dán một trang web mà tôi thậm chí bao gồm trong câu hỏi của tôi và nói rằng điều này không làm việc, không phải là rất hữu ích cho tôi, xin lỗi! Bất kỳ ý tưởng khác tại sao điều này không làm việc cho tôi? –

2

Bạn đã thử một trong các cách sau?

  • Kiểm tra xem sự kiện này bị sa thải trong trường hợp của vai trò đó là tính năng tự động mở rộng quy mô (để đảm bảo nó không phải là một vấn đề với các thiết bị đầu cuối nội bộ)
  • Thực hiện hoàn chỉnh tái triển khai (thay vì cập nhật) .
  • Thêm Thread.Sleep() ngắn sau đầu ra Tracing trong trình xử lý sự kiện (đôi khi vai trò đang được tắt trước khi đầu ra dấu vết có thể được đăng ký)
  • Thực hiện thay đổi một trong các cấu hình thông qua cổng quản lý (và kiểm tra xem sự kiện được kích hoạt)
  • kiểm tra xem các sự kiện khác (ví dụ RoleEnvironment.Changed) đều bị sa thải
+1

Cảm ơn những gợi ý này, Paul. Thật không may, không ai trong số này mang lại thành công cho tôi. Đó là lý do tại sao tôi sẽ không đánh dấu câu trả lời của bạn là được chấp nhận vì nó có thể đánh lừa người dùng khác. Tuy nhiên, kể từ khi câu trả lời của bạn cho thấy hầu hết các nỗ lực trong việc cung cấp trợ giúp, tôi sẽ trao tiền thưởng cho bạn. Nếu bạn có thêm ý tưởng, vui lòng cho tôi biết! –

+1

Thx Benjamin. Tệ quá đến mức tôi không thể giúp bạn ... –

0

Wow, hơn 2 năm w/oa câu trả lời thực sự ở đây. Quá tệ. Trải nghiệm của tôi với chủ đề là: đặt e.Cancel thành false nếu phiên bản của bạn có thể hoạt động sau và trong khi chia tỷ lệ mà không cần phải định cấu hình lại.

if (e.Changes.Any(change => change is RoleEnvironmentConfigurationSettingChange)){ 
Trace.WriteLine("with recycle"); 
e.Cancel = true; 
} 
else { 
Trace.WriteLine("without recycle"); 
e.Cancel = false; 
} 

Có thể bạn muốn đặt Trace.AutoFlush = true at OnStart.

Các vấn đề liên quan