Tôi là một DBA, vì vậy điều đó giúp tôi cảm nhận được phản hồi của tôi, nhưng đây là những gì tôi phải làm:
- Nếu bạn đang sử dụng SQL 2005+, hãy sử dụng Service Broker để lưu trữ các thông báo trong cơ sở dữ liệu thay vì lưu trữ chúng trong một bảng. Bạn nhận được cơ chế xếp hàng với điều này, vì vậy bạn có thể loại bỏ MSMQ. Bạn cũng sẽ có một bảng, nhưng nó sẽ chỉ lưu trữ xử lý cuộc trò chuyện (về cơ bản, một con trỏ đến tin nhắn) cùng với số lần nó đã thử gửi thông báo này. Cuối cùng, bạn sẽ muốn một số loại "hộp thư chết", nơi các thư đạt đến ngưỡng thử lại của bạn sẽ được gửi đi.
- Trong mã xử lý tin nhắn của bạn, hãy thực hiện như sau:
- Bắt đầu giao dịch
- Nhận thông báo từ hàng đợi
- Nếu số lần thử lại lớn hơn ngưỡng, hãy chuyển nó vào ô chữ cái chết và cam kết
- Tăng bộ đếm trên bàn cho thông báo này
- Xử lý tin nhắn
- Nếu quá trình xử lý thành công, hãy thực hiện giao dịch
- Nếu quá trình xử lý không thành công, hãy đặt một thông báo mới vào hàng đợi có cùng nội dung và sau đó thực hiện giao dịch
Lưu ý rằng không có bất kỳ lần quay trở lại nào được lên kế hoạch. Rollbacks trong Service Broker có thể không tốt; nếu bạn quay lại 5 lần mà không nhận được thành công, hàng đợi sẽ bị vô hiệu hóa cho cả việc xếp hàng và xếp hàng lại. Nhưng bạn vẫn muốn có các giao dịch cho trường hợp khi bộ xử lý tin nhắn của bạn chết giữa quá trình xử lý (tức là máy chủ bị treo).