Kelebihan sistem "Pesan Passing" vs. sistem "Berbasis Acara"

27

Pertanyaan saya datang dari perspektif yang agak tidak berpendidikan.

Apa manfaat relatif dari sistem " message passing " vs sistem " event based ".

Mengapa satu memilih satu dari yang lain? Apa kekuatan dan kelemahan mereka?

Saya ingin tahu bukan hanya "secara teori", tetapi juga "dalam praktik".

EDIT:

Masalah khusus :

Saya ingin membangun sistem komponen plug-mampu yang berperilaku sebagai layanan skala kecil (masing-masing melakukan beberapa tugas kecil dan atau memberikan beberapa informasi).

Layanan dapat:

  • berlapis sehingga output dari satu layanan dapat bertindak sebagai salah satu input ke yang lain
  • memiliki hierarki penahanan sehingga satu layanan dapat dimuat oleh yang lain tanpa hubungan input-output spesifik seperti yang disebutkan dalam kalimat sebelumnya

Tujuan dari sistem ini adalah untuk menerjemahkan satu aliran peristiwa tingkat rendah di sistem lain menjadi informasi dan fungsionalitas tingkat yang lebih tinggi, dan di samping itu menyediakan saluran kembali ke sistem lain yang menyediakan serangkaian peristiwa tunggal.

Saya dapat memberikan lebih banyak detail jika ini tidak cukup.

Setelah melihat-lihat lagi. Ini dan ini mungkin menggambarkan situasi saya dengan lebih baik.

Sepertinya ini cocok untuk situasi saya: http://akka.io/

sylvanaar
sumber
3
Anda harus memberikan beberapa konteks. Seringkali sistem berbasis kejadian didasarkan melalui model penyampaian pesan, dan iblis ada dalam rinciannya. Dalam C # misalnya, model pesan yang lewat memungkinkan eksekusi ada pada utas berbeda, di mana peristiwa dipicu pada utas panggilan.
Telastyn
1
Saya dapat mengajukan pertanyaan berdasarkan spesifik pada proyek saya, namun saya ingin membuatnya cukup umum agar tidak hanya berlaku untuk saya.
sylvanaar
1
Seperti yang dikomentari @Telastyn - "pesan lewat" dan "berbasis acara" tidak saling eksklusif.
Oded
Sementara ada tren di antara semantik yang digambarkan sebagai peristiwa berdasarkan dan yang digambarkan sebagai pesan yang lewat , perilaku mereka akan spesifik untuk sistem yang diberikan. Anda hanya perlu melihat jumlah opsi yang diberikan dalam Gambaran umum sistem kelulusan pesan untuk melihat bahwa ada sedikit perbedaan antara acara sederhana dan beberapa pesan , tetapi semantik pesan lainnya bisa sangat berbeda. Anda perlu memberi tahu kami masalah apa yang Anda coba selesaikan .
Mark Booth

Jawaban:

17

Dalam pengalaman saya, satu-satunya perbedaan spesifik adalah bahwa di sebagian besar sistem pengiriman pesan, pengirim pesan mengetahui (dan sering menyatakan) siapa penerima pesan tersebut.

Jadi, alih-alih memunculkan suatu acara dan siapa pun yang mengikuti acara yang mendapatkannya, pengirim menentukan sejumlah id dari penerima yang dimaksud atau grup penerima yang logis dan kemudian mengirim pesan langsung kepada mereka, atau melalui perantara pesan (meskipun OS dapat dilihat sebagai pialang pesan dalam sistem berbasis acara).

Jelas ada kasus threading yang disebutkan Telastyn dengan implementasi acara C #, tetapi Anda masih dapat membuat model pub / sub Anda sendiri yang dijalankan pada utas yang berbeda.

Steven Evers
sumber
21

Ini adalah apel dan jeruk:

Sistem Event Driven dapat bereaksi terhadap peristiwa yang dikirimkan sebagai pesan (pesan dalam konteks ini tersirat data yang tidak dapat dibagikan yang tidak dapat diubah ) saat acara dimunculkan. Ini adalah desain arsitektur murni.

Sistem Passing Pesan dapat didorong oleh peristiwa yang membuat dan menyampaikan pesan. Ini adalah desain implementasi murni.

Keduanya tidak saling eksklusif.

Contoh: Anda dapat menerapkan desain yang digerakkan oleh peristiwa dalam bahasa apa pun yang juga bisa menjadi lingkungan pengiriman pesan seperti di Erlang.


sumber
11

Sebagian besar kebingungan antara "passing pesan" dan "berbasis acara" ada hubungannya dengan detail arsitektur vs. implementasi. Saya telah melihat (dan menulis) sistem event driven yang benar-benar menggunakan OS yang disediakan pesan untuk implementasi mereka. Saya kira Anda benar-benar mengacu pada ide-ide arsitektur.

Seperti banyak orang telah menunjukkan "lewat pesan" dan "berbasis acara" tidak cukup istilah yang cukup baik untuk menghindari ambiguitas.

Apa manfaat relatif dari sistem "message passing" vs sistem "event based".

Pesan Berlalu

Saya akan mulai dengan menebak bahwa ketika Anda mengatakan sistem "message passing", Anda berbicara tentang sistem yang satu objek menghabiskan pesan ke objek lain yang spesifik. Ketika saya memikirkan sistem yang didasarkan pada paradigma ini, saya lebih umum memikirkan sistem di mana objek yang mendeteksi sesuatu tahu siapa yang perlu diberitahu tentang sesuatu. (Saya tidak menentukan bagaimana ia tahu, hanya saja itu yang tahu.)

Jenis arsitektur ini sangat baik untuk sistem di mana produsen dan konsumen terkenal. Entah produsen pesan tahu siapa yang harus menerimanya, atau konsumen harus tahu dari siapa menerima pesan itu.

Jika Anda menulis aplikasi perbankan, orang akan berharap Anda benar-benar ingin tahu kepada siapa Anda mengirim transaksi dan dari siapa mereka berasal.

Berbasis Acara

Sistem lain yang saya percaya Anda pikirkan ketika Anda mengatakan sistem "berbasis acara" adalah sistem di mana objek memunculkan "peristiwa" tanpa mengetahui siapa (jika ada orang) yang akan menanggapinya.

Jenis arsitektur yang digerakkan oleh acara ini sangat baik untuk sistem di mana produsen tidak peduli tentang siapa yang mengkonsumsi acara atau di mana konsumen tidak benar-benar peduli tentang siapa yang memproduksi acara tersebut.

Secara umum, sistem ini bagus di mana Anda tidak tahu hubungan antara konsumen dan produsen, dan di mana Anda mengharapkan hubungan menjadi dinamis.

Satu sistem yang saya gunakan dalam hal ini adalah sistem di mana aplikasi sebenarnya terdiri dari modul yang dikonfigurasi secara dinamis (plug-in) yang dimuat pada saat dijalankan. Ketika sebuah modul dimuat, itu akan mendaftar untuk acara yang dipedulikannya. Hasilnya adalah sistem di mana sangat mudah untuk memperluas fungsionalitasnya.

Misalnya, katakanlah kondisi A mengangkat EA Peristiwa yang biasanya menyebabkan respons RA. Objek yang menyebabkan respons RA hanya terdaftar untuk menerima peristiwa EA dan menindaklanjutinya ketika tiba. Sekarang, katakanlah kita ingin menambahkan respons baru ke EA, yang disebut RA_1. Untuk melakukan ini, kami cukup menambahkan objek baru yang mencari EA dan menghasilkan respons RA_1.

Berikut adalah beberapa contoh (menggunakan terminologi Anda):

  • "message passing" : Bos Anda memberi tahu Anda untuk mengisi lembar waktu Anda.
  • "event driven" : Sekretaris departemen mengirimkan email kepada semua orang yang mengingatkan mereka bahwa waktu mereka jatuh tempo hari ini.
jerny
sumber
4
Itu mengingatkan saya ... ini akhir bulan, jadi saya lebih baik mengisi waktu saya.
Dave Nay
2

Di SOA Anda memiliki konsep Pesan Perintah dan Pesan Acara . Ada kebutuhan untuk keduanya.

Namun, pesan perintah memiliki kopling perilaku yang lebih tinggi ke titik akhir penerima karena secara eksplisit meminta titik akhir untuk melakukan beberapa fungsi. Tidak perlu dikaitkan dengan titik akhir tertentu (ini dapat dikonfigurasi atau ditentukan saat runtime).

Pesan acara, di sisi lain, tidak memiliki kopling perilaku antara pengirim / penerima karena pengirim tidak tahu apa yang akan dilakukan penerima dengan pesan tersebut. Bahkan tidak tahu apakah ada yang berlangganan acara tersebut.

Untuk latar belakang lebih lanjut, Anda dapat membaca situs bus layanan saya di sini: http://www.servicebus.co.za


sumber
1

Dalam pengalaman saya, perbedaan terbesar antara keduanya adalah bahwa pesan dalam sistem passing pesan adalah objek kelas satu, sedangkan peristiwa dalam sistem yang dikendalikan oleh peristiwa jauh lebih sederhana. Pesan cenderung membawa informasi, dan informasi itu dapat diubah, disimpan, diambil, dan dikirim kembali. Acara cenderung membawa bit informasi yang lebih kecil dan lebih fokus yang segera dikonsumsi dan kemudian dibuang. Mereka cenderung dikirim dari sumber acara langsung ke satu atau lebih peristiwa tenggelam, sedangkan pesan lebih sering dialihkan di antara beberapa penerima, dan dapat dikonversi / diterjemahkan / dibungkus atau diproses di titik mana pun di sepanjang rute. Mereka menggunakan teknologi serupa (bus, antrian, filter, dll) tetapi mereka benar-benar binatang yang berbeda.

TMN
sumber
0

Dari sudut pandang praktis, pesan biasanya diimplementasikan sebagai blok memori yang disalin dari ruang alamat pengirim ke ruang alamat penerima (atau jika tidak dipaksakan menjadi objek abadi) sehingga Anda segera mendapatkan keamanan benang.

Dalam beberapa kasus lewat pesan, pengirim harus menentukan penerima, tetapi dalam beberapa kasus lain Anda hanya dapat memposting pesan ke kotak surat, dan siapa pun dapat mendengarkan pesan di kotak surat itu, sehingga ada beberapa fleksibilitas dalam seberapa eratnya mereka. Tentu saja, Anda dapat memiliki kotak surat di mana kontraknya adalah "Saya akan mengirim pesan ke kotak surat ini ketika acara ini terjadi."

Jika Anda mendaftarkan delegasi atau panggilan balik ke pemilik acara. Dalam pemrograman berorientasi objek ini berarti pemilik acara menyimpan referensi ke objek yang terdaftar untuk menerima acara. Hal ini kadang-kadang dapat menyebabkan mimpi buruk pembukuan, mencoba untuk mencari tahu objek apa yang lupa membatalkan pendaftaran event handler mereka. Ini berarti target tidak dapat menjadi sampah yang dikumpulkan sampai pemilik acara adalah sampah yang dikumpulkan, bahkan jika target tersebut tidak lagi melakukan sesuatu yang bermanfaat.

Secara pribadi saya akan memilih pesan yang melewati acara, kecuali dalam kasus di mana acara dipaksakan pada Anda, seperti pemrograman Windows GUI, dll.

Scott Whitlock
sumber
Hanya fyi, saya memecahkan masalah siklus (mimpi buruk Anda dalam pembukuan) di sistem acara C ++ saya dengan menyimpan lemah_ptr dan membersihkan semua pointer. Expired () dari set pendengar setiap kali acara dipanggil. Objek acara tidak memiliki objek penerima dan semantik pointer ini memperjelas.
Robinson