Giới thiệu tính năng lọc tin nhắn dựa trên payload cho Amazon SNS

Bài đăng này được viết bởi Prachi Sharma (Software Development Manager, Amazon SNS), Mithun Mallick (Principal Solutions Architect, AWS Integration Services), and Otavio Ferreira (Sr. Software Development Manager, Amazon SNS).

Amazon Simple Notification Service (SNS) là dịch vụ messaging  dành cho giao tiếp giữa Application-to-Application  (A2A) và Application-to-Person  (A2P). Chức năng A2A cung cấp thông lượng cao, push-based, nhắn tin nhiều-nhiều giữa các hệ thống phân tán, dịch vụ vi mô và các ứng dụng serverless theo hướng sự kiện. Các ứng dụng này bao gồm Amazon Simple Queue Service (SQS), Amazon Kinesis Data Firehose, AWS Lambda và điểm cuối HTTP/S. Chức năng A2P cho phép bạn liên lạc với khách hàng của mình qua tin nhắn văn bản trên thiết bị di động (SMS), thông báo đẩy trên thiết bị di động và thông báo qua email.

Hôm nay, chúng tôi sẽ giới thiệu tùy chọn lọc tin nhắn dựa trên payload của SNS, tùy chọn này tăng cường tùy chọn dựa trên thuộc tính hiện có, cho phép bạn giảm tải logic lọc bổ sung cho SNS và giảm hơn nữa chi phí tích hợp ứng dụng của mình. Để biết thêm thông tin, hãy xem Amazon SNS Message Filtering.

Tổng quan

Bạn sử dụng các chủ đề SNS để gửi tin nhắn từ hệ thống của pulisher đến hệ thống subscriber, giải quyết các nhu cầu tích hợp ứng dụng của bạn theo cách được kết hợp lỏng lẻo. Nếu không lọc tin nhắn, người đăng ký sẽ nhận được mọi tin nhắn được publish theo topic và yêu cầu logic tùy chỉnh để xác định xem tin nhắn đến cần được xử lý hay lọc ra. Điều này dẫn đến code không khác biệt cũng như chi phí cơ sở hạ tầng không cần thiết. Với tính năng lọc tin nhắn, subscribers sẽ đặt chính sách lọc cho đăng ký SNS của họ, mô tả các đặc điểm của tin nhắn mà họ quan tâm. Do đó, khi một tin nhắn được publish lên topic, SNS có thể xác minh tin nhắn đến theo chính sách lọc đăng ký và chỉ gửi tin nhắn đến subscribers khi phù hợp. Để biết thêm thông tin, hãy xem Amazon SNS Subscription Filter Policies.

Tuy nhiên, cho đến nay, các đặc điểm tin nhắn mà subscribers  có thể thể hiện trong chính sách lọc đăng ký vẫn bị giới hạn ở siêu dữ liệu trong thuộc tính tin nhắn. Kết quả là subscribers  không thể hưởng lợi từ việc lọc tin nhắn khi tin nhắn được publish mà không có thuộc tính. Ví dụ về các thông báo như vậy bao gồm các sự kiện AWS được publish lên SNS từ hơn 60 dịch vụ AWS khác, như Amazon Simple Storage Service (S3), Amazon CloudWatchAmazon CloudFront. Để biết thêm thông tin, hãy xem Amazon SNS Event Sources.

Tùy chọn lọc tin nhắn dựa trên payload mới trong SNS cho phép subscribers thể hiện chính sách lọc đăng ký SNS của họ về nội dung tin nhắn. Khả năng mới này còn cho phép bạn sử dụng tính năng lọc tin nhắn SNS cho cấu trúc hướng sự kiện (EDA) và khối lượng công việc trên nhiều tài khoản, đặc biệt khi subscription  không thể tác động đến một publisher nhất định để họ gửi các sự kiện bằng thuộc tính. Với tính năng lọc tin nhắn dựa trên payload, bạn có tùy chọn đơn giản, không cần mã để ngăn chặn hơn nữa việc dữ liệu không mong muốn được hệ thống thuê bao gửi đến và xử lý, từ đó đơn giản hóa mã của subscribers cũng như giảm chi phí liên quan đến cơ sở hạ tầng điện toán xuôi dòng. Tùy chọn lọc tin nhắn mới này có sẵn trên các chủ đề SNS Standard và SNS FIFO, dành cho tải trọng tin nhắn JSON.

Áp dụng lọc dựa trên payload trong trường hợp sử dụng

Hãy xem xét một công ty bảo hiểm chuyển nền tảng tạo khách hàng tiềm năng của họ sang kiến trúc không có máy chủ dựa trên microservices, áp dụng các mô hình tích hợp doanh nghiệp để giúp họ phát triển và mở rộng quy mô các microservices này một cách độc lập. Công ty cung cấp nhiều loại bảo hiểm khác nhau cho khách hàng, bao gồm bảo hiểm ô tô và nhà ở. Quy trình tạo và xử lý khách hàng tiềm năng cho từng loại bảo hiểm là khác nhau và đòi hỏi phải thông báo cho các microservices phụ trợ khác nhau, mỗi dịch vụ được thiết kế để xử lý một loại yêu cầu bảo hiểm cụ thể.

Công ty sử dụng nhiều ứng dụng giao diện người dùng để tương tác với khách hàng và nhận khách hàng tiềm năng từ họ, bao gồm ứng dụng web, ứng dụng dành cho thiết bị di động và ứng dụng trung tâm cuộc gọi. Các ứng dụng này gửi khách hàng tiềm năng do khách hàng tạo đến một microservice lưu trữ khách hàng tiềm năng nội bộ, sau đó tải khách hàng tiềm năng lên S3 bucket dưới dạng tài liệu XML. Tiếp theo, S3 bucket xuất bản các sự kiện lên chủ đề SNS để thông báo rằng tài liệu chính đã được tạo. Dựa trên nội dung của từng tài liệu chính, SNS topic sẽ phân chia quy trình làm việc bằng cách chuyển các đơn bảo hiểm ô tô đến SQS và bảo hiểm nhà dẫn đến một SQS khác. Các SQS này lần lượt được thăm dò bởi các microservice xử lý khách hàng tiềm năng của bảo hiểm ô tô và bảo hiểm nhà ở. Mỗi microservice xử lý sẽ áp dụng logic kinh doanh của mình để xác thực các khách hàng tiềm năng đến.

S3 event sau đây, ở định dạng JSON, đề cập đến một tài liệu chính được tải lên cùng với khóa auto-insurance-2314.xml vào S3. S3 tự động publish sự kiện này lên SNS, từ đó khớp payload S3 event với chính sách bộ lọc của từng đăng ký trong SNS topic. Nếu sự kiện phù hợp với chính sách lọc đăng ký, SNS sẽ gửi event đến SQS đã đăng ký. Nếu không, SNS sẽ lọc sự kiện ra.

{  “Records”: [{    “eventVersion”: “2.1”,    “eventSource”: “aws:s3”,    “awsRegion”: “sa-east-1”,    “eventTime”: “2022-11-21T03:41:29.743Z”,    “eventName”: “ObjectCreated:Put”,    “userIdentity”: {      “principalId”: “AWS:AROAJ7PQSU42LKEHOQNIC:demo-user”    },    “requestParameters”: {      “sourceIPAddress”: “177.72.241.11”    },    “responseElements”: {      “x-amz-request-id”: “SQCC55WT60XABW8CF”,      “x-amz-id-2”: “FRaO+XDBrXtx0VGU1eb5QaIXH26tlpynsgaoJrtGYAWYRhfVMtq/…dKZ4”    },    “s3”: {      “s3SchemaVersion”: “1.0”,      “configurationId”: “insurance-lead-created”,      “bucket”: {        “name”: “insurance-bucket-demo”,        “ownerIdentity”: {          “principalId”: “A1ATLOAF34GO2I”        },        “arn”: “arn:aws:s3:::insurance-bucket-demo”      },      “object”: {        “key”: “auto-insurance-2314.xml”,        “size”: 17,        “eTag”: “1530accf30cab891d759fa3bb8322211”,        “sequencer”: “00737AF379B2683D6C”      }    }  }]}

Để chỉ thể hiện sự quan tâm đến khách hàng tiềm năng về bảo hiểm ô tô, gói đăng ký SNS dành cho microservice xử lý khách hàng tiềm năng về bảo hiểm ô tô sẽ đặt chính sách lọc sau. Lưu ý rằng, không giống như các chính sách dựa trên thuộc tính, các chính sách dựa trên payload hỗ trợ việc lồng các thuộc tính.

{  “Records”: {    “s3”: {      “object”: {        “key”: [{          “prefix”: “auto-”        }]      }    },    “eventName”: [{      “prefix”: “ObjectCreated:”    }]  }}

Tương tự như vậy, để chỉ thể hiện sự quan tâm đến khách hàng tiềm năng về bảo hiểm nhà ở, đăng ký SNS cho microservice xử lý khách hàng tiềm năng về bảo hiểm nhà ở sẽ đặt chính sách lọc sau.

{  “Records”: {    “s3”: {      “object”: {        “key”: [{          “prefix”: “home-”        }]      }    },    “eventName”: [{      “prefix”: “ObjectCreated:”    }]  }}

Lưu ý rằng mỗi chính sách lọc sử dụng khả năng khớp tiền tố chuỗi của lọc tin nhắn SNS. Trong trường hợp sử dụng này, khả năng so khớp này cho phép chính sách lọc chỉ khớp với các đối tượng S3 có giá trị thuộc tính chính bắt đầu bằng loại bảo hiểm mà nó quan tâm (auto- hoặc home). Cũng xin lưu ý rằng mỗi chính sách bộ lọc chỉ khớp với các sự kiện S3 có giá trị thuộc tính eventName bắt đầu bằng ObjectCreated, trái ngược với ObjectRemoved. Để biết thêm thông tin, hãy xem Amazon S3 Event Notifications.

Triển khai các tài nguyên và chính sách lọc

Để triển khai tài nguyên AWS cho trường hợp sử dụng này, bạn cần có AWS account có quyền sử dụng SNS, SQS và S3. Trên môi trường dev, hãy cài đặt AWS SAM CLI. Bạn có thể tìm thấy SAM template hoàn chỉnh cho trường hợp sử dụng này trong aws-sns-samples trênGitHub.

SAM template có một tập hợp các định nghĩa tài nguyên, như được trình bày bên dưới. Định nghĩa tài nguyên đầu tiên tạo chủ đề SNS nhận các sự kiện từ S3.

InsuranceEventsTopic:    Type: AWS::SNS::Topic    Properties:      TopicName: insurance-events-topic

Định nghĩa tài nguyên tiếp theo sẽ tạo S3 bucket nơi lưu trữ tài liệu khách hàng tiềm năng bảo hiểm. S3 bucket này publish một sự kiện lên SNS topic bất cứ khi nào có tài liệu khách hàng tiềm năng mới được tạo.

InsuranceEventsBucket:    Type: AWS::S3::Bucket    DeletionPolicy: Retain    DependsOn: InsuranceEventsTopicPolicy    Properties:      BucketName: insurance-doc-events      NotificationConfiguration:        TopicConfigurations:          – Topic: !Ref InsuranceEventsTopic            Event: ‘s3:ObjectCreated:*’

Các định nghĩa tài nguyên tiếp theo tạo SQS để đăng ký SNS topic. Như được trình bày trong sơ đồ kiến trúc, có một hàng đợi dành cho khách hàng tiềm năng về bảo hiểm ô tô và một hàng đợi khác dành cho khách hàng tiềm năng về bảo hiểm nhà ở.

AutoInsuranceEventsQueue:    Type: AWS::SQS::Queue    Properties:      QueueName: auto-insurance-events-queue      HomeInsuranceEventsQueue:    Type: AWS::SQS::Queue    Properties:      QueueName: home-insurance-events-queue

Các định nghĩa tài nguyên tiếp theo tạo ra các đăng ký SNS và các chính sách lọc tương ứng của chúng. Lưu ý rằng, ngoài việc đặt thuộc tính FilterPolicy, bạn cần đặt thuộc tính FilterPolicyScope thành MessageBody để bật tùy chọn lọc thư dựa trên tải trọng mới cho mỗi đăng ký. Giá trị mặc định cho thuộc tính FilterPolicyScope là MessageAttributes.

AutoInsuranceEventsSubscription:    Type: AWS::SNS::Subscription    Properties:      Protocol: sqs      Endpoint: !GetAtt AutoInsuranceEventsQueue.Arn      TopicArn: !Ref InsuranceEventsTopic      FilterPolicyScope: MessageBody      FilterPolicy:        ‘{“Records”:{“s3”:{“object”:{“key”:[{“prefix”:”auto-“}]}}        ,”eventName”:[{“prefix”:”ObjectCreated:”}]}}’  HomeInsuranceEventsSubscription:    Type: AWS::SNS::Subscription    Properties:      Protocol: sqs      Endpoint: !GetAtt HomeInsuranceEventsQueue.Arn      TopicArn: !Ref InsuranceEventsTopic      FilterPolicyScope: MessageBody      FilterPolicy:        ‘{“Records”:{“s3”:{“object”:{“key”:[{“prefix”:”home-“}]}}        ,”eventName”:[{“prefix”:”ObjectCreated:”}]}}’

Sau khi bạn tải SAM template đầy đủ từ GitHub xuống, hãy chạy lệnh sau trong thiết bị của bạn để xây dựng các tạo phẩm triển khai.

sam build –t SNS-Payload-Based-Filtering-SAM.template

Sau khi SAM hoàn tất việc triển khai, hãy chạy lệnh sau để triển khai tài nguyên AWS và chính sách bộ lọc SNS. Lệnh này sẽ hướng dẫn bạn trong quá trình thiết lập các tùy chọn triển khai mà bạn có thể trả lời dựa trên yêu cầu của mình. Để biết thêm thông tin, hãy đọc SAM Developer Guide

sam deploy –guided

Khi SAM đã triển khai xong tài nguyên, bạn có thể bắt đầu thử nghiệm giải pháp trong  AWS Management Console.

Kiểm tra các chính sách lọc

Đi tới AWS CloudFormation console, chọn stack được tạo bởi SAM template, sau đó chọn tab Output. Lưu ý tên của nhóm S3 đã được tạo.

Bây giờ hãy chuyển sang S3 console và chọn bucket có tên tương ứng. Khi ở trên trang chi tiết bucket, hãy tải lên tệp thử nghiệm có tên bắt đầu bằng tiền tố auto-. Ví dụ: bạn có thể đặt tên cho tệp thử nghiệm của mình là auto-insurance-7156.xml Quá trình tải lên sẽ kích hoạt một S3 event, được nhập là ObjectCreated, sau đó được chuyển qua chủ đề SNS đến hàng đợi SQS lưu trữ các khách hàng tiềm năng về bảo hiểm ô tô.

Bây giờ, hãy chuyển sang SQS console và chọn nhận thông báo cho SQS lưu trữ khách hàng tiềm năng về bảo hiểm ô tô. Lưu ý rằng SQS dành cho khách hàng tiềm năng bảo hiểm nhà ở trống.

Nếu muốn kiểm tra chính sách bộ lọc đã định cấu hình, bạn có thể chuyển sang SNS console, chọn SNS topic được tạo bởi SAM template và chọn đăng ký SNS cho khách hàng tiềm năng về bảo hiểm ô tô. Khi ở trên trang chi tiết đăng ký, bạn có thể xem chính sách bộ lọc ở định dạng JSON, cùng với phạm vi chính sách bộ lọc được đặt thành “Message body”.

Bạn có thể lặp lại các bước kiểm tra ở trên, bây giờ với một tệp khác có tên bắt đầu bằng tiền tố home- và xem cách S3 event được chuyển qua chủ đề SNS đến SQS lưu trữ các khách hàng tiềm năng về bảo hiểm nhà ở

Giám sát hoạt động lọc

CloudWatch cung cấp khả năng hiển thị về hoạt động lọc tin nhắn SNS của bạn bằng các số liệu chuyên dụng, đồng thời cho phép bạn tạo cảnh báo. Bạn có thể sử dụng số liệu NumberOfNotifcationsFilteredOut-MessageBody để theo dõi số lượng tin nhắn được lọc ra do lọc dựa trên payload, trái ngược với lọc dựa trên thuộc tính. Để biết thêm thông tin, hãy xem Monitoring Amazon SNS topics using CloudWatch.

Hơn nữa, bạn có thể sử dụng số liệu NumberOfNotificationsFilteredOut-InvalidMessageBody để theo dõi số lượng tin nhắn bị lọc ra do có tải trọng JSON không đúng định dạng. Bạn có thể chuyển những thư có tải trọng JSON không đúng định dạng này sang hàng đợi thư chết (DLQ) nhằm mục đích khắc phục sự cố. Để biết thêm thông tin, hãy xem Designing Durable Serverless Applications with DLQ for Amazon SNS.

Dọn dẹp

Để xóa tất cả tài nguyên AWS mà bạn đã tạo trong trường hợp sử dụng này, hãy chạy lệnh sau từ thư mục root.

sam delete

Kết luận

Trong bài đăng trên blog này, chúng tôi giới thiệu cách sử dụng tính năng lọc tin nhắn dựa trên payload cho SNS, tính năng này cung cấp tính năng định tuyến sự kiện cho các tin nhắn có định dạng JSON. Điều này cho phép bạn viết chính sách lọc dựa trên nội dung của tin nhắn được publish lên SNS. Điều này cũng loại bỏ chi phí phân tích cú pháp thư khỏi hệ thống người đăng ký của bạn, cũng như mọi logic tùy chỉnh khỏi hệ thống nhà xuất bản của bạn để di chuyển các thuộc tính thư từ tải trọng sang tập hợp thuộc tính. Cuối cùng, tính năng lọc dựa trên tải trọng có thể hỗ trợ kiến trúc hướng sự kiện (EDA) của bạn bằng cách cho phép bạn lọc các sự kiện được publish lên SNS từ hơn 60 nguồn sự kiện AWS khác.

Để biết thêm thông tin, hãy xem Amazon SNS Message Filtering, Amazon SNS Event SourcesAmazon SNS Pricing. Để có thêm tài nguyên học tập về serverless, ghé thăm Serverless Land.

Leave a comment