Haruskah saya menggunakan perintah atau acara?

14

Perbedaan antara perintah dan peristiwa dalam komunikasi bus tampaknya agak samar bagi saya. Saya tahu bahwa perintah harus dijalankan sekali saja, sementara suatu peristiwa dapat ditangani beberapa kali, tetapi saya masih tidak yakin kapan harus menggunakan perintah atau acara.

Mari kita lihat sebuah contoh:

Ketika pengguna baru mendaftar ke aplikasi web, kita harus membuatnya akun dan mengirim email konfirmasi.

Membuat akun - ini sepertinya tempat yang tepat untuk mengirim CreateUserCommandke bus dan membiarkan komponen khusus menanganinya.

Atau mungkin ini seharusnya tidak diimplementasikan dengan komunikasi bus asinkron? Kami ingin pengguna dapat masuk ke aplikasi segera. Dengan bus kami tidak memiliki jaminan kapan perintah akan dieksekusi.

Mengirim email - setelah komponen membuat akun saya bisa melihat 2 kemungkinan

  1. Kirim perintah lain ke bus SendConfirmationEmailCommand
  2. Publikasikan suatu acara UserAccountCreatedEvent

Dan daripada membiarkan komponen pengirim email mengambilnya dan melakukan pekerjaannya.

Di satu sisi saya ingin email konfirmasi dikirim sekali saja (menggunakan perintah), di sisi lain, saya percaya ada beberapa komponen yang tertarik pada pengguna yang baru terdaftar. Logger atau mungkin pengirim SMS.

Bagaimana Anda mengimplementasikannya?

Andrzej Gis
sumber

Jawaban:

16

Pada prinsipnya, suatu perintah menggambarkan permintaan yang akan dieksekusi, sedangkan suatu peristiwa menggambarkan sesuatu yang telah terjadi:

  • Perintah membutuhkan beberapa tindakan yang harus dilakukan oleh prosesor, dan tindakan ini harus dilakukan hanya sekali oleh prosesor ini.

  • Suatu peristiwa adalah pemberitahuan dari beberapa tindakan yang sudah dijalankan atau terjadi eksternal. Beberapa pengolah / agen mungkin tertarik mengetahui tentang acara tersebut. Beberapa dari mereka mungkin lebih lanjut mengeluarkan perintah atau tindakan yang diperlukan oleh pemberitahuan ini dalam domain tanggung jawab mereka.

Dalam skenario Anda, saya mengerti bahwa:

  • CreateUserCommand adalah sebuah perintah
  • UserAccountCreatedEventadalah peristiwa yang harus dikeluarkan ketika CreateUserCommandberhasil diselesaikan oleh layanan manajemen akun

Sekarang ada dua kemungkinan:

  1. Layanan manajemen akun mengeluarkan masalah sendiri SendConfirmationEmailCommandpada bus, karena mengharapkan perintah ini dijalankan oleh layanan yang lebih khusus.
  2. Layanan manajemen akun tidak lebih dari mengirimkan pemberitahuan acara setelah selesai, dan pergi ke layanan lain (mis. Layanan komunikasi, layanan berlangganan, dll ...) keputusan apakah mengirim email / sms / dll ... dan jika diperlukan untuk mengeluarkan SendConfirmationEmailCommandperintah yang harus dilakukan oleh beberapa gateway.

Jika Anda memilih pendekatan bus layanan, masuk akal untuk menggunakan fleksibilitas yang memungkinkan, yaitu untuk memilih opsi 2.

Christophe
sumber
Terima kasih, itu sudah beres. Dua pertanyaan lagi tentang opsi 2: 1. Bagaimana layanan manajemen akun mengetahui tentang penyelesaian perintah? Saya percaya itu dengan mendengarkan acara yang diterbitkan oleh layanan khusus setelah menyelesaikan tugas mereka - daripada apa tujuan sebenarnya dari layanan manajemen akun? Untuk mempublikasikan ulang acara? Tampaknya berlebihan. 2. Saya juga tidak mengerti siapa yang seharusnya mengeluarkan SendConfirmationEmailCommand. Layanan manajemen akun atau "layanan lain"?
Andrzej Gis
1) Asumsi saya adalah bahwa layanan manajemen akun melakukan sendiri pekerjaan itu dan mengirim acara setelah selesai dengan sukses (mis. Tidak menemui kesalahan). Tapi Anda benar: ada kemungkinan bahwa layanan manajemen akun mengirimkan sendiri perintahnya ke layanan kegigihan / basis data dan harus memantau acara penyelesaian pekerjaan (mis. Jawaban asinkronik).
Christophe
@ gisek 2) di bus layanan, saya bayangkan Anda memiliki layanan yang sangat khusus, masing-masing memiliki tanggung jawab yang terbatas. Dalam hal ini Manajemen Akun hanya melakukan pembuatan dan memberi tahu siapa pun yang tertarik bahwa itu dilakukan. Beberapa layanan lain kemudian akan memantau hal-hal untuk bereaksi. Misalnya, Anda dapat memiliki manajer komunikasi, yang akan bertanggung jawab untuk menerapkan aturan bisnis untuk memutuskan kapan dan bagaimana mengkomunikasikan peristiwa kepada pengguna. Jika Anda melakukan 1) +2) di layanan yang sama, Anda tidak akan membutuhkan bus layanan.
Christophe