はじめに
CloudFront+APIGateway+Lambda構成のサーバレスアーキテクチャで
Lambdaの非同期呼び出しを行いレスポンスタイム改善を実施しました。
目次
実行環境
上記のような環境で、レスポンスを即時返却するためのLambdaからメイン処理のLambdaを非同期呼び出し
利用言語はPythonとなります。
改善
Lambdaの非同期呼び出し
負荷試験を実施し同時リクエスト数を増やして行くと平均レスポンスがどんどんと遅くなっていく事が
分かったため、非同期呼び出しに変更する事でレスポンスをある程度一定に抑える事ができるようになりました。
APIGateway + Lambdaの組み合わせで非同期化の記事も多く参考になりましたが、
現在のBoto3 マニュアルを読むと、invoke_async は非推奨となっておりその変わりに
InvocationType にEventを指定しろとの事でした。
http://boto3.readthedocs.io/en/latest/reference/services/lambda.html#Lambda.Client.invoke
You can optionally request asynchronous execution by specifying Event as the InvocationType.
def lambda_handler(event, context): validate処理等々 ... lambda_client = boto3.client("lambda") lambda_client.invoke( FunctionName="async_lambda", InvocationType="Event", Payload=payload )
メモリ割り当て値変更
Lambdaはメモリ割り当て値で、CPUパワーも変わって来るのですが
上記程度の処理ではそこまで変わらないのでは無いかと考えておりましたが
100rpsでベンチマークを実施しました所、かなりパフォーマンスが異なる事を確認しました。
Lambdaメモリ | 平均時間 | 99パーセンタイル値 |
---|---|---|
128MB | 812ms | 6801ms |
256MB | 395ms | 3434ms |
1536MB | 252ms | 1331ms |
128MB→256MBでほぼ半分のレスポンスタイムを得ることが出来ました。
但し確実にこの秒数内で帰ってくる保証はありませんのであしからず。
まとめ
最近のSaaS等では簡単にAPI連携等が行えるようになってきておりますが
サーバで処理させようとすると、新規で立てるにしても、間借りするにしても管理工数が掛かってしまうので
サーバレス構成で受けよう!というご検討が増えてくると考えております。
弊社ではそのような構成のご提案、PoCフェイズからの導入支援を行っておりますので
是非ご相談下さい。
https://www.skyarch.net/service/aws/introduction.html
参考Webサイト
https://qiita.com/suetake/items/3fc945a380af65ecf82d
ありがとうございます!