【AWS】Lambda+SQSでサイロ + プールモデルを実現するためのディスパッチャ構成検討
きっかけ
- 弊社が過去に開発し、現在も引き続き運用、追加開発をしているクライアントのSaaSがあり、 "特定のユーザが大量にリクエストしたときに他ユーザのリクエスト実行まで時間がかかるので、解消したい"とのリクエストをもらったから。
現状分析
- リクエスト受信部分はREST APIで構成、他ユーザのリクエストに処理時間は依存しない
- 実処理部分はリクエスト受信部分と非同期で処理を行っており、実処理が順次実行のため、この部分がボトルネック
- 以下サイトで分類されている分離パターンでは現状は、1. サイロモデル
- 特定処理、特定ユーザだけ分離できればいいので、3.サイロ + プールモデルを目指したい
検証で目指す構成
- リクエストを受けるSQS→各リクエストを割り当てるDispatcher用Lambda→特定ユーザ用SQS,汎用ユーザ用SQSとそれぞれ実処理Lambdaをつなげる(本記事では実処理Lambdaは省略)
構築Step
- リクエスト受信SQSとDispatcher用Lambdaをつなぐ
- Dispatcher用LambdaからCompanyA用SQSへメッセージを格納する
- Dispatcher用Lambdaで受信メッセージに応じて格納する
1.リクエスト受信SQSとDispatcher用Lambdaをつなぐ
index.js
exports.handler = async function(event, context) {
event.Records.forEach(record => {
const { body } = record;
console.log(body);
});
return {};
};
2. Dispatcher用LambdaからCompanyA用SQSへメッセージを格納する
index.js
const aws = require('aws-sdk');
aws.config.region = 'ap-northeast-1';
const sqs = new aws.SQS({apiVersion: '2012-11-05'});
const QUEUE_URL = 'https://sqs.ap-northeast-1.amazonaws.com/XXXXXXXXXX/companyA.fifo';
exports.handler = async function(event, context) {
const recs = event.Records;
for (let rec of recs){
const body = rec.body;
console.log(body);
const params = {
MessageBody: body,
QueueUrl: QUEUE_URL,
MessageGroupId:rec.attributes.MessageGroupId,
DelaySeconds: 0
};
console.log(params);
const result = await sqs.sendMessage(params).promise();
console.log(result)
}
};
3. Dispatcher用Lambdaで受信メッセージに応じて格納する
index.js
const aws = require('aws-sdk');
aws.config.region = 'ap-northeast-1';
const sqs = new aws.SQS({apiVersion: '2012-11-05'});
const companyA_QUEUE_URL = 'https://sqs.ap-northeast-1.amazonaws.com/XXXXXXXXXX/companyA.fifo';
const companyOTHERS_QUEUE_URL = 'https://sqs.ap-northeast-1.amazonaws.com/XXXXXXXXXX/companyOTHER.fifo';
let queue_url = '';
exports.handler = async function(event, context) {
const recs = event.Records;
for (let rec of recs){
const body = rec.body;
console.log(body);
const body_parse = JSON.parse(body);
if(body_parse.company_code === '0001'){
queue_url = companyA_QUEUE_URL;
} else {
queue_url = companyOTHERS_QUEUE_URL;
}
const params = {
MessageBody: body,
QueueUrl: queue_url,
MessageGroupId:rec.attributes.MessageGroupId,
DelaySeconds: 0
};
console.log(params);
const result = await sqs.sendMessage(params).promise();
console.log(result)
}
};
参考サイト
Author And Source
この問題について(【AWS】Lambda+SQSでサイロ + プールモデルを実現するためのディスパッチャ構成検討), 我々は、より多くの情報をここで見つけました https://qiita.com/kei1-dev/items/c48c30cd8faf090742a3著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .