Tôi tiếp tục quay trở lại QA này. Và tôi không tìm thấy câu trả lời đủ sắc thái, vì vậy tôi thêm câu trả lời này.
TL; DR. Có hay không, tùy thuộc vào việc sử dụng nguồn sự kiện của bạn.
Có hai loại hệ thống nguồn gốc sự kiện mà tôi biết.
Bộ xử lý sự kiện xuôi dòng = Có
Trong loại hệ thống này, các sự kiện xảy ra trong thế giới thực và được ghi lại dưới dạng sự kiện. Chẳng hạn như một hệ thống kho để theo dõi các pallet của sản phẩm. Về cơ bản không có sự kiện xung đột. Mọi thứ đã xảy ra, ngay cả khi nó sai. (Tức là pallet 123456 đặt trên xe tải A, nhưng đã được lên lịch cho xe tải B.) Sau đó, các sự kiện được kiểm tra ngoại lệ thông qua các cơ chế báo cáo. Kafka có vẻ rất phù hợp cho loại ứng dụng xử lý sự kiện này.
Trong bối cảnh này, có thể hiểu được tại sao mọi người Kafka lại ủng hộ nó như một giải pháp Tìm kiếm sự kiện. Bởi vì nó khá giống với cách nó đã được sử dụng, ví dụ, nhấp vào luồng. Tuy nhiên, những người sử dụng thuật ngữ Tìm nguồn sự kiện (trái ngược với Xử lý luồng) có thể đề cập đến việc sử dụng thứ hai ...
Nguồn sự thật do ứng dụng kiểm soát = Không
Loại ứng dụng này tuyên bố các sự kiện của chính nó là kết quả của các yêu cầu của người dùng thông qua logic kinh doanh. Kafka không hoạt động tốt trong trường hợp này vì hai lý do chính.
Thiếu sự cô lập thực thể
Kịch bản này cần khả năng tải luồng sự kiện cho một thực thể cụ thể. Lý do phổ biến cho việc này là để xây dựng một mô hình ghi tạm thời cho logic nghiệp vụ để sử dụng để xử lý yêu cầu. Làm điều này là không thực tế trong Kafka. Sử dụng chủ đề cho mỗi thực thể có thể cho phép điều này, ngoại trừ đây là một người không bắt đầu khi có thể có hàng ngàn hoặc hàng triệu thực thể. Điều này là do giới hạn kỹ thuật trong Kafka / Zookeeper.
Một trong những lý do chính để sử dụng mô hình ghi tạm thời theo cách này là để làm cho các thay đổi logic kinh doanh rẻ và dễ triển khai.
Thay vào đó, nên sử dụng chủ đề cho mỗi loại cho Kafka, nhưng điều này sẽ yêu cầu tải các sự kiện cho mọi thực thể của loại đó chỉ để nhận các sự kiện cho một thực thể. Vì bạn không thể biết vị trí đăng nhập của sự kiện nào thuộc về thực thể nào. Ngay cả khi sử dụng Snapshots để bắt đầu từ một vị trí nhật ký đã biết, đây có thể là một số lượng đáng kể các sự kiện để lướt qua.
Thiếu phát hiện xung đột
Thứ hai, người dùng có thể tạo điều kiện cuộc đua do các yêu cầu đồng thời chống lại cùng một thực thể. Có thể khá là không mong muốn để lưu các sự kiện xung đột và giải quyết chúng sau thực tế. Vì vậy, điều quan trọng là có thể ngăn chặn các sự kiện xung đột. Để mở rộng yêu cầu tải, người ta thường sử dụng các dịch vụ không trạng thái trong khi ngăn xung đột ghi bằng cách sử dụng ghi có điều kiện (chỉ ghi nếu sự kiện thực thể cuối cùng là #x). Aka lạc quan đồng thời. Kafka không hỗ trợ đồng thời lạc quan. Ngay cả khi nó hỗ trợ nó ở cấp chủ đề, nó sẽ cần phải giảm xuống mức thực thể để có hiệu quả. Để sử dụng Kafka và ngăn chặn các sự kiện xung đột, bạn sẽ cần sử dụng một nhà văn có trạng thái, tuần tự ở cấp ứng dụng. Đây là một yêu cầu / hạn chế kiến trúc quan trọng.
Thêm thông tin
Cập nhật mỗi bình luận
Nhận xét đã bị xóa, nhưng câu hỏi đại loại như: mọi người sử dụng gì để lưu trữ sự kiện sau đó?
Dường như hầu hết mọi người cuộn triển khai lưu trữ sự kiện của riêng họ trên cơ sở dữ liệu hiện có. Đối với các kịch bản không được phân phối, như các sản phẩm phụ trợ nội bộ hoặc các sản phẩm độc lập, nó được ghi chép đầy đủ về cách tạo một cửa hàng sự kiện dựa trên SQL. Và có những thư viện có sẵn trên đầu một loại cơ sở dữ liệu. Ngoài ra còn có EventStore , được xây dựng cho mục đích này.
Trong các kịch bản phân tán, tôi đã thấy một vài triển khai khác nhau. Dự án Panther của Jet sử dụng Azure CosmosDB , với tính năng Change Feed để thông báo cho người nghe. Một triển khai tương tự khác mà tôi đã nghe nói về AWS là sử dụng DynamoDB với tính năng Luồng để thông báo cho người nghe. Khóa phân vùng có thể phải là id luồng để phân phối dữ liệu tốt nhất (để giảm lượng cung cấp quá mức). Tuy nhiên, một phát lại đầy đủ trên các luồng trong Dynamo là tốn kém (đọc và chi phí khôn ngoan). Vì vậy, điều này cũng đã được thiết lập cho Luồng động để chuyển các sự kiện sang S3. Khi một người nghe mới xuất hiện trực tuyến hoặc một người nghe hiện tại muốn phát lại đầy đủ, nó sẽ đọc S3 để bắt kịp trước.
Dự án hiện tại của tôi là một kịch bản nhiều người thuê, và tôi đã tự mình lăn lộn trên Postgres. Một cái gì đó như Citus có vẻ thích hợp cho khả năng mở rộng, phân vùng theo dòng + xúc tu.
Kafka vẫn rất hữu ích trong các kịch bản phân tán. Đây là một vấn đề không hề nhỏ khi đưa các sự kiện của mỗi dịch vụ sang các dịch vụ khác. Một cửa hàng sự kiện thường không được xây dựng cho điều đó, nhưng đó chính xác là những gì Kafka làm tốt. Mỗi dịch vụ có nguồn sự thật bên trong riêng (có thể là lưu trữ sự kiện hoặc theo cách khác), nhưng lắng nghe Kafka để biết những gì đang xảy ra "bên ngoài". Dịch vụ cũng có thể đăng các sự kiện lên Kafka để thông báo cho "bên ngoài" những điều thú vị mà dịch vụ đã làm.