Tôi nên sử dụng một lệnh hoặc một sự kiện?


14

Sự khác biệt giữa một lệnh và một sự kiện trong giao tiếp xe buýt có vẻ hơi mơ hồ đối với tôi. Tôi biết rằng các lệnh chỉ nên được thực hiện một lần, trong khi một sự kiện có thể được xử lý nhiều lần, nhưng tôi vẫn không chắc chắn khi nào nên sử dụng lệnh hoặc sự kiện.

Hãy xem xét một ví dụ:

Khi người dùng mới đăng ký vào một ứng dụng web, chúng ta nên tạo cho anh ta một tài khoản và gửi email xác nhận.

Tạo tài khoản - đây dường như là điểm thích hợp để gửi CreateUserCommandxe buýt và để một thành phần chuyên biệt xử lý nó.

Hoặc có lẽ điều này thậm chí không nên được thực hiện với giao tiếp xe buýt không đồng bộ? Chúng tôi muốn người dùng có thể đăng nhập vào ứng dụng ngay lập tức. Với xe buýt, chúng tôi không đảm bảo khi nào lệnh sẽ được thực thi.

Gửi email - sau khi thành phần tạo tài khoản tôi có thể thấy 2 khả năng

  1. Gửi lệnh khác đến xe buýt SendConfirmationEmailCommand
  2. Xuất bản một sự kiện UserAccountCreatedEvent

Và hơn là để thành phần người gửi email lấy nó và công việc của nó.

Một mặt tôi muốn email xác nhận chỉ được gửi một lần (sử dụng lệnh), mặt khác, tôi tin rằng có thể có nhiều thành phần quan tâm đến người dùng mới đăng ký. Một logger hoặc có thể là một người gửi SMS.

Làm thế nào bạn sẽ thực hiện nó?

Câu trả lời:


16

Về nguyên tắc, một lệnh mô tả một yêu cầu sẽ được thực hiện, trong khi một sự kiện mô tả điều gì đó đã xảy ra:

  • Lệnh yêu cầu một số hành động được thực hiện bởi bộ xử lý và hành động này chỉ được thực hiện một lần bởi bộ xử lý này.

  • Một sự kiện là thông báo về một số hành động đã được thực hiện hoặc xảy ra bên ngoài. Một số bộ xử lý / đại lý có thể quan tâm đến việc biết về sự kiện này. Một số trong số họ có thể tiếp tục ban hành các lệnh hoặc hành động theo yêu cầu của thông báo này trong phạm vi trách nhiệm của họ.

Trong kịch bản của bạn, tôi hiểu rằng:

  • CreateUserCommand là một lệnh
  • UserAccountCreatedEventlà một sự kiện nên được phát hành khi CreateUserCommandhoàn thành thành công bởi dịch vụ quản lý tài khoản

Bây giờ có hai khả năng:

  1. Dịch vụ quản lý tài khoản phát hành chính nó SendConfirmationEmailCommandtrên xe buýt, vì nó hy vọng lệnh này sẽ được thực thi bởi một dịch vụ chuyên biệt hơn.
  2. Dịch vụ quản lý tài khoản không làm gì khác hơn là gửi thông báo sự kiện khi hoàn thành và để lại cho dịch vụ khác (ví dụ: dịch vụ liên lạc, dịch vụ đăng ký, v.v.) quyết định về việc có hay không gửi email / sms / vv ... và nếu cần thiết để ban hành một SendConfirmationEmailCommandlệnh được thực hiện bởi một số cổng.

Nếu bạn đã chọn cách tiếp cận xe buýt dịch vụ, sẽ rất hợp lý khi sử dụng tính linh hoạt mà điều này cho phép, tức là ưu tiên lựa chọn 2.


Cảm ơn, điều đó sẽ xóa mọi thứ. Hai câu hỏi nữa về tùy chọn 2: 1. Dịch vụ quản lý tài khoản sẽ biết về việc hoàn thành lệnh như thế nào? Tôi tin rằng bằng cách lắng nghe các sự kiện được xuất bản bởi các dịch vụ chuyên ngành sau khi hoàn thành nhiệm vụ của họ - hơn mục đích thực sự của dịch vụ quản lý tài khoản là gì? Để tái bản các sự kiện? Có vẻ dư thừa. 2. Tôi cũng không hiểu ai là người phát hành SendConf ConfirmationEmailCommand. Dịch vụ quản lý tài khoản hay "dịch vụ khác"?
Andrzej Gis

1) giả định của tôi là dịch vụ quản lý tài khoản tự thực hiện công việc và gửi sự kiện khi nó kết thúc thành công (nghĩa là không gặp lỗi). Nhưng bạn đã đúng: có thể dịch vụ quản lý tài khoản sẽ tự gửi các lệnh đến dịch vụ cơ sở dữ liệu / kiên trì và phải theo dõi sự kiện hoàn thành công việc (ví dụ: câu trả lời không đồng bộ).
Barshe

@gisek 2) trong xe buýt dịch vụ, tôi tưởng tượng rằng bạn có các dịch vụ rất chuyên biệt, mỗi dịch vụ có trách nhiệm hạn chế. Trong trường hợp này, Quản lý tài khoản chỉ thực hiện việc tạo và thông báo cho bất kỳ ai quan tâm rằng nó đã được thực hiện. Một số dịch vụ khác sau đó sẽ theo dõi mọi thứ để phản ứng. Chẳng hạn, bạn có thể có một người quản lý truyền thông, người chịu trách nhiệm áp dụng các quy tắc kinh doanh để quyết định thời điểm và cách truyền đạt các sự kiện tới người dùng. Nếu bạn làm 1) +2) trong cùng một dịch vụ, bạn sẽ khó cần xe buýt phục vụ.
Barshe
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.