bởi Benjamin Smith | ngày 27 tháng 11 năm 2023 | trong Amazon Simple Notification Service (SNS), Serverless | Permalink | Share
Bài đăng này được viết bởi Mohammed Atiq, Solutions Architect và Mithun Mallick, Principal Solutions Architect, Serverless
Amazon Simple Notification Service (SNS) cung cấp dịch vụ gửi và nhận thông điệp (messages) linh hoạt, được quản lý hoàn toàn bởi AWS, cho phép các ứng dụng có thể gửi và nhận thông điệp. SNS hoạt động như một kênh (channel), chuyển tiếp các sự kiện (event) từ bên phát hành (publisher) đến bên đăng ký (subscriber).
Hôm nay, AWS công bố một khả năng mới cho phép bạn lưu trữ (archive) và gửi lại (replay) các thông điệp đã được gửi lên chủ đề (topic) của SNS FIFO (First-In First-Out). Giờ đây, khi được chính sách lưu trữ được bật, các chủ đề SNS FIFO sẽ tự động:
- Lưu trữ sự kiện, thông điệp được lưu trữ tại chỗ, không cần mã (no-code) và không yêu cầu bất kỳ tài nguyên bên ngoài nào. Bạn chỉ cần xác định chính sách lưu trữ đối với chủ đề của mình, bao gồm khoảng thời gian lưu giữ bắt buộc (từ 1 đến 365 ngày).
- Gửi lại sự kiện: bên đăng ký được hưởng lợi từ chức năng gửi lại thông điệp được quản lý, không cần mã, với khả năng lọc tin nhắn và báo cáo tiến độ được tích hợp sẵn. Để bắt đầu gửi lại, bên đăng ký chỉ cần áp dụng chính sách gửi lại cho đăng ký của họ, xác định điểm bắt đầu và điểm kết thúc bằng cách sử dụng dấu thời gian (timestamps).
Tính năng này có thể hữu ích trong các kịch bản khôi phục sau lỗi và nhân bản trạng thái.
Khôi phục sau lỗi
Trong các tình huống kịch bản khôi phục sau lỗi, các lập trình viên có thể sử dụng tính năng này để xử lý lại một tập hợp con nhóm nhỏ các thông báo điệp và khôi phục từ ứng dụng xuôi dòng (downstream application) hoặc một vấn đề phụ thuộc.
Hãy xem xét tình huống trong đó ứng dụng tìm kiếm cần xử lý lại các thông báo điệp vì các chỉ mục (index) của công cụ tìm kiếm đã bị xóa. Để bắt đầu khôi phục, ứng dụng tìm kiếm sẽ cập nhật thuộc tính (attribute) ReplayPolicy trong đăng ký (subscription) hiện có của nó bằng cách gọi hành động API (API actions) SetSubscriptionAttribution để bắt đầu nhận thông điệp từ một thời điểm cụ thể, thay vì từ khi chính sách lưu trữ được áp dụng cho chủ đề.
Nhân bản trạng thái
Đối với kịch bản nhân bản trạng thái, tính năng này cho phép các ứng dụng mới sao chép trạng thái của các ứng dụng đã đăng ký trước đó.
Hãy xem xét một ứng dụng kho dữ liệu nội bộ phải sao chép trạng thái của ứng dụng tìm kiếm bên ngoài để làm cho dữ liệu được đánh chỉ mục trong công cụ tìm kiếm trở nên khả dụng cho những người quản lý sản phẩm và cho nhân viên nội bộ khác. Ứng dụng kho dữ liệu đăng ký một điểm cuối mới được tạo (ví dụ: hàng đợi FIFO của Amazon SQS) vào chủ đề bằng cách gọi hành động API Subscribe kèm thuộc tính ReplayPolicy .
Nếu chọn sao chép toàn bộ trạng thái của công cụ tìm kiếm, nó có thể đặt dấu thời gian trong thuộc tính ReplayPolicy trùng với ngày và giờ tạo ra đăng ký của công cụ tìm kiếm, đảm bảo tất cả dữ liệu từng được gửi đến công cụ tìm kiếm cũng được gửi đến công cụ kho dữ liệu .
Kích hoạt chính sách lưu trữ thông qua bảng điều khiển SNS (console)
Khi tạo chủ đề SNS FIFO mới, bạn sẽ thấy tùy chọn cho chính sách lưu trữ. Chính sách này xác định thời gian SNS lưu trữ thông điệp của bạn, giúp chúng luôn có sẵn để gửi lại cho bên đăng ký nếu cần. Chính sách lưu trữ không được kích hoạt theo mặc định – mà bạn phải kích hoạt chính sách này cho từng chủ đề theo cách thủ công hoặc tự động hóa thao tác.
Ví dụ, thời gian lưu giữ cho chủ đề FIFO này được đặt là 30 ngày. Tuy nhiên, bạn có thể điều chỉnh khoảng thời gian này từ 1 đến 365 ngày. Khi bạn kích hoạt chính sách lưu trữ, các tin nhắn gửi đến chủ đề này sẽ được lưu trữ trong khoảng thời gian đã xác định.
Để xác nhận rằng chính sách lưu trữ có hiệu lực sau khi tạo chủ đề, hãy kiểm tra chi tiết chủ đề. Bên cạnh chính sách lưu giữ và trạng thái của chính sách đó được hiển thị là Active.
Bằng cách đăng ký hàng đợi SQS FIFO (SQS FIFO Queue) vào một chủ đề SNS FIFO, bạn có thể gửi lại thông điệp và Trạng thái gửi lại (Reply status) tại bảng thông tin chi tiết đăng ký này sẽ hiển thị là Không chạy (Not running). Bạn có thể đăng ký hàng đợi SQS FIFO và cả hàng đợi SQS tiêu chuẩn cho các chủ đề SNS FIFO của mình, mang lại tính linh hoạt cho đa dạng các yêu cầu sử dụng. Để bắt đầu gửi lại, hãy truy cập đến giao diện bảng điều khiển SNS, chọn Replay rồi chọn Start Reply.
Khi bạn bắt đầu gửi lại, một cửa sổ sẽ xuất hiện, cho phép bạn chỉ định ngày bắt đầu và ngày kết thúc cũng như thời gian chính xác mà thông điệp được lưu trữ. Tính năng này mang lại sự linh hoạt để chỉ gửi lại các thông điệp mà bạn quan tâm, thay vì mọi thông điệp đã lưu trữ, bằng cách cho phép bạn thiết lập một khung thời gian cụ thể. Khi bạn chọn Start reply, dịch vụ sẽ bắt đầu gửi thông điệp đến bên đăng ký.
Bạn cũng có thể định nghĩa cấu hình cho tính năng lưu trữ và gửi lại SNS FIFO bằng cả AWS CloudFormation và AWS Serverless Application Model (AWS SAM).
Trường hợp sử dụng
Gửi lại các sự kiện để khôi phục sau lỗi trong microservices
Trong tình huống mà một ứng dụng bảo hiểm sử dụng kiến trúc microservices, hãy tưởng tượng một dịch vụ chuyên xử lý các yêu cầu đòi bồi thường bảo hiểm gặp phải một lỗi và mất một đơn đòi bảo hiểm. Sự thiếu sót như vậy có thể khiến cho công việc trở nên không đồng bộ.
Với tính năng lưu trữ và gửi lại, bạn có thể xem xét và gửi lại các sự kiện từ thời điểm lỗi được phát hiện. Điều này cho phép dịch vụ nhận biết sự kiện bị bỏ lỡ và hoàn thành các hành động cần thiết, đảm bảo hệ thống luôn được cập nhật và chính xác.
- Thông điệp được xuất bản lên chủ đề SNS FIFO từ một ứng dụng.
- Thông điệp được gửi đến hàng đợi SQS FIFO chứa thông tin chi tiết về yêu cầu sẽ được xử lý bởi một downstream microservice.
- Microservice không thể xử lý một loạt thông điệp do có gặp lỗi và loại bỏ tất cả thông điệp.
- Sau đó, người dùng bắt đầu gửi lại từ chủ đề SNS FIFO, chỉ định khung thời gian của thông điệp để gửi lại dựa trên thời điểm xảy ra lỗi.
- Microservice hiện có thể xử lý thành công các tin nhắn được gửi lại và lưu trữ dữ liệu vào bảng DynamoDB.
Cấu hình lưu trữ và gửi lại SNS FIFO để xử lý bảo hiểm ô tô
Quản lý yêu cầu đòi bồi thường bảo hiểm ô tô đòi hỏi sự phối hợp kịp thời. Hướng dẫn này cho thấy lợi ích kết hợp của SNS FIFO và SQS FIFO để xử lý các yêu cầu theo đúng trình tự.
Cả hai hàng đợi SQS FIFO và hàng đợi tiêu chuẩn SQS đều có thể được đăng ký vào chủ đề SNS FIFO, mang lại sự linh hoạt trong việc xử lý các yêu cầu đòi bồi thường. Chức năng lưu trữ và phát lại của SNS FIFO là tối quan trọng; sự gián đoạn trong các downstream microservice không ảnh hưởng đến tính toàn vẹn của yêu cầu nhờ vào khả năng gửi lại.
Hướng dẫn này hướng dẫn bạn triển khai một ví dụ về xử lý yêu cầu bảo hiểm ô tô bằng AWS CLI. Bạn tạo một chủ đề SNS FIFO để gửi yêu cầu đòi bồi thường và hai hàng đợi SQS FIFO. Hàng đợi đầu tiên dành cho việc xử lý chính các yêu cầu, trong khi hàng đợi thứ hai dành riêng cho việc gửi lại các thông điệp nhằm hỗ trợ sao chép trạng thái ứng dụng trên nhiều phiên bản hệ thống khác nhau.
Điều kiện tiên quyết
AWS Command Line Interface (AWS CLI): Bạn có thể tải xuống và thiết lập nó bằng tài liệu.
JQ: Để cài đặt, hãy làm theo hướng dẫn cài đặt.
Bước 1 – Tạo tài nguyên bằng AWS CLI và lưu trữ các biến
Chạy các lệnh sau trong terminal.
| # Định nghĩa khu vực AWS (Region) REGION=$(aws configure get region) # Tạo chủ đề SNS FIFO cho các yêu cầu đòi bồi thường AUTO_INSURANCE_TOPIC_ARN=$(aws sns create-topic –name “AutoInsuranceClaimsTopic.fifo” –attributes “FifoTopic=true,ContentBasedDeduplication=true,DisplayName=Auto Insurance Claims Topic” –region $REGION | jq -r ‘.TopicArn’) # Tạo hàng đợi SQS FIFO chính và gửi lại AUTO_INSURANCE_QUEUE_URL=$(aws sqs create-queue –queue-name “AutoInsuranceClaimsQueue.fifo” –attributes “FifoQueue=true” –region $REGION | jq -r ‘.QueueUrl’) AUTO_INSURANCE_REPLAY_QUEUE_URL=$(aws sqs create-queue –queue-name “AutoInsuranceReplayQueue.fifo” –attributes “FifoQueue=true” –region $REGION | jq -r ‘.QueueUrl’) # Lấy ARNs của cả hai hàng đợi AUTO_INSURANCE_QUEUE_ARN=$(aws sqs get-queue-attributes –queue-url $AUTO_INSURANCE_QUEUE_URL –attribute-names QueueArn –region $REGION | jq -r ‘.Attributes.QueueArn’) AUTO_INSURANCE_REPLAY_QUEUE_ARN=$(aws sqs get-queue-attributes –queue-url $AUTO_INSURANCE_REPLAY_QUEUE_URL –attribute-names QueueArn –region $REGION | jq -r ‘.Attributes.QueueArn’) # Định nghĩa các chính sách cho phép chủ đề phát hành thông điệp đến cả hai hàng đợi SQS_POLICY_TEMPLATE=”{\”Policy\” : \”{ \\\”Version\\\”: \\\”2012-10-17\\\”, \\\”Statement\\\”: [ { \\\”Sid\\\”: \\\”1\\\”, \\\”Effect\\\”: \\\”Allow\\\”, \\\”Principal\\\”: { \\\”Service\\\”: \\\”sns.amazonaws.com\\\” }, \\\”Action\\\”: [\\\”sqs:SendMessage\\\”], \\\”Resource\\\”: [\\\”$AUTO_INSURANCE_QUEUE_ARN\\\”, \\\”$AUTO_INSURANCE_REPLAY_QUEUE_ARN\\\”], \\\”Condition\\\”: { \\\”ArnLike\\\”: { \\\”aws:SourceArn\\\”: [\\\”$AUTO_INSURANCE_TOPIC_ARN\\\”] } } } ]}\”}” # Áp dụng chính sách truy cập vào hai hàng đợiaws sqs set-queue-attributes –queue-url $AUTO_INSURANCE_QUEUE_URL –attributes file://<(echo $SQS_POLICY_TEMPLATE) aws sqs set-queue-attributes –queue-url $AUTO_INSURANCE_REPLAY_QUEUE_URL –attributes file://<(echo $SQS_POLICY_TEMPLATE) # Đăng ký hàng đợi chính vào chủ đề SNS FIFO đã tạoaws sns subscribe –topic-arn $AUTO_INSURANCE_TOPIC_ARN –protocol sqs –notification-endpoint $AUTO_INSURANCE_QUEUE_ARN –region $REGION |
Bước 2 – Đặt chính sách lưu trữ cho chủ đề SNS FIFO
Sửa đổi các thuộc tính của chủ đề SNS FIFO để đặt khoảng thời gian lưu trữ. Điều này xác định thời gian thông điệp được lưu trữ trong kho lưu trữ chủ đề. Ví dụ này lưu trữ 30 ngày.
| # Đặt lưu trữ 30 ngày cho chủ đề SNS FIFO aws sns set-topic-attributes –region $REGION –topic-arn $AUTO_INSURANCE_TOPIC_ARN –attribute-name ArchivePolicy –attribute-value “{\”MessageRetentionPeriod\”:\”30\”}” |
Bước 3- Xuất bản chi tiết yêu cầu bảo hiểm ô tô
Xuất bản một yêu cầu mẫu về chủ đề SNS FIFO. Bước này mô phỏng một kịch bản trong thế giới thực trong đó yêu cầu bảo hiểm phải được xử lý bởi những người đăng ký chủ đề.
| # Lấy khung thời gian hiện tại và phát hành mẫu yêu cầu đòi bồi thường bảo hiểm TIMESTAMP_START=$(date -u +%FT%T.000Z) aws sns publish –region $REGION –topic-arn $AUTO_INSURANCE_TOPIC_ARN –message “{ \”claim_type\”: \”collision\”, \”registration\”: \”AB123CDE\” }” –message-group-id “group1” |
Bước 4 – Đọc chi tiết yêu cầu bồi thường bảo hiểm ô tô
Truy xuất chi tiết yêu cầu bảo hiểm từ hàng đợi SQS FIFO chính. Điều này mô phỏng quá trình đọc yêu cầu bảo hiểm để thực hiện hành động. Sau khi đọc tin nhắn, yêu cầu sẽ bị xóa khỏi hàng đợi để tránh phải xử lý lại.
| #Tìm nạp chi tiết các yêu cầu đòi bồi thường tự hàng đợi chính, sau đó xóa để tránh dư thừa MESSAGE=$(aws sqs receive-message –region $REGION –queue-url $AUTO_INSURANCE_QUEUE_URL –output json) MESSAGE_TEXT=$(echo “$MESSAGE” | jq -r ‘.Messages[0].Body’) MESSAGE_RECEIPT=$(echo “$MESSAGE” | jq -r ‘.Messages[0].ReceiptHandle’) aws sqs delete-message –region $REGION –queue-url $AUTO_INSURANCE_QUEUE_URL –receipt-handle $MESSAGE_RECEIPT echo “Received claim details: ${MESSAGE_TEXT}” |
Bước 5 – Đăng ký hàng đợi SQS phát lại cho chủ đề SNS FIFO
Để đảm bảo không có yêu cầu đòi bồi thường nào bị mất, hãy cấu hình chính sách gửi lại cho các bên đăng ký là hàng đợi SQS FIFO của bạn. Chính sách này đặt lịch gửi lại các thông điệp vào hàng đợi SQS FIFO. Tại đây, bạn đăng ký hàng đợi gửi lại với chính sách gửi lại và sau đó theo dõi trạng thái của hàng đợi gửi lại. Sau khi hoàn tất, hãy đọc chi tiết yêu cầu được gửi lại từ hàng đợi SQS FIFO thứ hai. Nếu ban đầu xảy ra bất kỳ vấn đề xử lý nào thì sẽ có cơ hội thứ hai để xử lý yêu cầu.
Đăng ký hàng đợi gửi lại vào chủ đề SNS FIFO:
| # Đăng ký hàng đợi gửi lại vào chủ đề và định nghĩa chính sách gửi lại NEW_SUBSCRIPTION_ARN=$(aws sns subscribe –region $REGION –topic-arn $AUTO_INSURANCE_TOPIC_ARN –protocol sqs –return-subscription-arn –notification-endpoint $AUTO_INSURANCE_REPLAY_QUEUE_ARN –attributes “{\”ReplayPolicy\”:\”{\\\”PointType\\\”:\\\”Timestamp\\\”,\\\”StartingPoint\\\”:\\\”$TIMESTAMP_START\\\”}\”}” –output json | jq -r ‘.SubscriptionArn’) |
Để theo dõi trạng thái phát lại:
| # Chờ quá trình gửi lại hoàn tấtwhile [[ $(aws sns get-subscription-attributes –region $REGION –subscription-arn $NEW_SUBSCRIPTION_ARN –output text | awk ‘END{print $9}’) != ‘Completed’ ]]; do printf “.”; sleep 5; done; echo “Replay complete”; |
Để đọc thông điệp được gửi lại và xóa thông điệp khỏi hàng đợi:
| # Tìm nạp thông điệp được gửi lại và xóa nó khỏi hàng đợiREPLAYED_MESSAGE=$(aws sqs receive-message –region $REGION –queue-url $AUTO_INSURANCE_REPLAY_QUEUE_URL –output json) REPLAYED_MESSAGE_TEXT=$(echo “$REPLAYED_MESSAGE” | jq -r ‘.Messages[0].Body’) REPLAYED_MESSAGE_RECEIPT=$(echo “$REPLAYED_MESSAGE” | jq -r ‘.Messages[0].ReceiptHandle’) aws sqs delete-message –region $REGION –queue-url $AUTO_INSURANCE_REPLAY_QUEUE_URL –receipt-handle $REPLAYED_MESSAGE_RECEIPT echo “Received replayed claim details: ${REPLAYED_MESSAGE_TEXT}” |
Dọn dẹp
Để tránh phát sinh những chi phí không cần thiết, hãy dọn sạch các tài nguyên được tạo trong hướng dẫn này:
| # Xóa hàng đợi SQS FIFO chính aws sqs delete-queue –queue-url $AUTO_INSURANCE_QUEUE_URL –region $REGION # Xóa hàng đợi SQS FIFO gửi lại aws sqs delete-queue –queue-url $AUTO_INSURANCE_REPLAY_QUEUE_URL –region $REGION # Bỏ đặt thuộc tính ‘ArchivePolicy’ aws sns set-topic-attributes –region $REGION –topic-arn $AUTO_INSURANCE_TOPIC_ARN –attribute-name ArchivePolicy –attribute-value “{}” # Xóa chủ đề SNS FIFO aws sns delete-topic –topic-arn $AUTO_INSURANCE_TOPIC_ARN –region $REGION |
Phần kết luận
Tính năng mới lưu trữ và gửi lại SNS FIFO cung cấp nền tảng vững chắc cho các ứng dụng dựa trên sự kiện, đặc biệt nhấn mạnh vào khả năng khôi phục sau lỗi và sao chép trạng thái ứng dụng. Những tính năng này cho phép các nhà phát triển quản lý và phục hồi một cách hiệu quả sau khi bị gián đoạn, đồng thời đảm bảo sao chép trạng thái trên các phiên bản hoặc môi trường ứng dụng khác nhau.
Bắt đầu sử dụng khả năng mới của SNS FIFO này bằng cách sử dụng AWS Management Console, AWS CLI, Bộ công cụ phát triển phần mềm AWS (SDK) hoặc AWS CloudFormation. Để biết thông tin về chi phí, hãy xem giá SNS và giá SQS.
Để biết thêm tài nguyên học tập dịch vụ phi máy chủ (serverless), hãy truy cập Serverless Land.
Link bài gốc: