[AWS入門]Amazon SQS触ってみた
こんにちは、べこです。
AWS認定資格を取ったものの、実際に触ってないサービス多いなぁ〜と思ったので触っていきます。
皆さんもこの記事をきっかけに軽率に触っていきましょう。
今回は記念すべき第一回目、Amazon Simple Queue Service (以下、SQS) です。
対象読者
- AWS認定資格を取ったものの、実際にSQSを触ったことが無い人
- AWSに興味がある人
- AWSを気軽に触ってみたい人
そもそもSQSって何?
Amazon Simple Queue Service (SQS) は、完全マネージド型のメッセージキューイングサービスで、マイクロサービス、分散システム、およびサーバーレスアプリケーションの切り離しとスケーリングが可能です。
SQS を使用すると、あらゆる量のソフトウェアコンポーネント間でメッセージを送信、保存、受信できます。
(引用元:https://aws.amazon.com/jp/sqs/)
とのこと。
AWS環境構築のベストプラクティスである「コンポーネントの疎結合化」に一役買ってくれるサービス、それがSQSです。
こちらの記事 が非常に分かりやすいので、詳細はこちらをご覧ください。
また、SQSには「標準キュー」と「FIFOキュー」があります。
それぞれの特徴は下記の通り。
- 標準キュー
- 送信メッセージの順番がバラバラ
- 送信メッセージに重複あり
- 秒間リクエストの制限なし
- FIFO(First-In-First-Out)キュー
- 送信メッセージの順番が保証
- 送信メッセージは1回のみ(重複なし)
- 秒間スループットの制限あり[1]
- 標準キューに比べると少し割高
触ってみる
SQSを触るにあたり、下記ブログの確認用ソースコードをほぼそのまま使わせて頂きました。
クラスメソッド様、いつもありがとうございます。。。(ここで土下座をする)
AWS再入門ブログリレー SQS編
(記事を書いていたら2020年版の記事も見つけました。AWS再入門ブログリレー Amazon SQS編)
前提条件
- AWSアカウントを作成済みであること
キューの作成
まずは標準キュー
コンソールをぽちぽちして、標準キューを作成します。
タイプは標準キューを選択し、好きな名前を入力しましょう。
あとはデフォルトで、「キューを作成」!
簡単ですね。
続いてFIFOキュー
こちらもコンソールをポチポチしていきます。
FIFOキューの場合、名前の最後に「.fifo」というsuffixを付ける必要があるようです。
「コンテンツに基づく重複排除」を有効にしておきましょう。
あとはデフォルトで大丈夫です。
それぞれのキューにメッセージを送信&受信
今回はCloud9で実行しましたが、お好きな環境から実行して下さい。
const AWS = require("aws-sdk");
const SQS = new AWS.SQS({ region: "ap-northeast-1" })
const QueueUrl = "https://sqs.ap-northeast-1.amazonaws.com/xxxxxxxxxxxx/queue";
const wait = () =>
new Promise(resolve => {
setTimeout(() => resolve(""),1000);
});
function order(burger, amount) {
const MessageBody = JSON.stringify({ burger, amount })
// const MessageGroupId = "Group1"
SQS.sendMessage({
MessageBody,
QueueUrl,
// MessageGroupId,
}, (err, data) => {
if (err) return console.error(err, err.stack);
console.log(data)
});
}
async function main() {
order("ハンバーガー", 1);
await wait();
order("チーズバーガー", 2);
await wait();
order("テリヤキバーガー", 3);
await wait();
order("チキンバーガー", 4);
await wait();
order("フィッシュバーガー", 5);
}
main();
const AWS = require("aws-sdk");
const sqs = new AWS.SQS({ region: "ap-northeast-1" });
const QueueUrl = "https://sqs.ap-northeast-1.amazonaws.com/xxxxxxxxxxxx/queue";
const receiveMessage = QueueUrl =>
new Promise((resolve, reject) => {
const params = {
QueueUrl,
MaxNumberOfMessages: 10,
WaitTimeSeconds: 10
};
sqs.receiveMessage(params, (err, data) => {
if (err || !data.Messages) return reject(err);
return resolve(data);
});
});
const deleteMessage = (ReceiptHandle, QueueUrl) => {
const params = {
QueueUrl,
ReceiptHandle
};
sqs.deleteMessage(params, (err, data) => {
if (err) return console.error(err);
console.log("delete queue");
console.log(data);
});
};
const createBurger = burger =>
new Promise(resolve => {
setTimeout(() => resolve("へい、お待ち!"), 100);
});
async function main() {
while (true) {
const data = await receiveMessage(QueueUrl).catch(console.error);
if (!data) continue;
for (const message of data.Messages) {
// ハンバーガーを作る
const order = JSON.parse(message.Body);
// 重い処理
console.log(order.burger, order.amount + "個")
const result = await createBurger(order.burger);
console.log(result)
deleteMessage(message.ReceiptHandle, QueueUrl);
}
}
}
main();
メッセージの順番が確実に分かるようにするため、orderの間に待機処理を挟んでます。
また、FIFOキューの場合は cashier.js の下記箇所のコメントアウトを外して下さい。
// const MessageGroupId = "Group1"
// MessageGroupId,
cashier.js → chef.js の順で実行します。
標準キューの実行結果
重複は無いものの、順番はバラバラですね。
FIFOキューの実行結果
おお!ちゃんと順番通りに受信出来てます。いいですね。
まとめ
今回はSQSを触ってみました。
実際に触ってみて気づいたことを含め、改めて標準キューとFIFOキューについてまとめてみます。
- 標準キュー
- 送信メッセージの順番がバラバラ
- 送信メッセージに重複あり
- 秒間リクエストの制限なし
- FIFO(First-In-First-Out)キュー
- 送信メッセージの順番が保証
- 送信メッセージは1回のみ(重複なし)
- 秒間スループットの制限あり
- 標準キューに比べると少し割高
- 重複を排除する値が特に無い場合、作成時に「コンテンツに基づく重複排除」を有効にする必要がある
- 送信メッセージには MessageGroupID が必要
今回気付けることも多く、非常に楽しかったです。
元々好きなサービスだったSQSがより好きになりました。
皆さんも是非SQSを触ってみて下さい。
-
FIFOのスループットは秒間300メッセージでしたが、2021年5月27日のアップデートで、秒間3,000メッセージまで処理出来るようになったらしいです。10倍!!!ただ、本記事執筆時点(2021年6月1日)では期間限定のプレビュー機能としての提供とのこと。 ↩︎
Discussion