Saya seorang DBA, jadi ini yang membuat respons saya terasa, tapi inilah yang akan saya lakukan:
- Jika Anda menggunakan SQL 2005+, gunakan Service Broker untuk menyimpan pesan dalam database daripada menyimpannya dalam tabel. Anda mendapatkan mekanisme antrian dengan ini, sehingga Anda dapat menyingkirkan MSMQ. Anda juga akan memiliki tabel, tetapi itu hanya akan menyimpan pegangan percakapan (pada dasarnya, penunjuk ke pesan) bersama dengan berapa kali ia mencoba pesan ini. Terakhir, Anda akan menginginkan semacam "kotak surat mati" tempat pesan yang mencapai ambang coba lagi.
- Dalam kode pemrosesan pesan Anda, lakukan hal berikut:
- Memulai transaksi
- Menerima pesan dari antrian
- Jika jumlah percobaan ulang lebih besar dari ambang batas, pindahkan ke kotak surat mati dan komit
- Tambahkan penghitung di atas meja untuk pesan ini
- Memproses pesan
- Jika pemrosesan berhasil, lakukan transaksi
- Jika pemrosesan gagal, masukkan pesan baru ke antrian dengan konten yang sama, lalu lakukan transaksi
Perhatikan bahwa tidak ada rollback yang direncanakan. Rollback di Service Broker bisa berakibat buruk; jika Anda melakukan rollback 5 kali tanpa penerimaan yang berhasil, antrian akan dinonaktifkan baik untuk enqueuing maupun dequeuing. Namun Anda tetap ingin melakukan transaksi jika pemroses pesan Anda mati di tengah pemrosesan (mis. server mogok).