Bài đăng này được viết bởi Tim Bruce, Kiến trúc sư giải pháp cấp cao tại DevAx.
Các thành phần xuất sự kiện (event producers) là một trong ba thành phần chính trong Kiến trúc hướng sự kiện.Các thành phần xuất sự kiện tạo và xuất bản các sự kiện tới bộ định tuyến sự kiện để gửi chúng đến thành phần sử dụng sự kiện (event consumers). Bất kỳ phần nào của hệ thống, bao gồm cả ứng dụng trên thiết bị di động hoặc web, đều có thể là thành phần xuất sự kiện.
Để mở rộng mô hình sự kiện cho ứng dụng khách trên thiết bị di động và web, bạn phải triển khai các tiêu chuẩn về bảo mật, định dạng tin nhắn và kho lưu trữ sự kiện.
Bài đăng này sẽ chỉ ra cách xây dựng giải pháp xử lý sự kiện hỗ trợ khách hàng. Giải pháp sử dụng các dịch vụ Amazon EventBridge, Amazon API Gateway, AWS Lambda và Amazon Cognito. Kiến trúc này hỗ trợ định tuyến các sự kiện của máy khách tới các đích đến ở bên trong và bên ngoài. Nó sẽ cung cấp một bản phác thảo mà bạn có thể sử dụng nhằm đơn giản hóa việc tích hợp.
Tổng quan
Ví dụ này tạo RESTful API bằng API Gateway. Nó gửi sự kiện trực tiếp đến EventBridge mà không cần thông qua các dịch vụ điện toán. Trong môi trường sản phẩm, bạn sẽ yêu cầu nhiều hơn là chỉ đơn thuần nhận và chuyển tiếp các sự kiện. Các yêu cầu bổ sung bao gồm bảo mật, nhận dạng người dùng, xác thực, làm phong phú (enrichment), chuyển đổi, chuyển tiếp dữ liệu sự kiện và lưu trữ.
Trong ví dụ này, API Gateway cung cấp bảo mật và nhận dạng người dùng bằng cách gọi một hàm Lambda authorizer. Hàm này sẽ tạo ra một policy và trả về thông tin nhận dạng ứng dụng khách cho API Gateway. Sau đó, API Gateway sẽ thực hiện xác thực yêu cầu và làm phong phú thông báo trước khi chuyển tiếp sự kiện đến EventBridge.
EventBridge đánh giá các sự kiện dựa theo các quy tắc và chuyển tiếp chúng tới các đích đến. Các quy tắc sẽ được áp dụng để chuyển đổi các sự kiện và chuyển tiếp một sự kiện tới tối đa năm mục tiêu. Các đích đến bao gồm các dịch vụ AWS, chẳng hạn như Amazon Kinesis Data Firehose và các giải pháp của bên thứ ba, như Zendesk, thông qua các HTTPS endpoints.
Cuối cùng, Kinesis Data Firehose cung cấp giải pháp tiết kiệm chi phí để lưu trữ các sự kiện vào Amazon S3. Trước khi lưu trữ các sự kiện, Kinesis Data Firehose chuyển đổi các bản ghi thông qua Lambda transformers. Nó cũng phân vùng các bản ghi bằng cách sử dụng dữ liệu trong bản ghi hoặc dữ liệu được tính toán thông qua Lambda. Kinesis Data Firehose sử dụng dữ liệu phân vùng này để tạo các khóa trong bucket và lưu trữ các bản ghi trùng khớp với khóa.
Kiến trúc mẫu
Ví dụ này gồm các tài nguyên được định nghĩa trong AWS SAM template như sau:
- Một API Gateway để nhận tin nhắn.
- Một Lambda authorizer để xác thực các yêu cầu.
- Một EventBridge event bus để nhận sự kiện.
- Một quy tắc trong EventBridge để chuyển tiếp tất cả sự kiện tới Kinesis Data Firehose.
- Một quy tắc trong EventBridge để chuyển tiếp các sự kiện cụ thể tới Zendesk.
- Một đích đến của API EventBridge để kết nối với Zendesk của bạn.
- Kinesis Data Firehose để chuyển đổi, phân vùng và lưu trữ các sự kiện trong S3 bucket.
- Một hàm Lambda chuyển đổi dữ liệu của Kinesis Data Firehose
- Một S3 bucket để lưu trữ dữ liệu sự kiện.
Luồng dữ liệu
- Ứng dụng phía client thu thập hoặc tạo ra các sự kiện.
- Client gửi sự kiện tới API Gateway dưới dạng JSON được mã hóa. Client bao gồm JWT của người dùng trong authorization header của request kèm theo yêu cầu xác thực.
- Lambda authorizer xác thực JWT bằng Amazon Cognito và trả về giá trị clientID độc nhất của người dùng cho API Gateway.
- API Gateway chuyển yêu cầu thành các sự kiện, gắn thêm clientId, tên bus và môi trường.
- API Gateway gửi sự kiện đến EventBridge.
- Các quy tác (rules) của EventBridge khớp các sự kiện và:
- Chuyển tiếp tất cả sự kiện của client tới Kinesis Data Firehose.
- Chuyển tiếp các sự kiện của client với trường thông tin detail.eventType của “loyaltypurchase” tới Zendesk.
- Kinesis Data Firehose nhận bản ghi.
- Quá trình chuyển đổi dữ liệu trong Kinesis Data Firehose sẽ xử lý từng bản ghi, di chuyển client ID đến đối tượng chi tiết.
- Kinesis Data Firehose phân vùng các bản ghi và lưu trữ chúng trong S3 bucket.
Thiết kế tổng quan
Các phần sau đây sẽ thảo luận chi tiết về giải pháp, bắt đầu từ sự kiện trên ứng dụng client trên web hoặc thiết bị di động. Giải pháp này yêu cầu phía client tạo HTTPS request, bao gồm JWT của người dùng trong authorization header.
| {“entries”: [{“entry”: “{\”eventType\”: \”searching\”, \”schemaVersion\”:1, \”data\”: {\”searchTerm\”:\”games\”}}”}]} |
Mẫu JSON của request body của giải pháp này. Item “entries” ở cấp cao nhất là một mảng các mục “entries”. API Gateway sẽ dịch từng “entries” sang trường chi tiết sự kiện trong các sự kiện EventBridge.
API Gateway and Lambda authorizer
API Gateway nhận được yêu cầu và xác thực JWT bằng cách gọi Lambda authorizer. Authorizer sau đó tạo chính sách cho phép yêu cầu token hợp lệ bằng cách bổ sung thuộc tính tùy chỉnh “custom:clientId” của Amazon Cognito vào ngữ cảnh trong response trước khi trả lại phản hồi cho API Gateway. Thuộc tính “custom:clientId” đóng vai trò là mã định danh client duy nhất ở dạng UUID mà các hệ thống bên dưới có thể sử dụng để truy xuất dữ liệu của client.
API Gateway xác thực yêu cầu bằng cách khớp nội dung trong yêu cầu với một mô hình. Các mô hình đại diện cho việc một yêu cầu sẽ trông như thế nào. Sau đó, mẫu ánh xạ sẽ chuyển đổi các yêu cầu hợp lệ sang định dạng mà EventBridge yêu cầu. Các mẫu ánh xạ sử dụng velocity templating language (VTL) để thực hiện việc này.
Mẫu ánh xạ này sử dụng vòng lặp #foreach để xử lý các mục “entries” trong mảng từ request body. Quá trình này làm phong phú thêm từng sự kiện bằng các biến giai đoạn và “custom:clientId” của người dùng cho tên bus và biến môi trường từ API Gateway.
Việc tích hợp API Gateway trước đây cho phép API Gateway gửi các sự kiện đến EventBridge mà không cần sử dụng các dịch vụ điện toán, chẳng hạn như Lambda hoặc Amazon EC2. Quá trình tích hợp và quyền thực thi cấp bởi IAM cho phép API Gateway gọi API EventBridge PutEvents để thực hiện việc này.
Bộ quy tắc và quá trình chuyển đổi trong EventBridge
Các quy tắc của EventBridge khớp các sự kiện với các tiêu chí, sau đó chuyển đổi sự kiện và chuyển tiếp chúng tới các đích đến. Có hai quy tắc trong ví dụ này. Một là xử lý các sự kiện cho các tickets của Zendesk và quy tắc còn lại là chuyển tiếp dữ liệu đến Kinesis Data Firehose để lưu trữ nhằm phân loại và phân tích.
Ví dụ này tạo ticket dịch vụ trong hệ thống xử lý ticket của Zendesk. Các ticket kích hoạt các agent nhằm liên hệ với những khách hàng đang đợi một cuộc gọi để hoàn tất giao dịch mua hàng của họ. Phần mềm phía client, bằng cách gửi sự kiện trực tiếp, đã giảm thời gian thực hiện hành động cho các quy trình hỗ trợ và giúp cải thiện sự hài lòng của khách hàng.
Quy tắc này khớp với các thông báo sự kiện của khách hàng thân thiết và chuyển tiếp thông tin chi tiết tới API của Zendesk. Quy tắc bao gồm một phép chuyển đổi, trong đó chọn một phần trong trường thông tin của sự kiện trước khi gửi tới đích đến.
EventBridge sử dụng các API đích để lưu trữ thông tin chi tiết về chính sách sử dụng (usage policies) và HTTP endpoint. Ngoài ra, còn có EventBridge connection và thông tin chi tiết về secret store của AWS Secrets Manager. Chúng bao gồm chính sách xác thực và thông tin xác thực để kết nối với API đích.
Xử lý thành công các sự kiện mở ticket trong Zendesk bằng API đích. Agents lúc này đã có danh sách khách hàng để liên hệ.
Các doanh nghiệp thường yêu cầu lưu trữ các sự kiện để xử lý sự cố hoặc phân tích. EventBridge không thêm dòng trống giữa để tách các bản ghi khi chuyển tiếp sự kiện tới Kinesis Data Firehose. Do đó, việc phân biệt từng bản ghi khi phân tích dữ liệu có thể sẽ gặp khó khăn.
Một quy tắc cho tất cả các sự kiện từ client sẽ thay đổi hành vi này. Đoạn mã AWS CloudFormation này xác định quy tắc sẽ biến đổi từng sự kiện bằng cách thêm một dòng mới sau mỗi sự kiện. Ký tự “\n” trong trường InputTemplate thêm dấu phân cách giữa các bản ghi trước khi chuyển tiếp dữ liệu tới Kinesis Data Firehose.
Sau đó, Kinesis Data Firehose nhận từng bản ghi được phân tách bằng một dòng mới, cho phép phân loại và phân tích mà không cần tốn thêm chi phí.
Từ Kinesis Data Firehose đến S3
Kinesis Data Firehose là một cách tiết kiệm chi phí để phân nhóm và ghi các bản ghi vào S3. Nó cung cấp khả năng chuyển đổi dữ liệu theo tùy chọn bằng cách gọi hàm Lambda. Ví dụ này sử dụng hàm Lambda để di chuyển trường “clientID” đến phần chi tiết của bản ghi sự kiện.
Kinesis Data Firehose cũng hỗ trợ phân vùng động các bản ghi khi ghi vào S3. Nó chọn dữ liệu từ các bản ghi hoặc dữ liệu được xử lý bằng hàm Lambda. Trong ví dụ này, nó chọn dữ liệu từ các bản ghi để lưu trữ dữ liệu trong các thư mục riêng biệt trong S3.
Các cân nhắc về tính bền vững của sự kiện
Bạn có thể mở rộng giải pháp này bằng cách sử dụng một EventBridge archive và Amazon Kinesis Data Streams. Việc lưu trữ (archiving) cho phép bạn tạo một archive được mã hóa các sự kiện tương ứng. Bạn có thể cấu hình thời gian hiệu lực khi lưu giữ dữ liệu theo ngày, từ một ngày đến không giới hạn. Bạn có thể gửi lại (replay) lại các sự kiện từ archive của mình khi phải xử lý lại dữ liệu.
Kinesis Data Streams là giải pháp truyền dữ liệu theo mô hình không máy chủ. Một quy tắc trong EventBridge cho tất cả các bản ghi là có thể chuyển tiếp dữ liệu tới Kinesis Data Streams thay vì Kinesis Data Firehose. Nhiều ứng dụng có thể lấy dữ liệu từ Kinesis Data Streams. Kinesis Data Firehose sẽ lấy dữ liệu từ luồng này và lưu trữ nó trong S3.
Yêu cầu tiên quyết
Bạn cần đạt được các điều kiện tiên quyết sau để triển khai giải pháp này:
- AWS account
- AWS CLI
- AWS Serverless Application Model (AWS SAM) CLI
- Python 3.9
- Một AWS Identity and Access Management (IAM) role với những quyền truy cập cần thiết
- Một tài khaonr thử nghiệm của Zendesk
- Một Zendesk API key
Cài đặt và triển khai
Mã nguồn đầy đủ của giải pháp có thể tìm thấy ở GitHub repo và được triển khai bằng AWS SAM.
- Tạo một secret trong Secrets Manager bằng AWS CLI:
| aws secretsmanager create-secret –name proto/Zendesk –secret-string ‘{“username”:”<YOUR EMAIL>”,”apiKey”:”<YOUR APIKEY>”} |
- Clone mã nguồn từ git:
- Xây dựng một dự án AWS SAM
| sam build –use-container |
- Triển khai dự án thông qua AWS SAM
| sam deploy –guided –capabilities CAPABILITY_NAMED_IAM |
- Từ kết quả đầu ra của việc triển khai, khai báo các biến sau trên shell
| APPCLIENTID=<output APPCLIENTID>APIID=<output APIID>REGION=<region you deployed to> |
- Tạo một user trong Amazon Cognito thông qua AWS CLI
| aws cognito-idp sign-up –client-id $APPCLIENTID –username <YOUR USER ID> –password <YOUR PASSWORD> –user-attributes Name=email,Value=<YOUR EMAIL> |
- Sau khi nhận mã xác nhận, hoàn thành việc xác nhận user thông qua CLI
| aws cognito-idp confirm-sign-up –client-id $APPCLIENTID –username <userid> –confirmation-code <confirmation code> |
- Thử nghiệm đăng nhập với người dùng vừa tạo qua CLI
| aws cognito-idp initiate-auth –auth-flow USER_PASSWORD_AUTH –client-id $APPCLIENTID –auth-parameters USERNAME=<YOUR USER ID>,PASSWORD=<YOUR PASSWORD> |
Nếu thành công, ta sẽ nhận một JWT
Thử nghiệm giải pháp
- Đoạn mã mẫu chứa một trình tạo sự kiện trong thư mục util. Trình tạo sự kiên sử dụng thông tin xác thực của bạn và mô phỏng các sự kiện từ phần mềm phía client của người dùng. Truy cập vào thư mục utils, chạy trình tạo:
| python3 generator.py–minutes <minutes to run generator> –batch <batch size from 1-10>–errors <True|False> –userid <YOUR USER ID> –password <YOURPASSWORD> –region $REGION –appclientid $APPCLIENTID –apiid $APIID |
- Đăng nhập vào Zendesk console và xem tickets đã tạo.
- Sau 5 phút, kiểm tra “clientevents” bucket để xem các bản ghi sự kiện
Dọn dẹp
Để gỡ bỏ ví dụ mẫu này
- Xoá dữ liệu được lưu trong “clientevents” bucket tạo ra trước đó.
- Xoá stack bằng câu lệnh sau:
| sam delete –stack-name clientevents |
- Xoá secret bằng câu lệnh sau:
| aws secretsmanager delete-secret –secret-id <arn of secret> |
Kết luận
Bài đăng này đã hướng dẫn cách gửi sự kiện của client tới API và EventBridge để đem lại trải nghiệm mới cho khách hàng. Ví dụ này đề cập đến việc hỗ trợ trải nghiệm mới bằng cách để phần mềm phía client gửi sự kiện với số lượng đoạn mã tối thiểu. Bản phác thảo chi tiết này cho bạn thấy cách có thể đưa các sự kiện của phía client vào giải pháp của mình, bao gồm xác thực, bổ sung, chuyển đổi và lưu trữ.
Bạn có thể sửa đổi các đoạn mã được cung cấp ở đây để sử dụng trong tổ chức của mình. Điều này cho phép phần mềm phía client của bạn đăng ký các sự kiện mà không cần sửa đổi backend.