+6

AWS SQS: ジュニア開発者のガイドです

「AWS SQS」は完全に管理されたメッセージキューサービスで、マイクロサービス、分散システム、サーバーレスアプリケーションを解きほぐし、スケールアップさせることができます。SQSはメッセージ指向ミドルウェアの管理や運用に関連する複雑さやオーバーヘッドを取り除き、開発者が差別化された作業に集中することができます。

「Node.js」は、Chromeの「V8」JavaScriptエンジン上に構築されたJavaScriptランタイムです。開発者は、サーバーサイドでJavaScriptを実行して、高速かつスケーラブルなネットワークアプリケーションを作成することができます。Node.jsはバックエンドサービスの作成、リアルタイムアプリの開発、オートメーションタスクの実行などに広く使用されています。

SQSとNode.jsを一緒に使用することで、大量のデータを処理し、複数のタスクを同時に実行することができる、強力で柔軟なアプリケーションを作成することができます。

AWSでSQSキューを設定する

Node.jsでSQSを使う前に、AWSで新しいキューを作成する必要があります。以下の手順に従って行えば作成できます:

  1. AWS管理コンソール内のSQSのホームページにアクセスします。
  2. 「新しいキューを作成」ボタンをクリックします。
  3. キューに名前を付け、「標準キュー」オプションを選択します。
  4. 「新しいキューを作成」ボタンをクリックして新しいキューを作成します。

キューが設定されたら、そこにメッセージを送受信することができます。

Node.jsでSQSキューにメッセージを送信する

Node.jsアプリケーションからSQSキューにメッセージを送信するには、Node.js用のAWS SDK for JavaScript(aws-sdk)を使用する必要があります。このSDKは、Node.jsを使用してSQSとやり取りするためのクライアントを提供します。

SQSキューにメッセージを送信するSDKの使用例

const AWS = require('aws-sdk');
const sqs = new AWS.SQS();

// Create the message to send to the SQS queue
const message = {
  message: 'Hello, SQS!'
};

// Set the parameters for sending the message to the SQS queue
const params = {
  MessageBody: JSON.stringify(message),
  QueueUrl: 'https://sqs.us-east-1.amazonaws.com/1234567890/MyQueue'
};

// Send the message to the SQS queue
sqs.sendMessage(params, (err, data) => {
  if (err) {
    console.log(`Error sending message to SQS: ${err}`);
  } else {
    console.log(`Successfully sent message to SQS: ${data}`);
  }
});

Node.jsでSQSキューからメッセージを受信して処理する

SQSキューにメッセージを送信したら、Node.jsアプリケーションでそれらを受信し処理することができます。それにはNode.js用のAWS SDK for JavaScript(aws-sdk)を使用します

SQSキューから新しいメッセージを取得して受信したメッセージを処理する例:

const AWS = require('aws-sdk');
const sqs = new AWS.SQS();

// Set the parameters for receiving messages from the SQS queue
const params = {
  QueueUrl: 'https://sqs.us-east-1.amazonaws.com/1234567890/MyQueue',
  MaxNumberOfMessages: 10
};

// Poll the SQS queue for new messages
setInterval(() => {
  sqs.receiveMessage(params, (err, data) => {
    if (err) {
      console.log(`Error receiving message from SQS: ${err}`);
    } else {
      console.log(`Successfully received message from SQS: ${data}`);
      // Process the message
      // ...
    }
  });
}, 5000);

この例では、setInterval関数を使用して、5秒ごとにSQSキューから新しいメッセージを取得します。メッセージを受信したら、それはコンソールに記録され、アプリケーションによって処理されます。

ユースケース

1.バックグラウンドジョブ処理

SQSはNode.jsアプリケーションで非同期にバックグラウンドジョブを処理するために使用できます。例えば、電子メールを送信したり、レポートを生成したり、古いデータを消去したりします。

この用途では、SQSを使用してNode.jsアプリケーションで非同期にバックグラウンドジョブを処理できます。例えば、電子メールを送信する場合:

const AWS = require('aws-sdk');
const sqs = new AWS.SQS();
const ses = new AWS.SES();

// Create the message to send to the SQS queue
const message = {
  email: 'example@example.com',
  subject: 'Hello, SQS!',
  body: 'This is a background job processed by SQS'
};

// Set the parameters for sending the message to the SQS queue
const params = {
  MessageBody: JSON.stringify(message),
  QueueUrl: 'https://sqs.us-east-1.amazonaws.com/1234567890/emailQueue'
};

// Send the message to the SQS queue
sqs.sendMessage(params, (err, data) => {
  if (err) {
    console.log(`Error sending message to SQS: ${err}`);
  } else {
    console.log(`Successfully sent message to SQS: ${data}`);
  }
});

setInterval(() => {
  sqs.receiveMessage({
    QueueUrl: 'https://sqs.us-east-1.amazonaws.com/1234567890/emailQueue',
    MaxNumberOfMessages: 10
  }, (err, data) => {
    if (err) {
      console.log(`Error receiving message from SQS: ${err}`);
    } else {
      const emailParams = {
        Destination: {
          ToAddresses: [data.Messages[0].email]
        },
        Message: {
          Body: {
            Text: {
              Charset: "UTF-8",
              Data: data.Messages[0].body
            }
          },
          Subject: {
            Charset: 'UTF-8',
            Data: data.Messages[0].subject
          }
        },
        Source: 'example@example.com',
      };
      ses.sendEmail(emailParams, (err, data) => {
        if (err) {
          console.log(`Error sending email: ${err}`);
        } else {
          console.log(`Successfully sent email: ${data}`);
        }
      });
      sqs.deleteMessage({
        QueueUrl: 'https://sqs.us-east-1.amazonaws.com/1234567890/emailQueue',
        ReceiptHandle: data.Messages[0].ReceiptHandle
      }, (err, data) => {
        if (err) {
          console.log(`Error deleting email from SQS: ${err}`);
        } else {
          console.log(`Successfully deleted email from SQS: ${data}`);
        }
      });
    }
  });
}, 5000);

2.マイクロサービスを解きほぐす

SQSはNode.jsアプリケーションで、SQSをメッセージングバスとして使用してマイクロサービスを解きほぐすことができます。これにより、サービスが独立して動作し、アプリケーション全体のスケーラビリティや可用性が向上します。

この用途では、Node.jsアプリケーション内の異なるマイクロサービス間にSQSをメッセージングバスとして使用できます。これにより、マイクロサービスが独立して動作し、アプリケーション全体のスケーラビリティや可用性が向上します。 例えば、1つのマイクロサービスがSQSを使用して別のマイクロサービスにメッセージを送信する方法:

const AWS = require('aws-sdk');
const sqs = new AWS.SQS();

// Create the message to send to the SQS queue
const message = {
  message: 'This is a message from Microservice 1 to Microservice 2'
};

// Set the parameters for sending the message to the SQS queue
const params = {
  MessageBody: JSON.stringify(message),
  QueueUrl: 'https://sqs.us-east-1.amazonaws.com/1234567890/microserviceQueue'
};

// Send the message to the SQS queue
sqs.sendMessage(params, (err, data) => {
  if (err) {
    console.log(`Error sending message to SQS: ${err}`);
  } else {
    console.log(`Successfully sent message to SQS: ${data}`);
  }
});

3.リアルタイム通知

SQSは、特定のイベントが発生したときにNode.jsアプリケーションにリアルタイム通知を送信するために使用できます。例えば、新しいユーザーがサインアップしたときや、支払いが受け取られたときに通知を送信する場合。

この用途では、特定のイベントが発生したときにSQSを使用してNode.jsアプリケーションにリアルタイム通知を送信できます。例えば、新しいユーザーがサインアップしたときに通知を送信する場合:

const AWS = require('aws-sdk');
const sqs = new AWS.SQS();

// Create the message to send to the SQS queue
const message = {
  message: 'A new user has signed up: John Doe'
};

// Set the parameters for sending the message to the SQS queue
const params = {
  MessageBody: JSON.stringify(message),
  QueueUrl: 'https://sqs.us-east-1.amazonaws.com/1234567890/notificationQueue'
};

// Send the message to the SQS queue
sqs.sendMessage(params, (err, data) => {
  if (err) {
    console.log(`Error sending message to SQS: ${err}`);
  } else {
    console.log(`Successfully sent message to SQS: ${data}`);
  }
});

// Poll the SQS queue for new messages
setInterval(() => {
  sqs.receiveMessage({
    QueueUrl: 'https://sqs.us-east-1.amazonaws.com/1234567890/notificationQueue',
    MaxNumberOfMessages: 10
  }, (err, data) => {
    if (err) {
      console.log(`Error receiving message from SQS: ${err}`);
    } else {
      console.log(`Received notification: ${data.Messages[0].message}`);
      // send this notification  to client
      //...
      sqs.deleteMessage({
        QueueUrl: 'https://sqs.us-east-1.amazonaws.com/1234567890/notificationQueue',
        ReceiptHandle: data.Messages[0].ReceiptHandle
      }, (err, data) => {
        if (err) {
          console.log(`Error deleting notification from SQS: ${err}`);
        } else {
          console.log(`Successfully deleted notification from SQS: ${data}`);
        }
      });
    }
  });
}, 5000);

4.自動ワークフロー

SQSはNode.jsアプリケーションで自動ワークフローを作成するために使用できます。例えば、ユーザーの画像を処理して分析用の他のサービスに送信する場合。

この用途では、SQSを使用してNode.jsアプリケーションで自動ワークフローを作成できます。例えば、ユーザーの画像を処理して分析用の他のサービスに送信する場合:

const AWS = require('aws-sdk');
const sqs = new AWS.SQS();
const rekognition = new AWS.Rekognition();

// Create the message to send to the SQS queue
const message = {
  imageUrl: 'https://example.com/image.jpg'
};

// Set the parameters for sending the message to the SQS queue
const params = {
  MessageBody: JSON.stringify(message),
  QueueUrl: 'https://sqs.us-east-1.amazonaws.com/1234567890/imageQueue'
};

// Send the message to the SQS queue
sqs.sendMessage(params, (err, data) => {
  if (err) {
    console.log(`Error sending message to SQS: ${err}`);
  } else {
    console.log(`Successfully sent message to SQS: ${data}`);
  }
});

setInterval(() => {
  sqs.receiveMessage({
    QueueUrl: 'https://sqs.us-east-1.amazonaws.com/1234567890/imageQueue',
    MaxNumberOfMessages: 10
  }, (err, data) => {
    if (err) {
      console.log(`Error receiving message from SQS: ${err}`);
    } else {
      const imageUrl = data.Messages[0].imageUrl;
      rekognition.detectLabels({
        Image: {
          S3Object: {
            Bucket: 'imageBucket',
            Name: imageUrl
          }
        },
        MinConfidence: 90
      }, (err, data) => {
        if (err) {
          console.log(`Error processing image: ${err}`);
        } else {
          console.log(`Image labels: ${data.Labels}`);
        }
      });
      sqs.deleteMessage({
        QueueUrl: 'https://sqs.us-east-1.amazonaws.com/1234567890/imageQueue',
        ReceiptHandle: data.Messages[0].ReceiptHandle
      }, (err, data) => {
        if (err) {
          console.log(`Error deleting image from SQS: ${err}`);
        } else {
          console.log(`Successfully deleted image from SQS: ${data}`);
        }
      });
    }
  });
}, 5000);

5.ロードバランシング

SQSは、Node.jsアプリケーションに対するインバウンドリクエストを複数のアプリケーションインスタンスにルーティングすることで、ロードバランサーとして使用できます。これにより、アプリケーションは大量のトラフィックを処理するために自動的にスケールアップできます。

この用途では、SQSを使用してNode.jsアプリケーションで、インバウンドリクエストを複数のアプリケーションインスタンスにルーティングすることでロードバランサーとして使用できます。これにより、アプリケーションは大量のトラフィックを処理するために自動的にスケールアップできます。インバウンドリクエストを異なるNode.jsアプリケーションインスタンスにルーティングする方法の例:

const AWS = require("aws-sdk");
const sqs = new AWS.SQS();

// Create the SQS queue
sqs.createQueue(
  {
    QueueName: "requestQueue",
  },
  (err, data) => {
    if (err) {
      console.log(`Error creating SQS queue: ${err}`);
    } else {
      console.log(`Successfully created SQS queue: ${data}`);
    }
  }
);

// Send a request to the SQS queue
const request = {
  requestUrl: "/example",
  requestMethod: "GET",
};

const params = {
  MessageBody: JSON.stringify(request),
  QueueUrl: "https://sqs.us-east-1.amazonaws.com/1234567890/requestQueue",
};

sqs.sendMessage(params, (err, data) => {
  if (err) {
    console.log(`Error sending request to SQS: ${err}`);
  } else {
    console.log(`Successfully sent request to SQS: ${data}`);
  }
});

// Poll the SQS queue for new requests
setInterval(() => {
  sqs.receiveMessage(
    {
      QueueUrl: "https://sqs.us-east-1.amazonaws.com/1234567890/requestQueue",
      MaxNumberOfMessages: 10,
    },
    (err, data) => {
      if (err) {
        console.log(`Error receiving request from SQS: ${err}`);
      } else {
        // Route request to a free instance of the application
        //...
        sqs.deleteMessage(
          {
            QueueUrl: "https://sqs.us-east-1.amazonaws.com/1234567890/requestQueue",
            ReceiptHandle: data.Messages[0].ReceiptHandle,
          },
          (err, data) => {
            if (err) {
              console.log(`Error deleting request from SQS: ${err}`);
            } else {
              console.log(`Successfully deleted request from SQS: ${data}`);
            }
          }
        );
      }
    }
  );
}, 5000);

上記のコードサンプルから分かるように、AWS Simple Queue Service(SQS)は、バックグラウンドジョブ処理、マイクロサービスを解きほぐす、リアルタイム通知、自動ワークフロー、ロードバランシングなどのさまざまな用途で使用できます。私が提供したコードサンプルは、あくまでスタート地点に過ぎず、アプリケーションの特定の要件を満たすためにカスタマイズすることができます。

結論

この記事では、AWS Simple Queue Service (SQS)とNode.jsを組み合わせて強力で柔軟なアプリケーションを作成する方法について説明しました。AWSでSQSキューを作成する方法、Node.jsを使ってキューからメッセージを送受信する方法を示し、SQSが解決する一般的な問題に使用できる実際の例も提供しました。SQSは完全に管理されたサービスであり、マイクロサービスやスケーラブルなアプリケーションを構築するのに役立ちます。

この情報がSQSとNode.jsを一緒に使う基本を理解するのに役立ち、自分自身のアプリケーションを作成するための基盤を与えることを願っています。もしSQSやNode.jsについてもっと学びたい場合は、公式のAWS SQSおよびAWS SDK for Node.jsのドキュメンテーションをチェックアウトすることをお勧めします。

Mình hy vọng bạn thích bài viết này và học thêm được điều gì đó mới.

Donate mình một ly cafe hoặc 1 cây bút bi để mình có thêm động lực cho ra nhiều bài viết hay và chất lượng hơn trong tương lai nhé. À mà nếu bạn có bất kỳ câu hỏi nào thì đừng ngại comment hoặc liên hệ mình qua: Zalo - 0374226770 hoặc Facebook. Mình xin cảm ơn.

Momo: NGUYỄN ANH TUẤN - 0374226770

TPBank: NGUYỄN ANH TUẤN - 0374226770 (hoặc 01681423001)

image.png


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí