2012-03-15 16 views
8

Trong ngữ cảnh bạn đang triển khai một vai trò web qua nhiều phiên bản và yêu cầu lên lịch một tác vụ chỉ được thực hiện bởi một cá thể (như gửi email đến trang web admin với một số chỉ số), mức độ đáng tin cậy khi sử dụng RoleEnvironment.CurrentRoleInstance.Id để làm nhiệm vụ chỉ chạy trên một cá thể (như chỉ chạy nó nếu Id kết thúc bằng IN_0)? Nếu có ai từng làm điều này, tôi sẽ quan tâm đến phản hồi của anh ấy.Sử dụng CurrentRoleInstance.Id để chạy tác vụ chỉ trong một trường hợp

Trả lời

10

tôi sẽ không sử dụng Ví dụ ID. Điều gì sẽ xảy ra nếu trường hợp 0 ​​được khởi động lại (điều này xảy ra ít nhất một lần mỗi tháng)? Bây giờ trình lập lịch biểu hoặc nhiệm vụ của bạn đang ngoại tuyến.

Giải pháp thay thế là sử dụng loại mutex mở rộng các trường hợp. Người tôi đang nghĩ đến là một hợp đồng cho thuê blob. Bạn thực sự có thể có được một hợp đồng thuê trên một blob để viết (và chỉ có thể là một người cho thuê). Bạn có thể cố gắng để có được một blob thuê trước khi chạy một nhiệm vụ. Nếu bạn nhận được nó, hãy chạy tác vụ. Nếu bạn không, đừng chạy nó.

Biến thể nhỏ: Trong chuỗi (giả sử bắt đầu từ phương thức Run()), cố gắng có được hợp đồng thuê và nếu thành công, hãy khởi chạy tác vụ lên lịch (có thể là chuỗi hoặc nội dung). Nếu bạn không thể có được hợp đồng thuê nhà, hãy ngủ trong một phút và thử lại. Cuối cùng, trường hợp với hợp đồng thuê sẽ được khởi động lại (hoặc nó sẽ biến mất vì một số lý do khác). Sau một vài giây, một trường hợp khác sẽ thu được hợp đồng thuê bị bỏ rơi và khởi động một tác vụ lên lịch mới.

Steve Marx đã viết blog post về đồng thời sử dụng hợp đồng cho thuê. Tyler Doerksen cũng có good post về hợp đồng thuê.

+0

Cảm ơn bạn đã trả lời, tôi đã đi qua bài viết trên blog của smarx. Tuy nhiên, tôi không hoàn toàn nhận được quan điểm của bạn về trường hợp được khởi động lại. Sau khi khởi động lại, nó sẽ vẫn có cùng một ID cá thể, đúng không? Nếu có, nó sẽ có thể đối phó với tình huống khi nó được khởi động lại chính xác khi nhiệm vụ được chạy (bằng cách chạy nó ngay sau khi khởi động lại chẳng hạn). – ThomasWeiss

+1

Quan điểm của tôi là bạn luôn muốn có một trình lập lịch biểu đang chạy. Nếu bạn phụ thuộc vào một trường hợp cụ thể, bạn được đảm bảo có thời gian chết. Ngoài ra: điều gì xảy ra nếu bạn mở rộng * xuống *? Bạn không thể chỉ định cá thể nào cần xóa.Điều gì sẽ xảy ra nếu cá thể bị loại bỏ là cá thể bạn đề cập đến mọi lúc? –

+0

Đúng. Tôi sẽ thực hiện tùy chọn cho thuê blob đó. Cảm ơn. – ThomasWeiss

0

Có thể có một số khối mã thực thi chỉ chạy một lần nếu bạn có nhiều phiên bản, ví dụ như kiểm tra ID của cá thể vai trò hiện tại bạn đang thực hiện tại.

Bạn có thể đạt được kết quả tương tự với các giải pháp khác, nhưng những người có thể yêu cầu một số công việc hơn, như tách nhiệm vụ từ ví dụ của bạn

5

có bạn có thể sử dụng InstanceId nếu cần specificaly

<Startup> 
    <Task commandLine="StartUpTasks\WindowService\InstallWindowService.bat" executionContext="elevated" taskType="background" > 
    <Environment> 
    <Variable name="InstanceId"> 
     <RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/@id"/> 
    </Variable> 
    </Environment> 
    </Task> 
</Startup> 

nó sẽ đi theo hình thức

<deployment Id>.<Application Name>.<Role Name>_IN_<index> 
Example mostly MyRole_IN_0, MyRole_IN_1 

Truy cập biến environmet trong tập tin thực thi như thế này

%InstanceId% 

Bạn sau đó sử dụng chuỗi con hoặc chỉ mục cuối cùng của _ để lấy chỉ mục từ InstanceId. nếu trường hợp này có chỉ mục 0 sẽ có cùng chỉ mục ngay cả sau khi khởi động lại.

Xem chi tiết http://blogs.msdn.com/b/cclayton/archive/2012/05/17/windows-azure-start-up-tasks-part-2.aspx

http://msdn.microsoft.com/en-us/library/windowsazure/hh404006.aspx

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