Sự kiện miền
Sự kiện miền là gì
Phần tiêu đề “Sự kiện miền là gì”Sự kiện miền là cơ chế tách rời cho phép các tính năng giao tiếp mà không phụ thuộc trực tiếp vào nhau. Thay vì tính năng A gọi tính năng B, tính năng A phát một sự kiện và tính năng B đăng ký nhận sự kiện đó.
DomainEventBus là một bus publish/subscribe quảng bá trong cùng tiến trình.
Bên phát gọi publish(event); bên đăng ký tiêu thụ một luồng on<T>() có kiểu.
Mọi sự kiện đều triển khai DomainEvent và mang theo occurredAt.
Bus chạy bên trong cc_server. Mọi bên phát và mọi bên đăng ký đang hoạt
động đều nằm ở đó. Không máy khách nào nhìn thấy bus này. Thứ mà máy khách nhìn
thấy là một tập con được tuyển chọn mà máy chủ phát lại dưới dạng các khung
JSON-RPC notifications/*.
Vì sao cần một bus
Phần tiêu đề “Vì sao cần một bus”Không có sự kiện, mọi phản ứng giữa các tính năng đều là một lệnh import. Luồng thông báo sẽ phải import tính năng agent, tính năng pull request, phiếu công việc và cuộc họp chỉ để biết khi nào cần hiện thông báo — rồi mỗi tính năng trong số đó lại phải biết rằng thông báo tồn tại. Phiếu công việc sẽ import quy trình để một phiếu đã hoàn tất có thể đẩy một lượt chạy tiến lên. Đồ thị phụ thuộc khép lại thành một mớ rối, và hạt nhân dùng chung không còn được dùng chung nữa.
Phát một sự kiện phá vỡ điều đó. Luồng thông báo đăng ký hai mươi mốt lớp sự kiện và không import tính năng nào đã phát ra chúng. Bộ điều phối trình kích hoạt quy trình đăng ký toàn bộ bus và không biết gì về pull request, phiếu hay cuộc họp. Các tổng hợp của khả năng quan sát ghi nhận kết quả lượt chạy mà không cần can thiệp vào bộ điều phối.
Cái giá phải trả là cái giá quen thuộc: bên phát không thể biết liệu có ai đang
lắng nghe hay không, và một bên lắng nghe không bao giờ được khởi tạo sẽ lặng
lẽ nằm im. TicketRemoteSyncHandler là ví dụ điển hình: nó được khai báo, được
các bài kiểm thử bao phủ, và không bao giờ được nối vào môi trường thật.
Những gì bus không phải là
Phần tiêu đề “Những gì bus không phải là”Cần nói cho chính xác về một thứ mà bus không sở hữu.
Nhật ký kiểm toán không phải là một phép chiếu của dòng sự kiện. Mọi thao
tác RPC có thay đổi đều được kiểm toán mặc định — RepoOp.audited mặc định là
true và một thao tác chỉ từ chối kiểm toán khi khai báo audited: false, một
hành động có chủ đích hiển hiện ngay trên chính thao tác đó. Bộ điều phối ghi
thêm dòng “ai đã làm gì, từ đâu” ngay sau một lời gọi thành công. Không có
DomainEventAuditBridge. ActivityLogPersister ghi các dòng activity_log từ
các sự kiện ActivityLogged; đó là một luồng tách biệt với nhật ký kiểm toán
RPC.
Bus sự kiện là phương tiện truyền tải cho thông báo và cho tự động hóa. Nó không phải là hệ thống sổ sách chính thức.
Những gì bus thực sự điều khiển
Phần tiêu đề “Những gì bus thực sự điều khiển”- Thông báo. Hai mươi mốt lớp sự kiện được máy chủ biến thành các khung
truyền
notifications/*, được ghi vào một luồng bền vững theo từng không gian làm việc và được phát tới các phiên đang kết nối. Một khung cóworkspace_idchỉ tới một không gian làm việc mà người dùng của phiên không phải là thành viên sẽ bị loại bỏ trên máy chủ; sau đó máy khách lọc phần còn lại theo không gian làm việc mà nó đang xem. - Tự động hóa theo sự kiện. Trình kích hoạt quy trình đăng ký bus và tự động khởi chạy các quy trình khớp (xem bên dưới).
- Phản ứng vòng đời. Tạo một không gian làm việc sẽ khởi tạo các agent CEO và chuyên gia của nó, các mẫu quy trình tích hợp sẵn, và các bộ đánh giá khởi đầu. Một lượt chạy agent đã hoàn tất sẽ tiếp tục một bước quy trình đang tạm dừng, đóng một tác vụ, cấp dữ liệu cho giám sát mục tiêu, có thể đánh thức một trình kiểm tra được chỉ định, và có thể kích hoạt lại một trưởng nhóm. Một PR đã merge hoặc một space đã xóa sẽ kích hoạt việc thu gom rác cho worktree.
- Đồng bộ đa nhà cung cấp. Các thay đổi phiếu cục bộ được đẩy ra cho những nhà cung cấp đã cấu hình bởi một bộ điều phối lắng nghe năm sự kiện phiếu.
Các nhóm sự kiện
Phần tiêu đề “Các nhóm sự kiện”Sự kiện trải khắp toàn bộ bề mặt sản phẩm. Ở mức tổng quan:
- Không gian làm việc, agent và kho mã — tạo không gian làm việc, hoàn tất lượt chạy, đăng ký kho mã, cập nhật skill
- Pull request — đăng, thay đổi trạng thái, merge, yêu cầu đánh giá, nhắc tên, theo dõi PR do mình tạo, PR được phát hiện từ bên ngoài
- Nhắn tin — tin nhắn, space và tiến độ cấp phát space
- Phiếu — tạo, gán, gán lại, chi tiết, trạng thái và ba kết cục cuối cùng
- Tác vụ — các khung vòng đời được sắp thứ tự cho một lượt chạy đã điều phối, để máy khách có thể sắp xếp và loại trùng chúng
- Quy trình — chỉ các sự kiện lượt chạy cuối cùng (hoàn tất, bị hủy, thất bại)
- Khả năng quan sát — các mục nhật ký hoạt động và ngưỡng ngân sách
- Danh tính và tư cách thành viên — thêm, xóa thành viên, thay đổi vai trò
- Lịch và cuộc họp — hết hạn xác thực, cuộc họp bắt đầu và bản ghi kết thúc
- Rigs — tiếp quản, thu dọn và đóng bất ngờ
Bộ nhớ, điều phối, tài liệu kế hoạch, artifact, phê duyệt, tiếp nhận đồng bộ phiếu, làm mới lịch, merge worktree, tạo người dùng, lời mời và thu hồi thiết bị không phải là sự kiện miền; xem phần tham chiếu.
Để có danh mục đầy đủ — toàn bộ 53 lớp sự kiện cụ thể, phần dữ liệu tải của chúng và 24 bên đăng ký tiêu thụ chúng — xem Tham chiếu sự kiện miền. Trang đó là bản kiểm kê; trang này là mô hình.
Kiểm soát truy cập trực tiếp dựa trên hai cơ chế khác nhau
Phần tiêu đề “Kiểm soát truy cập trực tiếp dựa trên hai cơ chế khác nhau”Sự kiện về tư cách thành viên và về thiết bị trông có vẻ đối xứng nhưng không phải vậy, điều này quan trọng nếu bạn đang lý giải về tốc độ một lệnh thu hồi có hiệu lực.
Thu hồi một thiết bị thực sự chấm dứt các phiên của nó. Máy chủ theo dõi bảng thiết bị đã ghép nối và loại bỏ mọi phiên đang hoạt động mà thiết bị đã rời khỏi tập đang hoạt động, trong vòng vài giây.
Xóa một thành viên không đóng socket. WorkspaceMemberRemoved được tiêu
thụ: LocalRpcServer và RemoteRelayHost loại bỏ các đăng ký không gian làm
việc mà người dùng đó đã gắn vào, và RemoteEventForwarder vô hiệu hóa bộ nhớ
đệm tư cách thành viên để các khung tiếp theo cho không gian làm việc đó không
bị đẩy đi. Thứ từ chối RPC kế tiếp vẫn là cổng vai trò, vốn phân giải lại tư
cách thành viên trong mọi lời gọi — nên yêu cầu kế tiếp của họ bị từ chối
với “Not a member of this workspace”. Hiệu lực là tức thì với bất cứ điều gì họ
cố làm; chỉ là nó không đạt được bằng cách cúp kết nối của họ.
Trình kích hoạt quy trình
Phần tiêu đề “Trình kích hoạt quy trình”Trình kích hoạt quy trình đăng ký các sự kiện miền và tự động khởi chạy các quy
trình khớp. PipelineTriggerDispatcher lắng nghe toàn bộ bus, rồi:
- Cắt ngắn trừ khi loại sự kiện là loại nó biết cách ánh xạ tới một phần dữ liệu tải
- Tra cứu các trình kích hoạt đang bật khớp với loại sự kiện đó, trên mọi không gian làm việc
- Lọc từng trình theo không gian làm việc của chính nó và áp dụng bộ lọc khớp dữ liệu tải của nó
- Khởi chạy một lượt chạy cho mỗi trình kích hoạt còn trụ lại
Ràng buộc quan trọng là bước 1. Bus mang 53 loại sự kiện; trình chọn thêm kích
hoạt chỉ khởi chạy một lượt chạy cho mười bốn loại sau (các nhánh dữ liệu tải
của EventPayloadMapper):
ExternalPrDetected, PullRequestPublished, PullRequestStatusChanged,
PrMerged, MessageReceived, TicketAssigned,
TicketCompleted, TicketFailed, TicketCancelled,
BudgetThresholdCrossed, RepoAdded, MeetingRecordingStopped, SkillUpdated
và SpaceDeleted. Không gì khác có thể khởi chạy một quy trình.
Cách máy khách nhìn thấy những điều này
Phần tiêu đề “Cách máy khách nhìn thấy những điều này”RemoteEventForwarder dịch các sự kiện thuộc lớp thông báo thành các khung
truyền và đẩy chúng qua RPC tới các phiên đang kết nối, tại đó một bộ ánh xạ
khung biến chúng thành thông báo trong ứng dụng. Do đó một máy khách mỏng nhìn
thấy một phép chiếu của dòng sự kiện máy chủ mà không sở hữu bất kỳ phần thực
thi nào — đó chính là toàn bộ ý nghĩa của
tách máy khách mỏng.
Tuy nhiên, không phải mọi khung được đẩy đều là thông báo. Dòng vòng đời tác vụ và việc gán lại phiếu được chuyển tiếp trực tiếp để điều khiển giao diện, nhưng chúng không được ghi vào luồng thông báo và không hiện thông báo nổi.
Xem thêm
Phần tiêu đề “Xem thêm”- Quy trình và tự động hóa: trình kích hoạt khởi chạy điều gì
- Phiếu và ủy thác: gán cho một agent so với một nhóm
- Kiến trúc: sự kiện khớp với quy tắc phụ thuộc như thế nào
- Tham chiếu sự kiện miền: danh mục đầy đủ và các bên đăng ký của nó
- Thiết lập trình kích hoạt quy trình
- Cấu hình thông báo