Bài đăng này được viết bởi Nelson Assis, Enterprise Support Lead, Support Lead, Serverless and Jevon Liburd, Technical Account Manager, Serverless.
Amazon S3 là một dịch vụ lưu trữ cấp đối tượng (Object) mà được nhiều khách hàng sử dụng để lưu trữ tập tin. Kết hợp với Amazon S3 Event Notifications hay Amazon EventBridge, có thể tạo ra các workload với kiểu kiến trúc hướng sự kiện (event-driven architecture– EDA). Kiến trúc này sẽ kích hoạt các sự kiện khi có sự thay đổi tới các đối tượng trong S3 buckets.
Kiến trúc EDA tạo ra sự giao tiếp bất đồng bộ giữa các thành phần trong hệ thống. Điều này giúp tách biệt các thành phần, giúp chúng có thể hoạt động một cách độc lập.
Nhưng trong một số tình huống có thể xuất mối liên kết giữa các thành phần trong kiến trúc là do sự phụ thuộc giữa các sự kiện. Bài blog này trình bày một ví dụ phổ biến về sự liên kết này và giải pháp xử lý thông qua việc sử dụng AWS Step Functions.
Tổng quan
Trong ví dụ này, một tổ chức có hai nhóm hoạt động độc lập là Sales và Warehouse. Mỗi nhóm chịu trách nhiệm tải dữ liệu hàng tháng lên S3 bucket để dữ liệu có thể được xử lý.
Những tập tin này sẽ tạo ra các sự kiện mỗi khi chúng được tải lên và sẽ kích hoạt các quy trình kế tiếp. Xử lý, làm sạch dữ liệu từ tập tin của Warehouse và kết hợp với dữ liệu từ nhóm Shipping. Xử lý dữ liệu từ tập tin Sales và kết hợp tương quan dữ liệu từ nhóm Warehouse và Shipping. Sẽ tạo ra cho các nhà phân tích các báo cáo tổng quan và thực hiện các dự báo.
Để có được sự tương quan dữ liệu giữa các nhóm, tập tin của Warehouse phải được xử lý trước tập tin của Sales. Vì là hai nhóm hoạt động độc lập, không có sự phối hợp giữa các nhóm. Các tập tin có thể được tải lên bất cứ lúc nào mà không đảm bảo rằng tập tin Warehouse đã được xử lý trước tập tin của Sales.
Đối với các tình huống như vậy, Aggregator pattern có thể được sử dụng. Pattern này thu thập và lưu trữ các sự kiện, sẽ kích hoạt một sự kiện mới dựa trên các sự kiện kết hợp. Trong tình huống trên các sự kiện kết hợp là tập tin Warehouse phải được xử lý và tập tin Sales đã được tải lên.
Các yêu cầu của Aggregator pattern là:
1. Tương quan (Correlation) – Cách để nhóm các sự kiện liên quan. Điều này được thực hiện thông qua một định danh duy nhất trong tên tập tin.
2. Tổng hợp sự kiện (Event aggreator) – Một nơi lưu trữ trạng thái cho các sự kiện
3. Kiểm tra và kích hoạt (Competion check and trigger) – Một điều kiện khi các sự kiện kết hợp đã được nhận và cách để công bố kết quả sự kiện.
Tổng quan kiến trúc
Kiến trúc sử dụng các dịch vụ AWS sau:
- Amazon DynamoDB để tổng hợp sự kiện
- Step Function để sắp xếp quy trình các công việc.
- AWS Lambda để phân tích tên tập tin và trích xuất định danh tương quan.
- AWS Serverless Application Model (AWS SAM) cho infrastructure as code (Xây dựng hạ tầng dưới dạng code) và triển khai.
1. Tải tập tin: Các nhóm Sales và Warehouse tải các tập tin tương ứng lên S3.
2. EventBridge: Sự kiện ObjectCreated được gửi đến EventBridge nơi có một quy tắc với một mục tiêu của quy trình làm việc chính.
3. Main state machine (Máy trạng thái chính): Bộ phận này điều phối các hoạt động, tổng hợp và xử lý các tập tin. Nó đóng gói các quy trình làm việc cho mỗi tập tin để tách biệt logic tổng hợp khỏi logic quy trình làm việc của các tập tin.
4. Phân tích cú pháp và tương quan của tập tin: Xác định các Logic kinh doanh, sử dụng hàm Lambda phân loại các tập tin.
5. Lưu trữ thông tin trạng thái: Một bảng DynamoDB lưu trữ thông tin về tập tin như tên, loại và trạng thái xử lý. The state machie được đọc và ghi vào bảng DynamoDB. Các token nhiệm vụ cũng được lưu trữ trong bảng này.
6. Xử lý tập tin: Tùy thuộc vào loại tập tin và các điều kiện tiên quyết, các state machine tương ứng với loại tập tin được chạy. Các state machine này chứa logic để xử lý tập tin cụ thể.
7. Token nhiệm vụ và gọi lại: Token nhiệm vụ được tạo ra khi tập tin phụ thuộc cố gắng được xử lý trước tập tin độc lập. Pattern “Wait for a Callback” của Step Functions tiếp tục thực thi tập tin phụ thuộc sau khi tập tin độc lập đã được xử lý.
Hướng dẫn
Bạn cần làm theo những bước chuẩn bị sau:
- Cài đặt AWS CLI và AWS SAM CLI
- Chuẩn bị một tài khỏa AWS
- Có đủ quyền để quản lý các tài nguyên AWS
- Cài đặt Git
Để triển khai ví dụ, theo dõi hướng dẫn trong GitHub repo.
Hướng dẫn này cho thấy điều gì sẽ xảy ra nếu tập tin phụ thuộc (tập tin Sales) được tải lên trước tập tin độc lập (tập tin Warehouse)
- Bắt đầu quá trình, tập tin Sales được tải lên trên Sales S3 bucket. Ví dụ sau sử dụng hai Bucket riêng biệt cho hai tập tin từ nhóm Sales và Warehouse vì hai nhóm này hoạt độc độc lập với nhau. Bạn có thể tìm thấy trong tập tin mẫu ở code repository ở Github repo.
- Tải tập tin lên S3 và gửi một sự kiện tới EventBridge. State machine sẽ tổng hợp hành động trên. Pattern sự kiện được sử dụng trong quy tắc EventBridge là:
| { “detail-type”: [“Object Created”], “source”: [“aws.s3”], “detail”: { “bucket”: { “name”: [“sales-mfu-eda-09092023”, “warehouse-mfu-eda-09092023”] }, “reason”: [“PutObject”] } } |
- State machine bắt đầu tổng hợp bằng cách gọi hàm Lambda mà dùng để phân tích tập tin. Hàm này phân tích loại tập tin và sử dụng các định danh để thiết lập sự tương quan giữa các tập tin. Trong ví dụ này, tên của tập tin chứa loại tập tin và định danh tương quan (năm_tháng). Sử dụng các cách khác nhau để thể hiện loại tập tin và định danh tương quan, bạn có thể sửa đổi hàm này để phân tích thông tin trong đó.
- Bước tiếp theo trong state là chèn một bản ghi cho sự kiện vào bảng DynamoDB tổng hợp sự kiện. Bảng có một khóa chính phức hợp với định danh tương quan là khóa phân vùng và loại tập tin là khóa sắp xếp. Trạng thái xử lý của tập tin được theo dõi để cung cấp phản hồi về trạng thái của quy trình làm việc.
- Dựa trên loại tập tin, state machine xác định nhánh nào để theo dõi. Trong ví dụ, nhánh Sales được chạy. State machine cố gắng lấy trạng thái của tập tin Warehouse (phụ thuộc) từ DynamoDB bằng cách sử dụng định danh tương quan. Sử dụng kết quả của truy vấn này, máy trạng thái xác định xem tập tin Warehouse tương ứng đã được xử lý chưa.
- Vì tập tin Warehouse chưa được xử lý, mẫu tích hợp waitForTaskToken được sử dụng. State machine chờ ở bước này và tạo một token nhiệm vụ, mà các dịch vụ bên ngoài sử dụng để kích hoạt State mahcine để tiếp tục thực thi. Bản ghi Sale trong bảng DynamoDB được cập nhật với Task Token.
- Truy cập vào bảng điều khiển S3 và tải lên tập tin Warehouse vào S3 bucket của Warehouse. Điều này kích hoạt một instnaces mới của quy trình Step Functions, qua các nhánh khác nhau sau bước lựa chọn loại tập tin. Trong nhánh này, Warehouse state machine được chạy và trạng thái xử lý của tập tin được cập nhật trong DynamoDB.
Khi trạng thái của tập tin Warehouse được thay đổi thành “Completed”, Warehouse machine kiểm tra DynamoDB để xem có tập tin Warehouse nào đang chờ xử lý không. Nếu có, nó truy xuất token nhiệm vụ và gọi phương thức SendTaskSuccess. Điều này kích hoạt máy Sale state machine, đang ở trạng thái chờ để tiếp tục. Sale state machine được khởi động và trạng thái xử lý được cập nhật.
Kết luận
Bài đăng blog này hướng dẫn cách xử lý các tập tin có tính chất phụ thuộc trong các kiến trúc hướng sự kiện. Bạn có thể tùy chỉnh mẫu được cung cấp trong kho lưu trữ mã nguồn cho trường hợp sử dụng của bạn.
Giải pháp này dành cho các tập tin có tính chất phụ thuộc trong kiến trúc hướng dự kiện. Để biết thêm thông tin về cách giải quyết các sự kiện mà có tính chất phụ thuộc, tổng hợp, hãy đọc bài đăng blog: “Moving to event-driven architectures with serverless event aggregators“.
Để tìm hiểu thêm về các kiến trúc hướng sự kiện, hãy truy cập event driven architecture section on Serverless Land.
——————————————————————————————————
Link bài viết gốc: Orchestrating dependent file uploads with AWS Step Functions