Làm thế nào để thực hiện một trình quản lý quy trình trong tìm nguồn cung ứng sự kiện


14

Tôi đang làm việc trên một ứng dụng ví dụ nhỏ để tìm hiểu các khái niệm về CQRS và tìm nguồn cung ứng sự kiện. Tôi có một Baskettổng hợp và một Producttổng hợp nên hoạt động độc lập.

Đây là một số mã giả để hiển thị việc thực hiện

Basket { BasketId; OrderLines; Address; }

// basket events
BasketCreated { BasketId; }
ItemAdded { BasketId; ProductId; Quantity }
AddItemSucceeded { BasketId; ProductId; Quantity }
AddItemRevoked { BasketId; ProductId; Quantity }
ItemRemoved { BasketId; ProductId; Quantity }
CheckedOut { BasketId; Address }

Product { ProductId; Name; Price; }

// product events
ProductReserved { ProductId; Quantity }
ProductReservationFailed { ProductId; Quantity }
ProductReservationCancelled { ProductId; Quantity; }

Các lệnh khá giống với các sự kiện, sử dụng tên bắt buộc và không quá khứ.

Ngay bây giờ những công việc này chỉ hoạt động tốt độc lập. Tôi đưa ra một lệnh AddItemvà nó tạo ra một ItemAddedsự kiện trên Baskettổng hợp để thực hiện những gì nó cần làm với trạng thái của 'Rổ'. Tương tự, đối với sản phẩm, lệnh và sự kiện chỉ hoạt động tốt.

Bây giờ tôi muốn kết hợp điều này thành một quá trình sẽ diễn ra như thế này (về các lệnh và sự kiện xảy ra):

Người quản lý quy trình sẽ làm như sau:

on BasketCreated: CreateShoppingProcess
on ItemAdded: ReserveProduct
on ProductReserved: SucceedAddingItem // does nothing, but needs to be there so that the basket knows it can check out
on ProductReservationFailed: RevokeAddItem
on RemoveItem: CancelProductReservation
on Checkout: CreateOrder // create an order and so on...

Các câu hỏi mà tôi không thể tìm thấy câu trả lời dứt khoát là:

  1. Tôi có cần phải kiên trì quản lý quá trình? Có vẻ như tôi làm, nhưng tôi không chắc
  2. Nếu tôi làm, tôi cần lưu các sự kiện cho trình quản lý quy trình. Tuy nhiên, các sự kiện mà nó đang nghe được gắn liền với các tập hợp. Tôi có thêm id quá trình cho những người đó không? Tôi có các sự kiện riêng chỉ dành cho người quản lý quy trình không? Làm thế nào để làm điều này và giữ càng sớm càng tốt
  3. Làm thế nào để tôi biết giỏ các ProductReservedsự kiện là gì? Có ổn không khi có một BasketIdtrong những điều đó quá, hoặc đó là thông tin rò rỉ?
  4. Làm cách nào để giữ mối quan hệ giữa các sự kiện, làm thế nào để tôi biết sự kiện nào đã ItemAddedtạo ra ProductReservedsự kiện đó ? Tôi có đi ngang qua EventIdkhông? Điều này có vẻ kỳ lạ ...
  5. Tôi có nên thực hiện Basketnhư một trình quản lý quy trình thay vì tổng hợp đơn giản không?

Sau một số nghiên cứu khác, tôi đã tìm ra điều này: A Saga là thứ gì đó giữ các sự kiện của riêng nó và lắng nghe các sự kiện từ bên ngoài. Về cơ bản, đó là một Tập hợp cũng có thể phản ứng với các sự kiện xảy ra bên ngoài thế giới nhỏ bé của chính nó.

Trình quản lý quy trình làm việc với các sự kiện từ bên ngoài và gửi các lệnh. Lịch sử của nó có thể được xây dựng lại từ các sự kiện đã xảy ra trên các Tập hợp có chung một định danh chung như một tương quanId.


Có vẻ như bạn đang cố mã hóa trong hệ thống của mình một quy trình chính thức diễn giải trường hợp sử dụng không chính thức hiện có được thực hiện bằng một loạt các lệnh. Làm như vậy, có vẻ như bạn đang tạo ra một số lệnh và sự kiện dư thừa bên cạnh các lệnh hiện có. Đó có phải là ý định của bạn? Doanh nghiệp cần gì đằng sau việc chính thức hóa mọi thứ như một quy trình trong mã? Điều gì trong miền của bạn yêu cầu bạn xác định quá trình này và lý do về nó là một khái niệm chính thức?
guillaume31

Đây là một dự án hoàn toàn được tạo ra trong đó mục đích là để tìm hiểu làm thế nào để hai tập hợp tương đối độc lập làm việc cùng nhau. Vì vậy, thực sự không có "nhu cầu kinh doanh" thực sự, và tôi đang cố gắng tránh sự dư thừa trong các lệnh và sự kiện này càng nhiều càng tốt. Do đó, sự nhầm lẫn với trình quản lý quy trình., Bởi vì dường như không nên lặp lại những thứ mà các tập hợp đã xử lý. Tuy nhiên, tôi cần giữ một kết nối giữa hai tập hợp này bằng cách nào đó. Có vẻ như việc sử dụng quan hệ nhân quả và tương quan có thể giúp ích, nhưng tôi cần thử.
Ivan Pintar

Câu trả lời:


14

Xem lại những gì Rinat Abdullin đã viết về quá trình phát triển kinh doanh . Cụ thể, lưu ý đề xuất của anh ấy về việc phát triển quy trình kinh doanh trong môi trường thay đổi nhanh - người quản lý quy trình là "chỉ" một sự thay thế tự động cho một người nhìn chằm chằm vào màn hình.

Mô hình tinh thần của riêng tôi về một trình quản lý quy trình là nó là một phép chiếu có nguồn gốc sự kiện mà bạn có thể truy vấn danh sách các lệnh đang chờ xử lý.

Tôi có cần phải kiên trì quản lý quá trình? Có vẻ như tôi làm, nhưng tôi không chắc

Đó là một mô hình đọc. Bạn có thể xây dựng lại trình quản lý quy trình từ lịch sử các sự kiện mỗi khi bạn cần nó; hoặc bạn có thể coi nó như một ảnh chụp nhanh mà bạn cập nhật.

Nếu tôi làm, tôi cần lưu các sự kiện cho trình quản lý quy trình.

Không - người quản lý quy trình là người quản lý . Nó không tự làm bất cứ điều gì hữu ích; thay vào đó, nó bảo các tập hợp thực hiện công việc (nghĩa là thay đổi sổ ghi chép).

Làm cách nào để biết giỏ sự kiện ProductReserved dành cho? Bạn có thể có một BasketId trên những điều đó không, hoặc đó là thông tin rò rỉ

Chắc chắn rồi. Lưu ý: trong hầu hết các tên miền mua sắm "thực", bạn sẽ không khăng khăng bảo lưu hàng tồn kho trước khi xử lý đơn đặt hàng; nó thêm sự tranh chấp không cần thiết cho doanh nghiệp. Nhiều khả năng doanh nghiệp của bạn muốn chấp nhận đơn đặt hàng, sau đó xin lỗi trong trường hợp hiếm hoi rằng đơn hàng không thể được thực hiện trong thời gian cần thiết.

Làm cách nào để giữ mối quan hệ giữa các sự kiện, làm cách nào để biết ItemAdded được tạo ra sự kiện ProductReserved nào?

Các thông báo có dữ liệu meta - cụ thể, bạn có thể bao gồm một trình xác định nhân quả (để bạn có thể xác định các lệnh được tạo ra sự kiện nào) và một trình tương quan hóa , để theo dõi cuộc hội thoại.

Ví dụ, trình quản lý quy trình viết id riêng của nó dưới dạng tương quanId trong lệnh; các sự kiện được tạo bởi một bản sao id tương quan của lệnh và trình quản lý quy trình của bạn đăng ký vào tất cả các sự kiện có tương quan riêng của nó.

Tôi có nên triển khai Rổ như một trình quản lý quy trình thay vì tổng hợp đơn giản không?

Đề nghị của tôi là không. Nhưng Udi Dahan có một ý kiến ​​khác mà bạn nên xem lại; đó là CQRS chỉ có ý nghĩa nếu tập hợp của bạn là sagas - Udi đã sử dụng saga ở nơi mà trình quản lý quy trình đã trở thành lỗi chính tả.

quản lý quá trình nên lấy tổng hợp?

Có thật không? Các nhà quản lý quy trình chủ yếu quan tâm đến việc phối hợp, không phải nhà nước miền. Một thể hiện của một quá trình sẽ có "trạng thái", dưới dạng lịch sử của tất cả các sự kiện mà họ đã quan sát - điều chính xác phải làm khi phản ứng với sự kiện Z phụ thuộc vào việc chúng ta có thấy các sự kiện X và Y hay không Vì vậy, bạn có thể cần có khả năng lưu trữ và tải một đại diện của trạng thái đó (có thể là một cái gì đó bằng phẳng, hoặc có thể là lịch sử của các sự kiện được quan sát).

(Tôi nói "không thực sự" bởi vì tổng hợp được định nghĩa mơ hồ đến mức không hoàn toàn sai khi cho rằng danh sách các sự kiện được quan sát "tổng hợp". Sự khác biệt có nhiều ngữ nghĩa hơn so với thực hiện - chúng tôi tải trạng thái quá trình và sau đó quyết định thông báo nào gửi đến các bộ phận của hệ thống chịu trách nhiệm về trạng thái miền . Có một chút vẫy tay đang diễn ra ở đây.)

Vì vậy, Thủ tướng không cần sử dụng một loại quản lý nhà nước so với loại khác vì nó chỉ chịu trách nhiệm thực hiện công cụ trực tiếp và không bao giờ trong các lần phát lại?

Không hoàn toàn - quản lý nhà nước không phải là một việc làm, đó là một người theo dõi thủ môn. Trong trường hợp trình quản lý quy trình không phát ra bất kỳ tín hiệu nào, bạn cung cấp cho nó các kết nối trơ với thế giới. Nói cách khác, dispatch(command)là một không-op.


1
Bạn nói: Bạn có thể xây dựng lại trình quản lý quy trình từ lịch sử các sự kiện mỗi khi bạn cần nó ... Nhưng để xây dựng lại nó, tôi cần lưu các sự kiện cho nó. Hay tôi nên xây dựng lại nó từ các sự kiện trong tập hợp? Phần tôi đang đấu tranh là: với các tập hợp, các sự kiện có id tổng hợp và thật dễ dàng để xây dựng lại bằng cách tìm tất cả các sự kiện với id tổng hợp đó. Nhưng làm thế nào tôi có thể làm điều đó cho người quản lý quy trình? Tôi có nên làm điều đó cho người quản lý quy trình? Hoặc người quản lý quy trình nên tìm kiếm các tổng hợp khi cần quyết định một cái gì đó dựa trên một sự kiện xảy ra?
Ivan Pintar

Điều tôi còn thiếu là khái niệm về mối quan hệ nhân quả và tương quan trong tìm nguồn cung ứng sự kiện. Khi tôi nhìn vào đó, câu trả lời của bạn cho câu hỏi thứ tư cuối cùng cũng có ý nghĩa.
Ivan Pintar

1
Tôi rất thích câu trả lời cho nhận xét đầu tiên của @IvanPintar; quản lý quá trình nên lấy tổng hợp? Họ có nên tự xây dựng dựa trên các sự kiện mà nó xử lý không? Trong trường hợp đó, bộ xử lý sự kiện sẽ cần phải có tác dụng phụ, phải không?
Jeff

@Jeff Trong một ví dụ mà tôi đã làm trình quản lý quy trình có bộ lưu trữ riêng được cập nhật với mỗi sự kiện được xử lý, một kiểu mô hình đọc. Điều này rất đơn giản để làm và thật dễ dàng để theo dõi những gì nó đã được xử lý. Trong một ví dụ khác, trình quản lý quy trình đã tạo và lưu trữ các sự kiện của riêng nó, được tạo ra từ các sự kiện tổng hợp. Tương tự như trên, nhưng nhà nước có nguồn gốc sự kiện. Tùy thuộc vào mức độ phức tạp của trạng thái mà trình quản lý quy trình giữ, có thể dễ dàng thực hiện cái này hay cái khác. Tôi tìm thấy cách tiếp cận đầu tiên đơn giản hơn.
Ivan Pintar

Thật thú vị, vì vậy, nó ít nhiều phụ thuộc vào nhà phát triển miễn là người quản lý quy trình phản hồi các sự kiện và gửi lệnh cuối cùng?
Jeff

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.