最近、Azure Functionsのお勉強をチマチマと始めました。色々と分からないことが多かったのでお勉強メモをまとめて記します。
どこまで続くかわからないお勉強メモ。今日は8回目です。今回はBlob Storage出力バインドを使った実装の続きです。過去のものは以下を参照。
- Azure Functionsのお勉強メモ(1)TypeScriptでチュートリアルを実施する - miyohide's blog
- Azure Functionsのお勉強メモ(2)Spring Cloud FunctionでHTTP Triggerを実装する - miyohide's blog
- Azure Functionsのお勉強メモ(3)Spring Cloud FunctionでTimer Triggerを実装する - miyohide's blog
- Azure Functionsのお勉強メモ(4)RubyでHTTP Triggerを実装する - miyohide's blog
- Azure Functionsのお勉強メモ(5)カスタムハンドラーを使ってRubyでTimer Triggerを実装する - miyohide's blog
- Azure Functionsのお勉強メモ(6)Blob Storage出力バインドを使ってBlobにファイルを出力する - miyohide's blog
- Azure Functionsのお勉強メモ(7)Blob Storage出力バインドを使ってBlobにファイルを出力する その2 - miyohide's blog
出力するファイル名に日時情報を付与する
前回まではBlob Storageに出力するファイル名が固定化したものでしたが、これに日時情報を付与したいと言うことはよくあります。これを実現するためには、バインド式というものを利用すると良さそうです。
日時のフォーマットは変えたいことがよくあるかと思います。フォーマットはここに載っているものが使えるようです。
Javaの場合は、以下のように実装すると良さそうです。
@BlobOutput(name = "target", path = "myblob/{DateTime:yyyy}/{DateTime:MM}/{DateTime:dd}/{DateTime:hhmmss}-sample.txt") OutputBinding<String> outputItem,
Azure StorageのBlobは以下のページ内の記述のように、フラットなパラダイムで組織化されます。
ただ、上記のように仮想的なフォルダを作成することはできます。上記の例では「年」/「月」/「日」という仮想的なフォルダを作成して以下にファイルを作成しています。実際にAzure Functionsのアプリを動かしたら以下のようにファイルが作成されました。
日時情報は東日本リージョンでも日本時間(JST)ではなく、UTCのようです。
負荷をかけてみる
この状態でabコマンドを使って負荷をかけてみます。結果としては、以下の通りでまだ失敗するリクエストが発生します(Failed requestsが0でない)。
Concurrency Level: 10 Time taken for tests: 51.195 seconds Complete requests: 1000 Failed requests: 45 (Connect: 0, Receive: 0, Length: 45, Exceptions: 0) Non-2xx responses: 45 Total transferred: 237641 bytes HTML transferred: 31515 bytes Requests per second: 19.53 [#/sec] (mean) Time per request: 511.945 [ms] (mean) Time per request: 51.195 [ms] (mean, across all concurrent requests) Transfer rate: 4.53 [Kbytes/sec] received
ランダムな文字列をファイル名に付与する
秒単位の日時情報だけでは複数のインスタンスで重複してしまうことがあるので、ランダムな文字列をファイル名に出力したいところです。これも先ほどのバインド式にある{rand-guid}を使えばできそうです。
Javaでの実装では以下のようになります。
@BlobOutput(name = "target", path = "myblob/{DateTime:yyyy}/{DateTime:MM}/{DateTime:dd}/{DateTime:hhmmss}-{rand-guid}-sample.txt") OutputBinding<String> outputItem,
実行する
再度abコマンドを使って負荷をかけてみます。結果は以下の通り。
Concurrency Level: 10 Time taken for tests: 43.493 seconds Complete requests: 1000 Failed requests: 0 Total transferred: 239753 bytes HTML transferred: 33000 bytes Requests per second: 22.99 [#/sec] (mean) Time per request: 434.925 [ms] (mean) Time per request: 43.493 [ms] (mean, across all concurrent requests) Transfer rate: 5.38 [Kbytes/sec] received
Failed requestsが0であることから失敗はなさそうです。
出力されたファイルを確認してみます。GUIDを付与しているのでやたらと長いですが、同一日時(ファイル名の先頭六文字が一致している)で複数のファイルが出力されていることがわかります。