ServerlessDaysでServerlessなパフォーマンスチューニングコンテストを開催しました #ServerlessDays

記事タイトルとURLをコピーする

このブログではお久しぶりです。照井(marcy_terui) です。

ServerlessDays Tokyo 2019、いかがでしたでしょうか?最高でしたか!? ServerlessDays Tokyoは過去最高のServerless系イベントになる(かもしれない)

私はServerlessconfとして開催されていた3年間はありがたいことに毎年スピーカーとして参加させていただいていましたが、今回は運営メンバーとして関わらせていただきました。

3年間続いた Serverlessconf が原点回帰しつつも大きな進化を遂げ、 ServerlessDays としてさらに最高のイベントとして生まれ変わったと感じています。スポンサー、スピーカー、参加者の皆様、本当にありがとうございました!!

さて、ここではDay1に行われたWorkshopコンテンツの一つである "Serverless Community JP presents, S.P.E.C. - Serverless Performance Empowerment Challenge" の開催レポートをお送りしたいと思います。

S.P.E.C. とは

Serverless Performance Empowerment Challenge の略で、Serverlessなシステムのユーザ体験とパフォーマンス向上を競うコンテスト形式のWorkshopです。このWorkshopは Serverless Community JP presents とついているように、スポンサーではなく、コミュニティがコミュニティのために行ったWorkshopです。ちなみに読み方はそのまま「スペック」です。

内容をかんたんに言うと、参加者には課題となるフルサーバレスで構築されたアプリケーションが渡され、それを制限時間内に如何に高速化するかを競うコンテストです。

参加者のアプリケーションに対してはベンチマーカーが稼働して継続的にリクエストを送信し続けます。これを如何に効率的かつ正確に処理していくかを競っていくわけです。

そのようなコンテストは有名なものではISUCONを始めとし、いくつかあるかと思いますが、そんな中でこのコンテストは何が違うかと言うと、システムの構成に制限がないことです。もちろん、ServerlessなのでEC2やECS(Fargate)は利用NGですが、それ以外はベンチマーカーのリクエストに正確に処理し、求められる結果を出すことができれば何でもアリです。

ただ、100%制限無しではさすがに競技が成り立たない可能性があるため、デプロイ方法などに多少の制約だけ設けました。

詳しいレギュレーションはこちら

また、ベンチマーカーは常に動き続けているということも一つの特徴でした。数分間のベンチマーカーの稼働中だけ高速に動作するのではなく、安定して高速に動作することを勝利条件としたかったためです。ただ、それによって大きな変更を恐れるようになってしまっては良くないので、一つ一つのシナリオは短くして一時的に失敗したとしてもすぐに取り返せるような形としたつもりでした(でしたというのは、それでもまだ難しい部分があったという反省点です・・・次に活かしたいと思います)

また、従来のパフォーマンスチューニングコンテストでは大量のトラフィックを限られたリソースでいかに捌くかというのが主なテーマでした。しかし、これはServerlessの世界になると「限られたリソース」という概念は完全ではないものの多くの場合に無くなります。 それによって、様々な制約から解き放たれる反面、分散を基本とするServerlessならでは制約によってインメモリでのデータ共有戦略などは効果が薄れ、現実的なアプリケーションの実装力と効果的なアーキテクチャを組む設計力を十分に奮って競うことができるのではないか?そんなコンテストをやってみたい!ということで、今回はじめて開催させていただくことになりました。

課題アプリケーション

今回の課題は「電子マネー管理サービス」でした。流行り?のキャッシュレス決済の一部を担うマイクロサービスをServerlessで構築したというシナリオです。 https://github.com/marcy-terui/spec2019-theme

システムの初期構成としては、API Gateway -> Lambda -> DynamoDBというごく一般的なWeb APIの構成になっています。

このテーマを選んだ理由としては、旬なテーマであることはもちろん、ServerlessでDynamoDBベースでも金銭を扱うような整合性や一貫性の担保を求められるサービスを作り上げることができる、また、そのようなお固めなシステムでも、構成を工夫して非同期処理化するような効率化の余地は十分にあるのだということを実感してもらいたかったという面があります。

そのため、課題のREADMEにも書いているように、初期状態は整合性が取れない異常なアプリケーションとなっていました。ベンチマークのシナリオも利用者同士が頻繁に電子マネーを交換するような積極的に整合性を崩していくシナリオとなっていました。 そういった形で、全ての参加者は初期状態で得点がマイナスされていくという鬼畜仕様の中、課題に取り組んでいきました。結果的には、一番最初にこれを適正化したチームがそのまま逃げ切りで優勝する形となりました。このあたりは、後半に行くにつれ並列度が上がっていき得点の獲得チャンスが増えたり、ベンチマーカーのシナリオがどんな場面を想定しているかなどといった仕様を徐々に公開する、といった施策は行っていて、実際に急激に追い上げるチームが出るなど白熱した場面もあったものの、それでも中々難しい部分があるなと反省点でもあります。

参加者用ポータル

参加者には下記のようなポータルが提供されました。競技に参加しているチームのランキングと得点、そしてベンチマーカーからの結果のメッセージをリアルタイムに見ることができます。

ちなみに、このポータルを作ったのは私ではなく、弊社の橋本(hassaku_63)です。Amplify + Vue.jsで実装され、AppSyncのSubscriptionを使ってリアルタイムに更新されるイケてるポータルです。ソースコードも後日橋本の方から公開される予定と聞いています。

また、技術サポートとしてServerless Days運営メンバーから中山さん(k1nakayama)も加わっていただきました。

やってみてどうだったか

本当にやってよかったと思います。また来年もレベルアップしてお送りしたいです。

今回は正直、競技中にいくつかトラブルがあったものの、そのトラブルすらも笑って楽しんでくれる温かい参加者様たちに救われました・・・ 競技中にその場でベンチマーカーを調整するという主催者側もスリリングでエキサイティングな場となりました(ホントにアカン、猛省すべき・・・) 最終的にはなんとか競技自体は成り立ったとは思いますし、今の所参加者の皆様から良いフィードバックをもらえていますが、反省点はいっぱいあるので、次に活かしたいと思います・・・!

とりあえずは次の2019/12/13(金)に行われる ServerlessDays Fukuoka のWorkshop Dayにて、コンテスト形式ではなくワークショップ形式で今回の課題をみんなで解こう!というようなことをやろうということになっています。興味がある方はぜひご参加ください!! https://fukuoka.serverlessdays.io/

ソースコードの公開について

ありがたいことに終了後に参加者の方から復習したい・社内でもやってみたいとといったお言葉や、参加できなかった方に個人的にやってみたいとソースコードの公開についてお問い合わせいただいています。

ベンチマーカーのソースコードについては皆様に安心してご利用いただけるようにしないとまずいと思うので、競技中に起こった問題などを場当たり的にではなく完全に直す必要があると思うので少し時間はかかるかもしれませんが、公開します。ポータルについても前述したように橋本の方から公開される予定と聞いていますので、少々お待ち下さい。

最後に

実装を手伝ってくれた橋本くん、中山さんはもちろん、サポートしてくれた運営メンバー、そして何より参加してくれた方々、皆様本当にありがとうございました!!

このコンテストは、私が自分で参加者としてやりたいがために立ち上げたので、次は自分も作ってみたい(そしてその次は中心となってやりたい)という方は是非ご連絡を!!