Aws SQS là gì

Bài viết sẽ chỉ cho bạn cách xử lý một khối lượng lớn công việc không đồng bộ bằng kiến trúc Serverless. Các trường hợp ứng dụng có thể là: Gửi email với số lượng lớn, xử lý video sau khi được tải lên, hoặc phân tích hành vi người dùng…

Chúng ta sử dụng SQS như một hàng chờ, hàng chờ này sẽ được dùng để tách rời các service trong mô hình microservice của bạn. Bạn sẽ thấy được cách tôi triển khi mô hình microservice sử dụng Lambda Function.

Giới thiệu SQS

Cách tốt nhất để xây dựng một hệ thống có khả năng mở rộng và tối ưu hiệu suất trên hạ tầng của AWS là tách rời các dịch vụ thành mô hình microservice, từ đó ta có thể áp dụng các tùy chọn sau [hoặc cả 2]:

  • ELB [Elastic Load Balancing] cho việc xử lý đồng bộ các yêu cầu: Các ứng dụng web sẽ xử lý và trả lời các yêu cầu https được gửi từ trình duyệt, client.
  • SQS queue để xử lý các công việc không đồng bộ: gửi số lượng lớn email, xử lý video sau khi tải lên hoặc phân tích hành vi của người dùng.

Amazon Simple Queue Service [SQS]  là một dịch vụ hàng đợi, lưu trữ và quản lý thông điệp. SQS cung cấp dịch vụ hàng đợi lưu trữ thông tin phân tán có khả năng chịu lỗi và mở rộng: Đơn giản để sử dụng nhưng rất mạnh mẽ.

Hình ảnh dưới đây cho thấy một kiến trúc điển hình có sử dụng SQS. Một [hoặc nhiều] dịch vụ [Producer] gửi các tác vụ [hay gọi là bản tin] tới hàng đợi SQS. Một [hoặc nhiều] dịch vụ[Consumer] khác sẽ đọc các bản tin này để xử lý các yêu cầu cụ thể theo bài toán thực tế.

Push-Pull: Amazon SQS – //fbrnc.net/blog/2016/03/messaging-on-aws

Số lượng Consumer có thể được thu nhỏ dựa trên số lượng tác vụ trong hàng đợi. Vì các tác vụ được lưu trữ và quản lý một các lâu dài trong SQS, nên rất dễ dàng để xây dựng một hệ thống tự động phục hồi nếu một consumer bị lỗi, chúng ta sẽ không bị mất một bản ghi nào.

SQS cung cấp REST API, do đó, có rất nhiều các để tích hợp vào Producer hay Consumer: Ứng dụng di động, client-side ứng dụng web, một ứng dụng chạy trên máy chủ EC2 hoặc AWS Lambda Function.

Giới thiệu Lambda Function

Amazon công bố AWS Lambda vào tháng 11 năm 2014. Kể từ đó, Serverless đã trở thành một trong những chủ đề nóng nhất trong thị trường đám mây.

AWS Lambda cung cấp:

  • Khả năng mở rộng và tối ưu tính toán.
  • Cho phép bạn thiết lập triển khai tự động với sự hỗ trợ của các dịch vụ CD[continuous Development].
  • Dễ dàng quản lý và không cần bảo trì.

AWS Lambda hỗ trợ các ngôn ngữ lập trình Node.js, Java, Python, .NET Core và Go. Bạn chỉ cần tải mã nguồn của mình lên S3. Sau đó bạn có thể thực thi chức năng của một function bằng cách gọi REST API [kết hợp với API Gateway] hoặc sử dụng một số dịch vụ có thể tích hợp khác: Kinesis, S3, DynamoDB, CloudTrail…

Thật may cho bạn, tại thời điểm của bài viết này, chúng ta có thể tích hợp trực tiếp SQS và Lambda [trước tháng 6 năm 2018 thì không, chúng ta phải dùng một cách khác – CloudWatch Event Rule]

Hình ảnh dưới đây cho thấy các thành phần cần thiết để đọc và xử lý tin nhắn từ dịch vụ SQS.

Chúng ta sẽ dùng tới CloudFormation để thiết kế cơ sở hạ tầng. CloudFormation làm một công cụ thiết kế, xây dựng cơ sở hạ tầng bằng code 🙂 .

Thiết lập SQS queue

Đầu tiên, chúng ta cần chuẩn bị một SQS queue, đoạn code dưới đây sẽ mô tả queue của chúng ta:

  • SQS queue để lưu trữ và quản lý các bản tin tác vụ – Tên là TaskQueue
  • Một SQS queue hoạt động như một DLQ[Dead Letter Queue].

DLQ sẽ thu thập các bản tin mà các trình xử lý bị lỗi tại các bản tin đó. Ví dụ: Một bản tin sẽ được chuyển vào DLQ nếu Consumer hoặc Worker không hoàn thành nhiệm vụ trong vòng 90 giây trong 10 lần liên tiếp. Cơ chế này giúp cho hệ thống của bạn bỏ qua các bản tin bị lỗi mà không chặn việc xử lý các tác vụ khác trong hàng đợi.

Tiếp theo, tiến hành xây dựng Consumer.

Thiết lập và triển khai Consumer với Lambda

Đoạn code dưới đây chứ tất cả các tài nguyên cần thiết cho một Lambda Consumer:

  • Một IAM Rule có tên ConsumerLambdaRole bao gồm các rule cho phép Lambda Consumer trigger các Lambda Worker.
  • Lambda Function có tên ConsumerLambda và quy tắc SQS sẽ trigger function này khi có bản ghi mới được thêm vào hàng chờ.

Đoạn code trên để thiết lập các tài nguyên cần thiết cho ConsumerLambda function, phần còn thiếu là mã nguồn thực thi của ConsumerLambda function, hàm này sẽ thực hiện chức năng:

  • Nhận các bản ghi [tasks] từ SQS queue.
  • Gọi các worker để xử lý từng bản ghi [task].

Đoạn mã dưới đây được viết bằng Typescript, đoạn code thực hiện những nội dung ở trên:

Thiết lập Lambda Worker

Đoạn mã sau sử dụng cú pháp của CloudFormation, đoạn mã mô tả các tài nguyên cần thiết để thiết lập Lambda worker function.

  • IAM Rule cho phép hàm này có thể xóa các bản ghi của SQS
  • Một Lambda function có tên WorkerLambda.

Tất nhiên, bạn phải có code cho hàm WorkerLambda. Bạn có thể làm bất kỳ việc gì trong hàm này trong vòng 900 giây [15 phút]. Bản ghi SQS cần phải được xóa khi đã được xử lý thành công.

Đoạn code dưới đây là một ví dụ cho hàm worker, không có công việc cụ thể nào được mô tả ở đây, nó chỉ cho bạn biết cách chúng ta triển khai:

Tổng kết

SQS giúp chúng ta triển khi ứng dụng mới mô hình microservice một cách dễ dàng, nó tách rời các khối công việc không đồng bộ của hệ thống.

Tài nguyên trong bài viết: //gist.github.com/hoangsetup/51694cc7672308aa53a08ff475409c2a

Bài này tất cả chúng ta và cafedev sẽ khám phá về SQS là gì ? trong AWS, trước khi tất cả chúng ta mở màn sử dụng AWS một cách thuận tiện hơn .

  • SQS là viết tắt của Simple Queue Service .
  • SQS là dịch vụ đầu tiên có sẵn trong AWS.
  • Amazon SQS là một dịch vụ web cung cấp cho bạn quyền truy cập vào hàng đợi tin nhắn có thể được sử dụng để lưu trữ tin nhắn trong khi chờ máy tính xử lý chúng.
  • Amazon SQS là một hệ thống hàng đợi phân tán cho phép các ứng dụng dịch vụ web xếp hàng một cách nhanh chóng và đáng tin cậy các thông báo mà một thành phần trong ứng dụng tạo ra để được sử dụng bởi một thành phần khác trong đó hàng đợi là kho lưu trữ tạm thời cho các thông báo đang chờ xử lý.
  • Với sự trợ giúp của SQS, bạn có thể gửi, lưu trữ và nhận tin nhắn giữa các thành phần phần mềm ở bất kỳ khối lượng nào mà không bị mất tin nhắn.
  • Sử dụng Amazon sqs, bạn có thể tách các thành phần của ứng dụng để chúng có thể chạy độc lập, giúp dễ dàng quản lý tin nhắn giữa các thành phần.
  • Bất kỳ thành phần nào của một ứng dụng phân tán đều có thể lưu trữ các thông báo trong hàng đợi.
  • Tin nhắn có thể chứa tối đa 256 KB văn bản ở bất kỳ định dạng nào như json, xml, v.v.
  • Bất kỳ thành phần nào của ứng dụng sau này đều có thể truy xuất thông báo theo chương trình bằng API Amazon SQS.
  • Hàng đợi hoạt động như một bộ đệm giữa thành phần sản xuất và lưu dữ liệu, và thành phần nhận dữ liệu để xử lý. Điều này có nghĩa là hàng đợi giải quyết các vấn đề phát sinh nếu nhà sản xuất đang sản xuất công việc nhanh hơn mức mà người tiêu dùng có thể xử lý hoặc nếu nhà sản xuất hoặc người tiêu dùng chỉ được kết nối không liên tục với mạng.
  • Nếu bạn có hai phiên bản EC2 đang kéo Hàng đợi SQS. Bạn có thể định cấu hình nhóm tính năng tự động nếu số lượng thư vượt quá một giới hạn nhất định. Giả sử số lượng tin nhắn vượt quá 10, thì bạn có thể thêm phiên bản EC2 bổ sung để xử lý công việc nhanh hơn. Bằng cách này, SQS cung cấp độ đàn hồi.

Hãy hiểu qua một ví dụ.

Hãy xem một website tạo Meme. Giả sử người dùng muốn tải ảnh lên và muốn quy đổi thành Meme. Người dùng tải ảnh lên một website và website hoàn toàn có thể tàng trữ ảnh trong s3. Ngay sau khi tải lên xong, nó sẽ kích hoạt một hàm Lambda. Lambda nghiên cứu và phân tích tài liệu về hình ảnh đơn cử này cho SQS và tài liệu này hoàn toàn có thể là “ phần trên cùng của meme nên nói gì ”, “ phần dưới của meme nên nói gì ”, vị trí của nhóm S3, v.v. bên trong SQS dưới dạng tin nhắn. Một thành viên EC2 xem xét thông tin và triển khai việc làm của nó. Một thành viên EC2 tạo một Meme và tàng trữ nó trong nhóm S3. Sau khi thành viên EC2 triển khai xong việc làm của mình, nó sẽ quay trở lại SQS. Điều tốt nhất là nếu bạn mất phiên bản EC2 của mình, thì bạn cũng sẽ không bị mất việc làm vì việc làm nằm bên trong thùng S3 .

Hãy xem xét một ví dụ khác về SQS, tức là Trang web Du lịch.


Giả sử người dùng muốn tìm kiếm một kỳ nghỉ trọn gói và muốn xem chuyến bay tốt nhất hoàn toàn có thể. Người dùng nhập một truy vấn trong trình duyệt, sau đó truy vấn truy vấn vào phiên bản EC2. Một thành viên EC2 trông “ Người dùng đang tìm kiếm gì ? ”, Sau đó nó đưa thông tin vào hàng đợi đến SQS. Một thành viên EC2 kéo hàng đợi. Một thành viên EC2 liên tục kéo hàng đợi và tìm kiếm những việc làm cần làm. Khi nó nhận được việc làm, nó sẽ giải quyết và xử lý nó. Nó thẩm vấn dịch vụ Hàng không để có được tổng thể những chuyến bay tốt nhất hoàn toàn có thể. Nó gửi hiệu quả đến sever web và sever web sẽ gửi lại tác dụng cho người dùng. Sau đó, Người dùng chọn chuyến bay tốt nhất theo ngân sách của mình .

Nếu chúng ta không có SQS, thì điều gì đã xảy ra?

Máy chủ web chuyển thông tin đến sever ứng dụng và sau đó sever ứng dụng truy vấn dịch vụ của Hãng hàng không. Nếu sever Ứng dụng gặp sự cố, thì người dùng sẽ mất truy vấn của nó. Một trong những điều tuyệt vời về SQS là tài liệu được xếp hàng đợi trong SQS ngay cả khi sever ứng dụng gặp sự cố, thông tin trong hàng đợi được ghi lại là ẩn trong hành lang cửa số khoảng chừng thời hạn chờ. Khi hết thời hạn chờ, thông tin sẽ Open lại trong hàng đợi ; thì một thực thể EC2 mới hoàn toàn có thể sử dụng thông tin này để thực thi việc làm của nó. Do đó, tất cả chúng ta hoàn toàn có thể nói rằng SQS vô hiệu sự phụ thuộc vào của sever ứng dụng .

2. Các loại hàng đợi

Có hai loại Hàng đợi:

Xem thêm: Đúng giờ tiếng Anh là gì? Văn hóa đúng giờ đối với mỗi nước

  • Hàng đợi Chuẩn [mặc định]Standard Queues [default]
  • Hàng đợi FIFO [First-In-First-Out]
  • Hàng đợi tiêu chuẩnStandard Queue

  • SQS cung cấp một hàng đợi tiêu chuẩn làm loại hàng đợi mặc định.
  • Nó cho phép bạn có số lượng giao dịch không giới hạn mỗi giây.
  • Nó đảm bảo rằng một thông điệp được gửi ít nhất một lần. Tuy nhiên, đôi khi, nhiều bản sao của một tin nhắn có thể được gửi không theo yêu cầu.
  • Nó cung cấp cách đặt hàng với nỗ lực cao nhất để đảm bảo rằng các thông điệp nói chung được gửi theo đúng thứ tự khi chúng được gửi nhưng nó không cung cấp một sự đảm bảo.
  • Hàng đợi FIFO

  • Hàng đợi FIFO bổ sung cho Hàng đợi tiêu chuẩn.
  • Nó đảm bảo việc đặt hàng, tức là, đơn hàng mà chúng được gửi đi cũng được nhận theo cùng một thứ tự.
  • Các tính năng quan trọng nhất của hàng đợi là Hàng đợi FIFO và xử lý chính xác một lần, tức là, một thông điệp được gửi một lần và vẫn có sẵn cho đến khi người tiêu dùng xử lý và xóa nó.
  • Hàng đợi FIFO không cho phép các bản sao được đưa vào Hàng đợi.
  • Nó cũng hỗ trợ các nhóm tin nhắn cho phép nhiều nhóm tin nhắn có thứ tự trong một Hàng đợi.
  • Hàng đợi FIFO được giới hạn ở 300 giao dịch mỗi giây nhưng có tất cả các khả năng của hàng đợi tiêu chuẩn.

3. Thời gian chờ hiển thị SQS

  • Thời gian chờ hiển thị là khoảng thời gian mà thư được hiển thị trong Hàng đợi SQS sau khi người đọc nhận thư đó.
  • Nếu công việc đã cung cấp được xử lý trước khi hết thời gian hiển thị, thông báo sau đó sẽ bị xóa khỏi Hàng đợi. Nếu công việc không được xử lý trong thời gian đó, thông báo sẽ hiển thị trở lại và người đọc khác sẽ xử lý nó. Điều này có thể dẫn đến cùng một tin nhắn được gửi hai lần.
  • Thời gian chờ hiển thị mặc định là 30 giây.
  • Thời gian chờ hiển thị có thể được tăng lên nếu nhiệm vụ của bạn mất hơn 30 giây.
  • Thời gian chờ hiển thị tối đa là 12 giờ.

4. Những điểm quan trọng cần nhớ:

  • SQS là dựa trên kéo, không dựa trên đẩy.
  • Tin nhắn có kích thước 256 KB.
  • Tin nhắn được giữ trong hàng đợi từ 1 phút đến 14 ngày.
  • Khoảng thời gian lưu giữ mặc định là 4 ngày.
  • Nó đảm bảo rằng tin nhắn của bạn sẽ được xử lý ít nhất một lần.

Cài ứng dụng cafedev để dễ dàng cập nhật tin và học lập trình mọi lúc mọi nơi tại đây.

Tài liệu từ cafedev:

Nếu bạn thấy hay và có ích, bạn hoàn toàn có thể tham gia những kênh sau của cafedev để nhận được nhiều hơn nữa :
Chào thân ái và quyết thắng !

Xem thêm: Định nghĩa chơi chữ và ví dụ

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!

Source: //chickgolden.com
Category: Hỏi đáp

Video liên quan

Chủ Đề