- vừa được xem lúc

Blog#263: AWS SQS: Hướng dẫn toàn diện từ lý thuyết đến thực hành với Node.js

0 0 23

Người đăng: NGUYỄN ANH TUẤN

Theo Viblo Asia

Mình có tạo 1 series để trả lời những câu hỏi mà các bạn đã liên lạc và hỏi mình. Vì câu hỏi khá nhiều nên mình sẽ trả lời dần dần và add vào series này nè.

Bạn nào muốn liên hệ trực tiếp mình để hỏi về roadmap qua Nhật làm Dev hoặc BrSE thì contact mình qua zalo nhé: 0379302361 hoặc Facebook nhé.

Hi, I'm Tuan, a Full-stack Web Developer from Tokyo 😊. Follow my blog to not miss out on useful and interesting articles in the future.

1. Giới thiệu về AWS SQS

1.1. Định nghĩa

AWS SQS, hay còn được gọi là Amazon Simple Queue Service, là một dịch vụ hàng đợi tin nhắn được quản lý hoàn toàn, mang đến khả năng giao tiếp giữa các thành phần phân tán của hệ thống thông qua hàng đợi tin nhắn. Dịch vụ này giúp các ứng dụng hoạt động một cách liền mạch cùng nhau, tạo ra quy trình làm việc nhất quán và hiệu quả.

1.2. Nguyên lý hoạt động

Nguyên lý hoạt động của AWS SQS khá đơn giản. Khi một ứng dụng hoặc hệ thống cần gửi một Message, nó sẽ đưa Message đó vào hàng đợi SQS. Message sẽ được lưu giữ tại đây cho đến khi có một tiến trình khác (đôi khi được gọi là "Consume") lấy Message từ hàng đợi để xử lý.

Ví dụ: giả sử bạn đang xây dựng một ứng dụng gửi email hàng loạt. Bạn có thể sử dụng SQS để lưu trữ yêu cầu gửi email. Mỗi yêu cầu sẽ được đưa vào hàng đợi và sau đó một tiến trình khác sẽ lấy yêu cầu từ hàng đợi và thực hiện việc gửi email.

1.3. Ưu điểm và nhược điểm

Ưu điểm:

  • Đảm bảo Message không bị mất, ngay cả khi các thành phần của hệ thống gặp sự cố.
  • Dễ dàng mở rộng, có thể xử lý số lượng lớn Message mà không cần quan tâm đến việc quản lý cơ sở hạ tầng.
  • Tính linh hoạt cao, cho phép bạn chọn giữa hai mô hình hàng đợi: hàng đợi tiêu chuẩn (Standard Queue) và hàng đợi FIFO (First-In-First-Out).

Nhược điểm:

  • Cần có kiến thức sâu về việc quản lý hàng đợi và xử lý lỗi.
  • Không hỗ trợ trực tiếp giao thức AMQP, phải thông qua giao thức MQTT hoặc HTTP(S).

2. Hiểu rõ bản chất của AWS SQS

Để hiểu rõ bản của Aws SQS thì chúng ta hãy tự tay tạo một thư viện SQS local đơn giản để giả lập aws sqs bằng Nodejs nhằm hiểu rõ hơn bản chất của AWS SQS. Đây chỉ là 1 version siêu siêu siêu đơn giản trong thực tế AWS SQS được phát triển phức tạp hơn nhiều. (Các bạn có thế access vào thư viện để tìm hiểu nhé)

2.1. Phân tích đơn giản giễ hiểu trước khi tự tay tạo một thư viện SQS local

Trước khi bắt tay vào việc tạo một thư viện SQS local, chúng ta cần hiểu rõ về cấu trúc của SQS và cách nó hoạt động. Một hàng đợi SQS sẽ bao gồm các Message đang chờ để được xử lý. Mỗi Message sẽ bao gồm một ID duy nhất và nội dung của Message.

Chúng ta sẽ tạo một thư viện đơn giản, giả lập cách hoạt động của SQS bằng cách sử dụng mô hình Command. Thư viện này sẽ bao gồm các lệnh như sendMessage, receiveMessagedeleteMessage để xử lý các Message trong hàng đợi.

2.2. Code ví dụ

// Giả lập một thư viện SQS local đơn giản bằng Node.js
class LocalSQS { constructor() { this.queue = []; } sendMessage(message) { // Tạo một ID duy nhất cho mỗi Message const messageId = Math.random().toString(36).substring(7); // Đưa Message vào cuối hàng đợi this.queue.push({ messageId, message }); console.log(`Đã gửi Message: ${messageId}`); } receiveMessage() { // Lấy Message từ đầu hàng đợi const message = this.queue.shift(); if (message) { console.log(`Đã nhận Message: ${message.messageId}`); return message; } else { console.log('Hàng đợi rỗng!'); return null; } } deleteMessage(messageId) { // Tìm kiếm Message theo ID và xóa nó const index = this.queue.findIndex((msg) => msg.messageId === messageId); if (index > -1) { this.queue.splice(index, 1); console.log(`Đã xóa Message: ${messageId}`); } else { console.log('Không tìm thấy Message!'); } }
} // Sử dụng thư viện
const sqs = new LocalSQS(); sqs.sendMessage('Hello, world!');
sqs.receiveMessage();
sqs.deleteMessage('123');

Trong đoạn code trên, chúng ta đã tạo một thư viện đơn giản mô phỏng cách hoạt động của AWS SQS. Trong thực tế, AWS SQS cung cấp nhiều tính năng và tùy chọn hơn nhiều so với đoạn code trên, nhưng đoạn code này giúp chúng ta hình dung được cách hoạt động cơ bản của SQS.

3. Tại sao chọn sử dụng AWS SQS cùng Node.js

3.1. Lợi ích của việc kết hợp AWS SQS và Node.js

AWS SQS và Node.js là một sự kết hợp mạnh mẽ. Node.js là một môi trường chạy code JavaScript phía máy chủ, giúp xử lý các yêu cầu đồng thời nhanh chóng và hiệu quả. Khi kết hợp với AWS SQS, chúng tạo thành một hệ thống xử lý Message đáng tin cậy, có khả năng mở rộng lớn. Với AWS SQS, các ứng dụng của bạn có thể gửi, lưu trữ và nhận Message giữa các thành phần phần mềm mà không cần quan tâm đến việc mất mát Message hoặc yêu cầu phải sẵn sàng ngay lập tức.

3.2. Ứng dụng thực tế

AWS SQS và Node.js thường được sử dụng trong các tình huống mà một ứng dụng cần xử lý lượng lớn các yêu cầu đồng thời. Ví dụ, một ứng dụng xử lý đơn hàng online có thể sử dụng SQS để quản lý hàng đợi các đơn hàng cần xử lý, trong khi Node.js sẽ xử lý việc gửi yêu cầu đến SQS và xử lý các Message từ SQS.

4. Bản chất khi gửi một Message trên AWS SQS

4.1. Quá trình gửi một Message

Khi một Message được gửi đến SQS, Message đó sẽ được đặt vào hàng đợi cho đến khi một tiến trình khác yêu cầu nhận Message. SQS đảm bảo rằng mỗi Message chỉ được xử lý một lần bằng cách đánh dấu Message đó là đang được xử lý khi nó được nhận. Nếu tiến trình nhận Message không xóa Message đó sau khi xử lý xong, Message sẽ trở lại hàng đợi sau một thời gian chờ định trước, cho phép một tiến trình khác có thể nhận và xử lý nó.

4.2. Ví dụ minh họa

Ví dụ, một ứng dụng gửi Message vào hàng đợi SQS với nội dung là một công việc cần xử lý. Một tiến trình khác sau đó yêu cầu SQS gửi một Message từ hàng đợi, nhận công việc và bắt đầu xử lý. Nếu tiến trình này gặp sự cố và không hoàn thành công việc, sau thời gian chờ định trước, công việc sẽ trở lại hàng đợi và có thể được một tiến trình khác nhận và xử lý.

5. Hướng dẫn toàn diện sử dụng AWS SQS với Node.js

5.1. Cài đặt và cấu hình

Để sử dụng AWS SQS với Node.js, bạn cần cài đặt SDK của AWS cho Node.js. Bạn cũng cần cấu hình thông tin xác thực AWS của bạn, bao gồm Access Key ID và Secret Access Key, để SDK có thể tương tác với SQS.

5.2. Tạo và quản lý hàng đợi

Với AWS SDK, bạn có thể tạo và quản lý hàng đợi SQS ngay trong mã Node.js của mình. Bạn có thể tạo hàng đợi mới, lấy danh sách các hàng đợi hiện có, hoặc xóa hàng đợi.

5.3. Gửi Message

Gửi Message đến SQS từ Node.js đơn giản chỉ là một câu lệnh, với nội dung Message và tên hàng đợi làm tham số.

5.4. Nhận và xử lý Message

Bạn có thể yêu cầu SQS gửi Message từ hàng đợi bằng một câu lệnh khác. Message nhận được có thể được xử lý ngay lập tức, hoặc lưu lại để xử lý sau.

5.5. Xử lý lỗi và giải quyết sự cố

Trong quá trình làm việc với SQS, có thể có các lỗi xảy ra, như lỗi mạng hoặc lỗi xác thực. AWS SDK cung cấp các cơ chế để bạn xử lý và phục hồi từ những lỗi này.

6. Ví dụ thực tế sử dụng AWS SQS với Node.js code

6.1. Mô tả ứng dụng

Ở phần này, chúng ta sẽ xem xét một ví dụ thực tế về một ứng dụng Node.js sử dụng AWS SQS để xử lý các tác vụ nặng như tải lên file hoặc xử lý dữ liệu.

6.2. Code ví dụ

//... (giả định đã khởi tạo AWS SDK và tạo kết nối với SQS)
let queueURL = "https://sqs.us-east-1.amazonaws.com/123456789012/MyQueue"; // Gửi Message
let params = { MessageBody: JSON.stringify({ task: "process_data", content: "..." }), QueueUrl: queueURL
};
sqs.sendMessage(params, function(err, data) { if (err) { console.log("Error", err); } else { console.log("Successfully added message", data.MessageId); }
}); // Nhận và xử lý Message
params = { MaxNumberOfMessages: 10, MessageAttributeNames: ["All"], QueueUrl: queueURL, VisibilityTimeout: 60, WaitTimeSeconds: 0
};
sqs.receiveMessage(params, function(err, data) { if (err) { console.log("Receive Error", err); } else if (data.Messages) { let deleteParams = { QueueUrl: queueURL, ReceiptHandle: data.Messages[0].ReceiptHandle }; sqs.deleteMessage(deleteParams, function(err, data) { if (err) { console.log("Delete Error", err); } else { console.log("Message Deleted", data); } }); }
});

Trong đoạn code trên, chúng ta gửi một Message đơn giản đến SQS với nội dung là một tác vụ "process_data". Sau đó, chúng ta yêu cầu SQS gửi về một số Message từ hàng đợi, xử lý chúng, và sau đó xóa chúng khỏi hàng đợi.

6.3. Nhận xét

Chúng ta có thể thấy rằng việc sử dụng AWS SQS với Node.js cho phép chúng ta xử lý các tác vụ nặng một cách hiệu quả, mà không làm ảnh hưởng đến hiệu suất của ứng dụng chính.

7. AWS SQS và AWS Lambda

7.1 Cưỡi ngựa xem hoa: AWS SQS và AWS Lambda

AWS Lambda là một dịch vụ tính toán không máy chủ cho phép bạn run code mà không cần quản lý hoặc cung cấp máy chủ. AWS Lambda tự động điều chỉnh tính toán để xử lý lượng công việc lớn hoặc nhỏ mà không có bất kỳ sự gián đoạn nào.

Khi kết hợp AWS SQS và AWS Lambda, bạn có thể xây dựng một hệ thống mạnh mẽ mà trong đó Lambda tự động đọc Message từ SQS, xử lý chúng và sau đó tự động xóa chúng khỏi hàng đợi khi xử lý thành công.

7.2 Ví dụ trực quan:

Giả sử bạn đang xây dựng một ứng dụng để xử lý các yêu cầu từ người dùng và bạn muốn gửi một email tới người dùng mỗi khi có yêu cầu mới.

Với SQS và Lambda, bạn có thể:

  1. Tạo một hàng đợi SQS để lưu trữ các yêu cầu.

  2. Mỗi khi có một yêu cầu mới, gửi thông tin yêu cầu vào hàng đợi.

  3. Tạo một hàm Lambda trong Node.js để xử lý các Message từ hàng đợi. Hàm Lambda này sẽ lấy thông tin yêu cầu từ Message, tạo một email và gửi nó tới người dùng.

  4. Cấu hình Lambda để tự động đọc các Message từ SQS.

Dưới đây là một ví dụ về mã Node.js cho hàm Lambda:

// Nạp module AWS SDK
const AWS = require('aws-sdk'); // Khởi tạo SQS và SES (dịch vụ gửi email của AWS)
const sqs = new AWS.SQS();
const ses = new AWS.SES(); exports.handler = async (event) => { // Duyệt qua mỗi Message trong event for (const record of event.Records) { // Lấy nội dung Message const message = JSON.parse(record.body); // Tạo email const emailParams = { Destination: { ToAddresses: [message.userEmail], }, Message: { Body: { Text: { Charset: "UTF-8", Data: `Bạn có một yêu cầu mới: ${message.requestContent}`, }, }, Subject: { Charset: 'UTF-8', Data: 'Thông báo yêu cầu mới', }, }, Source: 'your-email@example.com', }; try { // Gửi email await ses.sendEmail(emailParams).promise(); console.log(`Email đã được gửi đến: ${message.userEmail}`); } catch (error) { console.error(error); } }
};

Trong đoạn code trên, chúng ta khởi tạo một hàm Lambda sử dụng Node.js. Hàm này sẽ duyệt qua mỗi Message trong sự kiện được chuyển từ SQS. Mỗi Message là một yêu cầu từ người dùng, bao gồm địa chỉ email của người dùng và nội dung yêu cầu.

Sau đó, hàm này tạo một email với nội dung yêu cầu và gửi nó tới người dùng sử dụng dịch vụ gửi email của AWS (SES). Nếu email được gửi thành công, hàm sẽ in ra một thông báo. Nếu có lỗi xảy ra, nó sẽ in ra lỗi.

Lưu ý rằng, bạn cần cấu hình SQS để gọi hàm Lambda này mỗi khi có Message mới được thêm vào hàng đợi. Bạn cũng cần cấu hình quyền truy cập IAM cho Lambda để cho phép nó đọc Message từ SQS và gửi email qua SES.

Với cách tiếp cận này, bạn có thể xử lý hàng ngàn hay thậm chí hàng triệu yêu cầu một cách hiệu quả mà không cần quan tâm đến việc quản lý máy chủ hoặc điều chỉnh tài nguyên. Hơn nữa, bạn chỉ phải trả tiền cho thời gian thực thi của hàm Lambda và số lượng Message được xử lý, điều này giúp tiết kiệm chi phí đáng kể so với việc sử dụng máy chủ truyền thống.

8. Kết luận

8.1. Tổng kết lợi ích của việc sử dụng AWS SQS và Node.js

AWS SQS cung cấp một giải pháp hàng đợi tin nhắn phân tán, bền bỉ, và đáng tin cậy cho ứng dụng của bạn. Kết hợp với Node.js, SQS giúp ứng dụng của bạn xử lý các tác vụ nặng một cách dễ dàng và hiệu quả.

8.2. Khuyến nghị và gợi ý cho người mới bắt đầu

Nếu bạn mới bắt đầu với AWS SQS và Node.js, đừng ngần ngại thử nghiệm và khám phá. Hãy bắt đầu bằng việc tạo một hàng đợi đơn giản, gửi và nhận một số Message, và sau đó mở rộng từ đó.

9. FAQs: 5 Câu hỏi thường gặp

1. AWS SQS hoạt động như thế nào?

AWS SQS là một dịch vụ hàng đợi tin nhắn phân tán, giúp cho việc gửi, lưu trữ và nhận các Message giữa các thành phần phần mềm không đồng bộ. Các Message được lưu trữ trên hàng đợi cho đến khi chúng được xử lý và xóa.

2. Làm thế nào để tạo một hàng đợi SQS?

Bạn có thể tạo một hàng đợi SQS thông qua AWS Management Console, AWS Command Line Interface (CLI), hoặc các AWS SDKs.

3. Node.js kết hợp với AWS SQS có lợi ích gì?

Kết hợp Node.js với AWS SQS cho phép bạn xử lý các tác vụ nặng một cách hiệu quả và không ảnh hưởng đến hiệu suất của ứng dụng chính. Bạn có thể gửi các tác vụ đó đến hàng đợi và xử lý chúng sau.

4. AWS SQS có bảo mật không?

AWS SQS sử dụng các dịch vụ và công cụ bảo mật của AWS để cung cấp các lớp bảo mật cho Message của bạn. Nó hỗ trợ chính sách IAM để kiểm soát quyền truy cập, KMS để mã hóa dữ liệu, và VPC Endpoints để giữ cho dữ liệu trong mạng riêng ảo của bạn.

5. Làm thế nào để xử lý lỗi trong AWS SQS?

AWS SQS cung cấp các tính năng như dead letter queues để giúp xử lý lỗi. Khi một Message không thể được xử lý sau một số lần thử, nó có thể được chuyển đến một dead letter queue để xem xét và xử lý sau.

And Finally

As always, I hope you enjoyed this article and got something new. Thank you and see you in the next articles!

If you liked this article, please give me a like and subscribe to support me. Thank you. 😊


Mình có tạo 1 series để trả lời những câu hỏi mà các bạn đã liên lạc và hỏi mình. Vì câu hỏi khá nhiều nên mình sẽ trả lời dần dần và add vào series này nè. Link tham khảo: https://viblo.asia/s/chuyen-muc-tra-loi-cau-hoi-cuoc-song-dev-tai-nhut-bon-PwlVmR7Z45Z

Bạn nào muốn liên hệ trực tiếp mình để hỏi về roadmap qua Nhật làm Dev hoặc BrSE thì contact mình qua zalo nhé: 0379302361 hoặc Facebook nhé.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Giới thiệu Typescript - Sự khác nhau giữa Typescript và Javascript

Typescript là gì. TypeScript là một ngôn ngữ giúp cung cấp quy mô lớn hơn so với JavaScript.

0 0 528

- vừa được xem lúc

Bạn đã biết các tips này khi làm việc với chuỗi trong JavaScript chưa ?

Hi xin chào các bạn, tiếp tục chuỗi chủ đề về cái thằng JavaScript này, hôm nay mình sẽ giới thiệu cho các bạn một số thủ thuật hay ho khi làm việc với chuỗi trong JavaScript có thể bạn đã hoặc chưa từng dùng. Cụ thể như nào thì hãy cùng mình tìm hiểu trong bài viết này nhé (go).

0 0 436

- vừa được xem lúc

Một số phương thức với object trong Javascript

Trong Javascript có hỗ trợ các loại dữ liệu cơ bản là giống với hầu hết những ngôn ngữ lập trình khác. Bài viết này mình sẽ giới thiệu về Object và một số phương thức thường dùng với nó.

0 0 158

- vừa được xem lúc

Tìm hiểu về thư viện axios

Giới thiệu. Axios là gì? Axios là một thư viện HTTP Client dựa trên Promise.

0 0 149

- vừa được xem lúc

Imports và Exports trong JavaScript ES6

. Giới thiệu. ES6 cung cấp cho chúng ta import (nhập), export (xuất) các functions, biến từ module này sang module khác và sử dụng nó trong các file khác.

0 0 113

- vừa được xem lúc

Bài toán đọc số thành chữ (phần 2) - Hoàn chỉnh chương trình dưới 100 dòng code

Tiếp tục bài viết còn dang dở ở phần trước Phân tích bài toán đọc số thành chữ (phần 1) - Phân tích đề và những mảnh ghép đầu tiên. Bạn nào chưa đọc thì có thể xem ở link trên trước nhé.

0 0 249