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
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ê.
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
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
- 1. Trường hợp sử dụng cho tác vụ buildNeeded?
- 2. Chỉ chạy tác vụ @Scheduled trên một nút cụm WebLogic?
- 3. Hợp tác đa tác vụ bằng cách sử dụng TPL
- 4. Rx và tác vụ - hủy tác vụ đang chạy khi tác vụ mới được sinh ra?
- 5. Có trường hợp nào không nên sử dụng Tác vụ không?
- 6. Django Celery: Chỉ thực hiện một trường hợp của một quy trình chạy dài
- 7. Chạy một tác vụ chạy nền hữu hạn dài
- 8. Tác vụ được lập lịch Sitecore chỉ chạy mỗi giờ
- 9. Đường ray: Chạy nhiều tác vụ rake cùng một lúc?
- 10. Làm thế nào để thiết lập một nhiệm vụ CRON để chỉ chạy một lần cho mỗi tập hợp các trường hợp?
- 11. chạy một tác vụ php cứ sau 24 giờ
- 12. Làm thế nào để sử dụng ít bộ nhớ hơn khi chạy một tác vụ trong Symfony 1.4?
- 13. android: chạy tác vụ nền bằng AlarmManager
- 14. Tôi có thể ghi đè tác vụ: môi trường trong test_helper.rb để kiểm tra tác vụ cào không?
- 15. Chạy nhiều C# Tác vụ Async
- 16. Hủy bỏ tác vụ đang chạy trong Celery trong django
- 17. Cách sử dụng tác vụ XmlPeek?
- 18. Chỉ cho phép 3 trường hợp của một ứng dụng bằng cách sử dụng các semaphores
- 19. Sử dụng biến môi trường trong nhiệm vụ Rake
- 20. Trường hợp sử dụng để phản ánh
- 21. Chạy hai tác vụ độc lập đồng thời bằng cách sử dụng các chủ đề
- 22. Trường hợp sử dụng DropBoxManager?
- 23. Lập lịch nhiệm vụ chạy một lần, sử dụng không gian tên nhiệm vụ Spring
- 24. Chỉ cho phép một trường hợp ứng dụng
- 25. Cách chạy tác vụ khi dịch vụ windows khởi động?
- 26. sử dụng số sql trong một tuyên bố trường hợp
- 27. Daemon thread- Trường hợp sử dụng
- 28. Cố gắng tạo một tác vụ được lập lịch để chạy khi sử dụng C++, Task Scheduler 1.0 trên win7
- 29. Đặt ái lực CPU bằng cách sử dụng tập hợp tác vụ
- 30. Làm cách nào để tạo các tác vụ Rake chạy dưới ứng dụng/môi trường Sinantra của tôi?
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
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? –
Đúng. Tôi sẽ thực hiện tùy chọn cho thuê blob đó. Cảm ơn. – ThomasWeiss