Haruskah saya bertukar dari WCF ke NserviceBus

13

Kami memiliki server pusat yang mengirim dan menerima pesan dari sejumlah PC yang berlokasi di jaringan klien di berbagai lokasi. Untuk memfasilitasi ini, saat ini saya menggunakan WCF dengan TCPNetBindings, menggunakan komunikasi dupleks yang diamankan dengan sertifikat.

Sekarang, kami memiliki sejumlah masalah dengan ini - terutama bahwa kami diminta untuk mendukung "mode terputus" (kami harus toleran terhadap kesalahan). Dari apa yang saya tahu, tidak ada cara sederhana untuk melakukan ini menggunakan tumpukan WCF - kita perlu mengimplementasikan sesuatu dan mungkin menggunakan msmq. Saya telah melihat NServiceBus akhir-akhir ini, dan dari saya bisa melihatnya cocok dengan toleransi - kesalahan, pesan dapat dikirim melalui internet melalui http gateway sederhana, dll. Saya tahu itu dihormati di masyarakat, dan Saya bisa melihat mengapa dari melihat ke dalamnya.

Jadi, pertanyaan saya adalah ... Apakah mempekerjakan NServiceBus terdengar seperti ide yang masuk akal, atau apakah ada yang punya saran lain / pengalaman dunia nyata yang berhubungan dengan ini? Saya kira saya khawatir memperkenalkan teknologi baru yang saya tahu sedikit tentang, dan menghadapi masalah dengan hal-hal seperti mengamankan itu, mengatur semuanya dengan cara yang dapat diandalkan, membuat Gotcha sepanjang jalan .. Saya juga waspada terhadap "emas- melapisi "arsitekturnya, dan memilih sesuatu yang mengkilap yang pada akhirnya akan menghambat saya dalam implementasi dibandingkan bertahan dengan WCF dan hanya membuatnya bekerja untuk saya ..

Terima kasih!

Matt Roberts
sumber
1
> mendukung "mode terputus" (kita harus toleran terhadap kesalahan) Bukankah Anda masih harus membangun banyak toleransi kesalahan pada sisi klien sendiri? Toleransi kesalahan MSMQ pada server sangat bagus untuk memulihkan keadaan jika terjadi masalah, tetapi saya masih melihat bahwa menjadi kepala sangat sakit pada klien tidak peduli apa yang Anda pilih.
brian
1
Yang saya perlu dukung adalah "jaminan" bahwa klien akan mengirim pesan ke server dan server akan mendapatkannya pada akhirnya - jadi jika kita offline kita harus terus mencoba sampai kita tiba di sana. Itulah yang dilakukan NSB "gratis", sedangkan sebagai solusi WCF (saya pikir) akan memerlukan kode ..
Matt Roberts
Saya setuju sebagian dengan Brian. MSMQ, jika dikonfigurasi dengan benar di versi terbaru memberi Anda mode terputus yang cukup bagus di luar kotak selama Anda mengkonfigurasi antrian dan pesan untuk berperilaku seperti itu. Klien dapat mempertahankan pesan dalam antrian keluar lokal dan mengirim ulang ketika server kembali tersedia pada antrian jarak jauh.
Bill
WCF memiliki binding MSMQ ... Saya tahu banyak tentang beberapa aplikasi sukses berskala besar yang memanfaatkan ini. Yang mengatakan, saya juga suka nServiceBus, tetapi melakukan hal yang berbeda.
Kyle Hodgson

Jawaban:

12

Saran saya, jika Anda perlu cepat tentang ini dan hanya perlu sesuatu yang sederhana untuk memfasilitasi operasi tahan lama (terputus) dengan WCF, adalah untuk melihat ke dalam binding WCF - MSMQ. Jika Anda membutuhkan sesuatu di lingkungan yang lebih besar, lihat nServiceBus.

Dalam pikiran saya, nServiceBus akan benar-benar mulai bersinar di lingkungan terdistribusi yang lebih besar. Ambil, misalnya, contoh berikut (itu akan sangat sulit dengan WCF tetapi sederhana dengan nServiceBus):

  • Infrastruktur terdiri dari tier server aplikasi, tier server cache, tier database hanya baca, tier database baca / tulis
  • Setiap kali klien mengirimkan entri baru, Anda benar-benar ingin semua tingkatan ini diperbarui sekaligus
  • Di WCF, Anda perlu mengekspos layanan terpisah di setiap tingkat dan meminta klien mendorong mereka semua (atau meminta orkestrasi pusat melakukan hal yang sama untuk Anda)
  • Di nServiceBus Anda akan memiliki setiap tingkat menjadi pelanggan informasi ini, dan klien akan mempublikasikannya sekali, memungkinkan bus layanan untuk mengurus sisanya

WCF memiliki Binding MSMQ

Jika Anda harus tetap menggunakan WCF, namun (jadwal pendek, perlu fitur WCF lainnya), saya sarankan Anda membaca artikel ini di MSDN. Ini menunjukkan kepada Anda bagaimana menggunakan binding WCF untuk MSMQ, dan kemudian menunjukkan kepada Anda bagaimana memigrasi satu layanan dari HTTP ke MSMQ. Sepanjang jalan itu menunjukkan kepada Anda beberapa masalah dengan skenario ini (dan solusi yang berguna untuk masalah ini).

Kedua saran ini banyak menggunakan MSMQ, jadi catatan tentang hal itu: tidak seperti Apache MQ, RabbitMQ, dan sistem antrian populer lainnya, MSMQ bukan arsitektur antrian berbasis broker yang khas, melainkan antrian terdistribusi. Ini berarti bahwa jika klien WCF Anda mengirim pesan melalui transport MSMQ sementara itu tidak dapat terhubung ke server jarak jauh yang menjadi tuan rumah antrian, mesin klien akan mengirim pesan dalam apa yang disebut sebagai "Antrian Keluar" secara lokal sebagai gantinya. Pesan akan tetap di sana dengan aman sampai layanan MSMQ klien mendeteksi bahwa ia dapat terhubung ke layanan MSMQ jarak jauh lagi. Pada titik itu pesan akan mengalir dari klien ke tujuan akhir.

Setidaknya ada satu peringatan di atas - jika server jauh offline terlalu lama (periksa dokumentasi Anda untuk MSMQ) klien akan menyerah dan memindahkan pesan dari keluar ke antrian surat mati. Pesan yang ditransfer ke antrian surat mati tidak dapat dikirim ulang secara otomatis, mereka harus dibangun kembali.

Jika Anda memerlukan enkripsi dan tidak memiliki ActiveDirectory, pada entri blog ini , Sergey Sorokin merinci langkah-langkah yang diperlukan untuk mengenkripsi komunikasi MSMQ menggunakan WCF tanpa Active Directory.

Kyle Hodgson
sumber
7

Mereka bukan pengganti 1 untuk 1 - sering kali Anda akan menggunakan NServiceBus untuk memberi makan pesan atau mengambil pesan dari titik akhir WCF.

Bagaimanapun, menangani skenario mode terputus seperti ini adalah di mana antrian pesan benar-benar bersinar. NServiceBus adalah tempat yang baik untuk memulai. Ada sejumlah opsi lain di luar sana. Saya akan perhatikan banyak dari mereka yang benar-benar membungkus MSMQ pada akhir hari - MSMQ adalah ujung belakang yang sangat solid dan mungkin layak digunakan ketika itu dapat diakses.

Wyatt Barnett
sumber
Terima kasih. Poin diambil, meskipun saya melihat sebagai pengganti 1: 1 dalam kasus saya karena sebagian besar WCF saya ada di sana untuk mendukung komunikasi antara PC ini dan server - nsb tampaknya mengurus semua ini untuk saya, maka itu swap -untuk saya.
Matt Roberts
Gotcha, maka itu akan bekerja dengan cukup baik untuk Anda.
Wyatt Barnett