スマートホームスキルのレイテンシーを低減するためのベストプラクティス

Michael Williams Jan 08, 2021
Share:
Smart Home Skills Tips & Tools Smart Home API
Blog_Header_Post_Img

このブログはBest Practices to Reduce Latency on your Smart Home Skillを翻訳したものです。

Alexaスキルでは、応答までの速さが重要になります。ユーザーがスキルを使用してスマートホームデバイスを制御するとき、ユーザーはすぐに応答が得られることを期待しています。スキルのレイテンシーが高いと、ユーザーが離れ、評価が低下する可能性があります。  以下に、スマートホームスキルのパフォーマンスを向上させるための9つの推奨事項をご紹介します。

簡単に実施できる対策

1.      スキルのLambda関数のメモリ割り当てを512MB RAM以上に調整するメモリの割り当てを増やすことで、Lambda関数に提供されるCPUパワーが大きくなり、実行速度が向上します。スマートホームスキルの場合は、少なくとも512MB RAMをスキルのLambda関数に割り当てることが推奨されています。

メモリ割り当てをさらに最適化するために、以下もご検討ください。

a)  スキルで使用される最大メモリを分析するAWS CloudWatchログを参照することで、Alexaスキルで使用されるメモリを分析できます。「Max Memory Used」フィールドを分析すると、関数に割り当てるメモリを増やす必要があるか、関数のメモリサイズが過剰にプロビジョニングされているかなどを判断できます。スキルが呼び出されるたびに、以下のような「REPORT」エントリがCloudWatchログに作成されます。

REPORT RequestId: 3604209a-e9a3-11e6-939a-754dd98c7be3 Duration: 12.34 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 18 MB

b)  Lambda関数のロードテストを実施する最適なタイムアウト値やメモリ値を判断するには、関数の実行時間を分析すると良いでしょう。これにより、サービスからの応答を待つ間に関数で発生する可能性のある依存関係の問題を発見できます。この問題を解決しないと、関数の同時実行が想定以上に増加することがあります。これは、Lambdaのスケーリングを処理しない可能性のあるリソースに対してLambda関数からネットワーク呼び出しを行う場合には特に重要です。スケーリングの詳細については、こちらをご覧ください。

 

2.      高レイテンシーの原因となっている制御エラーを特定して修正する: CloudWatchメトリクスを使用することで、失敗しているLambdaリクエストを詳しく調査できます。Lambdaリクエストが失敗すると、Alexaがユーザーに応答できるようになるまでに8秒の待機時間が発生することがあります。これは、スキル全体のレイテンシーに影響するだけでなく、ユーザーに対する応答時間の遅延にもつながります。成功と失敗の内訳を表示するには、Lambdaウィンドウ内のモニタリングタブを選択します。

ERROR

リクエストが失敗した時間帯を特定し、CloudWatchログを詳しく調査することで、それらのリクエストが失敗した理由を確認できます。

cloudwatch

3.      Alexaに応答する前に同期データベース呼び出しが行われないようにする: たとえば、Alexaに応答する前にデータベースを更新しないようにします。これらはいずれも非同期的に行う必要があります。Alexaに応答する前にこれらの呼び出しが同期されたままであると、Alexa、さらにはユーザーへの応答に遅延が発生します。

4.      リージョンをまたぐ呼び出しを避ける レイテンシーの一因となる地理的距離と、Alexaサービスでサポートされているリージョンに基づいて、Lambda関数とメディアサービスを追加のリージョンに配置することをお勧めします。北米とヨーロッパでサービスを提供している場合、AWSでは少なくとも バージニア北部(us-east-1)、ダブリン(eu-west-1)、オレゴン(us-west-2)の3つのリージョンをサポートする必要があります。Lambdaでサポートされているリージョンの一覧は、AWSウェブサイトをご覧ください。サービス間の距離はレイテンシーの要因となるため、レイテンシーを低減するには、HTTP呼び出しがリージョン内で行われるようにすることが重要です。

5.      Amazon Simple Queue Serviceの値を最適化する: Amazon Simple Queue Service(SQS)をイベントソースとして使用している場合は、関数の予想実行時間の値がキューの可視性タイムアウト値を超えないようにします。これは、CreateFunctionとUpdateFunctionConfigurationの両方に当てはまります。AWSでは、設定されたタイムアウトを過ぎた関数はすべて終了されるため、発話が誤ってエラーとなります。

6.      AVデバイスにWake-On-LANコントローラーを実装する: TVなどのAVデバイスのスタンバイモードでは、デバイスを起動させてコマンドを呼び出すまでに時間がかかることがあり、これがレイテンシーの原因となることがあります。Wake-On-LANコントローラーを実装すると、低電力モードでデバイスの電源を入れることができ、Alexaリクエストを受信したときに、クラウドを使用してデバイスを起動するか、WoLプロトコルを使用してAlexaにリクエストを実行させるかを決定することができます。Wake-On-LANコントローラーの詳細については、こちらをご覧ください。

Lambdaのレイテンシーへの対応

いずれのAlexaスマートホームアーキテクチャーについても、AWS Lambdaインスタンスがレイテンシーやコントロールエラーの別の発生源となっていることがあります。以下の推奨事項を実施することで、Lambdaで発生しているレイテンシーを低減できる場合があります。

7.      実行コンテキストを再利用して関数のパフォーマンスを向上させる: 実行コンテキストの起動(「コールドスタート」といいます)には時間がかかることがありますが、関数を初めて実行する前には必須の処理となります。Lambda関数を初めて呼び出すときは、「ブートストラップ」が完了するのを待つ必要があります。

SDKクライアントやデータベース接続を関数ハンドラーの外側で初期化し、静的なアセットをローカル(/tmpディレクトリ)にキャッシュします。同じ関数インスタンスで処理される後続の呼び出しでは、これらのリソースを再利用できます。これにより、実行時間とコストを節約できます。呼び出し間でデータが漏えいする可能性をなくすために、ユーザーデータやイベント、またはセキュリティに影響を与えるその他の情報を保存する際は、実行コンテキストを使用しないようにしてください。ハンドラーのメモリ内に保存できない変更可能な状態に関数が依存している場合は、ユーザーごとに個別の関数または個別のバージョンの関数を作成することをお勧めします。Lambdaのベストプラクティスの詳細については、こちらをご覧ください。

 

8.     依存関係の複雑さを最小限に抑える: フレームワークがシンプルであればあるほど、実行コンテキスト起動時のロードは高速化されます。以下の方法で、Lambdaをシンプルにすることができます。

  • Spring Frameworkなどの複雑なフレームワークよりも、DaggerやGuiceなどのJava依存性注入(IoC)フレームワークを使用する。
  • 最新のパッケージを使用する。
  • 数キロバイトの関数となるように関数をJARにパッケージ化する。
  • 使用されていないLambdaを削除し、デプロイパッケージのサイズを増大させているデッドコードをなくす。

 

9.      Lambdaに再帰コードを含めないようにする: 再帰コードにより、関数の呼び出しが意図せずに多くなったり、コストが上昇したりすることがあります。

さっそく始めましょう

Alexa Skills Kitコンソールを開いて、スマートホームスキルを管理しましょう。

Subscribe