2015-06-19 25 views
6

Sau khi đọc tấn thông tin trên web về Azure WebJobs, tài liệu cho biết một công việc nên là không đáng kể, mặt khác, các blog nói rằng họ sử dụng WebJob để thực hiện các hành động như "tính phí khách hàng", "gửi email" .Làm thế nào liên tục Azure Web Jobs có thể được idempotent và gửi email?

This documentation nói rằng chạy một WebJob liên tục trên nhiều phiên bản có hàng đợi có thể dẫn đến việc được gọi nhiều lần. Mọi người có thực sự bỏ qua thực tế là họ có thể tính phí cho khách hàng của họ hai lần hoặc gửi một email hai lần không?

Làm cách nào để đảm bảo rằng tôi có thể chạy WebJob với hàng đợi trên ứng dụng web được chia tỷ lệ và thư chỉ được xử lý một lần?

Trả lời

1

Tôi thực hiện việc này bằng cơ sở dữ liệu, truy vấn cập nhật có khóa hàng và đối tượng TransactionScope.

Trong bảng Đặt hàng, hãy tạo cột để quản lý trạng thái của hành động bạn đang thực hiện trong WebJob. ví dụ: EmailSent. Trong chức năng QueueTrigger bắt đầu một giao dịch, sau đó thực hiện truy vấn UPDATE trên đơn đặt hàng của khách hàng với tập ROWLOCK, đặt EmailSent = 1 với WHERE EmailSent = 0. Nếu giá trị trả về từ SqlCommand = 0 thì thoát khỏi hàm. Một WebJob khác đã gửi email. Nếu không, gửi email và gọi Complete() trên đối tượng TransactionScope nếu được gửi thành công.

Điều đó sẽ cung cấp idempotency bạn muốn.

Hy vọng điều đó sẽ hữu ích.

+1

Tôi đã nghĩ đây là giải pháp cuối cùng của mình. Tuy nhiên, các lỗi được quản lý như thế nào? Nếu một trong các máy chủ hoàn thành mà không có thất bại và không có e-mail được gửi, sau đó các máy chủ khác không hoàn thành và có lỗi, làm thế nào sẽ không được quản lý ở đây? Nó sẽ kích hoạt lại? Đi đến chất độc? hoặc hoàn toàn bỏ qua lỗi? Tôi cảm thấy đây là một tính năng được thực hiện một nửa từ Microsoft. Khóa phải được triển khai ở cấp SDK. – jsgoupil

+0

Tôi biết đây là câu hỏi cũ nhưng bạn có thể thêm dấu thời gian vào bảng đó để bạn có thể đăng nhập khi bảng bị khóa vì vậy nếu dấu thời gian đó dài hơn X phút, giả sử nó không thành công và xóa nó để cho phép thông báo tiếp theo xử lý nó. Bạn nói đúng rằng điều này không được triển khai đầy đủ trong SDK nhưng đây không phải là thứ mà chính SDK có thể xử lý vì mọi tình huống đều khác nhau. Ý tôi là, nếu bạn không có cơ sở dữ liệu SQL Server thì sao? Bạn rõ ràng phải có một giải pháp khác. Và làm thế nào là SDK để biết phạm vi của idempotency là gì? Một lần nữa, điều này thay đổi theo từng trường hợp. – Jaxidian

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