AWSのSQSの使い方
AWS SQSは何気に便利です。時間がかかる処理はSQSにエンキューしておいて、バックエンドで処理して、フロントでは先に「処理終了しました。」みたいな感じのことができます。実際の処理はバックエンドでゆっくり別のLambdaとかBatchで処理しておく仕組みです。(非同期処理)
2019/4/21時点で東京リージョンでfifoキューが使えるようになっています。先入れ先出しが保証されるようになって、これはこれで大変便利です。
fifoキューの命名規約は最後は.fifoが必要だそうです。
Lambda(node.js8.10)からエンキューしてみます。
const AWS = require('aws-sdk'); const SQS = new AWS.SQS({ apiVersion: '2012-11-05' }); exports.handler = async (event) => { const params = { MessageBody: "JSON.stringify({'userId': 'takahashi'})", QueueUrl: 'https://sqs.xxx.amazonaws.com/xxx/b.fifo', MessageGroupId:'465789', MessageDeduplicationId: 'fight1' }; await SQS.sendMessage(params, (err, data)=>{ if (err) console.log(err); }).promise(); };
エンキューされていることが確認できます。
以前、数分間隔でポーリングしておいてエンキューされていたらLambdaを実行するといったことを実装したことがあります。この時はポーリングするプログラムを別途作ったりしましたが、イベントソースにSQSがいつの間にか追加されているのでどうもSQSからLambdaを実行できるようです。
SQSをトリガーにするLambdaには「AWSLambdaSQSQueueExecutionRole」をアタッチしておく必要があります。
イベントソースにするにはFIFOじゃなくて標準キューのみっぽいです。普通に考えたらイベントソースがFIFOである必要はない気もしますね。
こんなデザインになります。これはSQSにエンキューされたらLambdaが実行されるデザインです。
この前段で、LambdaがSQSをエンキューしたら、上のLambdaが実行されるというイメージです。
ちなみにSQSのLambdaトリガー欄は以下のように1つ追加されているはずです。
SQSのLambdaトリガーから✖印をクリックすればトリガー削除することが可能になっています。
こんな感じですが、とりあえずこれでLambdaA → SQS → LambdaBが実行できます。
デッドレターキュー
どうしてもキューが残ってしまったりします。
そういうときの為にデッドレターキューを設定しておくと便利です。この設定はマストでしておいた方が良いと思います。
普通のキューに対してデッドレターキューというのを設定します。
キュー名 | 種類 |
---|---|
a | キュー |
b | デッドレターキュー |
設定したポーリング回数(最大受信数)キューを受信しようとしたらデッドレターキューに移動します。
再処理ポリシーにデッドレターキューが表示されるようになります。
キューを受信して処理中のメッセージに移動する
エンキューすると利用可能なメッセージにキュー数が表示されます。
これを受信すると処理中のメッセージに移動されます。処理中に移動する時間は「デフォルトの可視性タイムアウト」で指定した時間になります。処理中の間はこのメッセージを他のWorkerが取得することができなくなります。
以下は受信するLambda(node.js8.10)です。
const AWS = require('aws-sdk'); const SQS = new AWS.SQS({ apiVersion: '2012-11-05' }); exports.handler = async (event) => { const params = { QueueUrl: 'https://sqs.ap-northeast-1.amazonaws.com/xxxxxxxabc/a', MaxNumberOfMessages: 10, VisibilityTimeout: 10 }; await SQS.receiveMessage(params, (err, data) => {}).promise(); };
Lambdaを実行すると「処理中のメッセージ」に移動します。
「デフォルトの可視性タイムアウト」が経過したら「利用可能なメッセージ」に戻ります。
もう一度受信すると「処理中のメッセージ」に移動しますが、デッドレターキューを指定していると、最大受信数を超えるとデッドレターキューに移動されてしまいます。
Delayキュー(配信遅延)
キューの配信遅延を設定することによってエンキューされるメッセージを一定時間見えなくするようにしてくれます。(0秒から15分までの設定ができます)
これはキュー全体に対して設定します。
メッセージタイマー
キューにメッセージタイマーを設定してエンキューされるメッセージを一定時間見えなくすることができます。この設定はDelayキューの設定を上書きます。(メッセージタイマーが優先されます)
これはメッセージに対して設定します。
const AWS = require('aws-sdk'); const SQS = new AWS.SQS({ apiVersion: '2012-11-05' }); exports.handler = async (event) => { const params = { MessageBody: "JSON.stringify({'userId': 'takahashi'})", QueueUrl: 'https://sqs.ap-northeast-1.amazonaws.com/xxxxxxx/a', DelaySeconds: 30 }; await SQS.sendMessage(params, (err, data)=>{ if (err) console.log(err); }).promise(); };
参考サイト
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント