読者です 読者をやめる 読者になる 読者になる

DELiGHTWORKS

DELiGHTWORKS株式会社の開発に関する情報を発信していきます。

48時間後…

こちらは48時間後に突然サービスが瞬断される状況が頻発し、生きた心地がしなかった、という備忘録です。

AWS Summitでお話しさせて戴いたAWSへの移行ですが、その中にAuroraは出てきませんでした。しかし、実際にはFate/Grand Orderは一度Auroraへ移行をしていました。そして、再度RDSに切り戻しています。

こちらに関して既に問題は解決してはいるのですが、こんなこともあったということで知見を共有させていただきます。

4月末、私たちはRDS(MySQL)をAuroraへ移行しておりました。これはDBの分割前に行った対策になり、暫くは問題無く稼働していました。

しかし、稼働から48時間後突然のスパイク(アクセス障害)が訪れました。これに関してはまさに「この瞬間には何もしていない」のに発生したスパイクで、アクセス数が急増した訳でもなかったため、解決には非常に困難を極めました。

原因はAuroraにあることは明らかですが、原因が思い至りません。

こちらに関してあらゆるパラメータの精査、MySQLコネクター周りの実装確認、かつ自社側のプログラム側の確認、を行いましたが解決出来ず結果としてRDS(MySQL)への切り戻しを行いました。

 

その後、調査を進め私たちは問題を突き止めることができました。

問題は何だったのでしょうか?

答えはRDS(MySQL)への切り戻しのために設定したbinlog(バイナリログ)でした。

この時期のAuroraはbinlogをPurgeする際に「Init DB」という高負荷のクエリが頻発し、サービスが瞬断される症状があり、Purgeが走り始める48時間後に突然性能が低下し、問題が発生したのです。

(Fate/Grand Orderではbinlogの保持期間を48時間に設定していたため)

なお、この問題に関してはEfficient Storage of Binary Logsという変更が入り、解消されていますが、この時点ではこの変更はlab mode(実験中)でしか提供されておらず、問題となったのでした。

 

Auroraの使い方につきましては、

http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Aurora.Replication.CrossRegion.html

の “Before You Begin”に”you must be running the most recent version of the Aurora database engine"

とあるように、最新のバージョンを利用することが推奨されています。

なので、皆さんは是非最新をご利用下さい。

 

既に問題は発生しませんが、リリースされているEfficient Storage of Binary Logsの変更に関してはこちらをご覧下さい。

https://forums.aws.amazon.com/ann.jspa?annID=3793

 

ということで、48時間後に突然の障害に見舞われたお話でした。

このような障害も時にはありますので、いつでもインフラは気を抜けません。

このときは直ぐには原因が思い至らず、本当に冷や汗が出ました。

元々切り戻しのためのbinlogに対する障害なので本末転倒感がありますが、切り戻しで解決したときは胸をなで下ろしたものです。

やはり何事にも準備が必要ですね。

……が、より快適に遊べるゲームを目指し再度Auroraへの移行を行う予定です!

AWS Summit 2016で登壇致しました

Fate/Grand Orderの事例に関しまして、AWS Summit 2016で登壇を行いました。

お越し戴いた皆様、誠に有り難うございました。

こちらのスライドですがあまりにも多くの事があったため、時間内にすべてを入れ込むことが出来ず、こちらにはまだ続きがあります。別の機会にはログ解析や、Amazon Auroraに関してもお話できればと考えております。改善に関しても継続して行っておりますので、それらに関してもお話する機会を得られれば幸いです。

また、インフラエンジニアが今も不在ではないか、というご指摘を受けましたので補足を致しますと、現在はスライドの中にも登場する株式会社スカイアーチネットワークスさんのインフラエンジニアさんと、社内のインフラエンジニアで一緒に運用をしております。クライアントやサーバーのエンジニアに関しましても、一緒に開発をしたいという仲間が続々と集まっております。

ただ、引き続き募集はしておりますので、どうか宜しくお願い致します!

こちらは頂きました記念品です。

f:id:delightworks:20160609102519j:plain

Amazon様、登壇の機会を戴き誠に有り難うございました。

また、改めまして講演を聴講戴いた皆様も本当に有り難うございました。

ディライトワークスではAWSを利用しています

あけましておめでとうございます。ディライトワークスの磯波です。

AWSへ移行致しました

昨年、私たちが開発しているゲームをAWS(Amazon Web Services)へと移行致しました。

ゲームを遊んで頂いている皆様にはご心配、ご迷惑をお掛け致しました。

当初の想定よりもより多くのユーザーの皆さんに遊んで頂くことができ、以前の環境でも最高スペックのサーバーとデータベースを用意していたのですが、それでも通信が詰まってしまうという現象が発生しておりました。

それに対応すべくプログラムの最適化を進めてはいたものの、ユーザーの皆さんにより快適に、安定して遊んで頂けるように総合的な判断としてAWSを選択致しました。

AWSに移行することで、よりスペックの高いサーバー構成に変えることができ、今回は倍以上のスペックへと変更致しましたが、さらに良いパフォーマンスの環境への移行を検討しています。

以前の環境では、用意されているスペックなどが現状に見合わず、性能を引き出すことも出来ていませんでした。

AWS のEC2インスタンスを使うことで数分でサーバー台数を増やすこともでき、サーバーやデータベース、メモリキャッシュのスペックも柔軟に対処することができます。

これでアクセスが集中しがちなイベントでも対処ができるようになります。

これはゲームの幅が広がることでもあり、アイディアを形にしやすくなるということでもあります。

また、サーバー管理の方法を全面的に見直し、以後も構成を最適化していくことを検討しています。

検証に際して

検証に関しては既にリリースをされている検証用のアプリと、既にリリース済みのアプリの両方での動作検証を行いました。

実際にクライアントアプリにとってはサーバーはAWSだろうと以前の環境だろうと同じように同じデータを返してくれれば構いません。

その検証をするために、iPhoneやAndroidをPCのプロキシ経由でネット接続するようにし、PCのhostsを書き換えて新しいサーバーにAPIを向けることで検証を行いました。

こちらは思いの外うまくいき、既に皆さんのお手元にある既にリリースされたアプリがAWSのゲームサーバーでもうまく動作することが確認できたわけです。

(寧ろ、うまく動きすぎていて内心はドキドキしていました)

マネージドなサービス

AWSはRDSという強力なマネージドデータベースを持っています。

高速なストレージを持ち、加えてデータも高い冗長性を持っています。

ElastiCacheも同様にマネージドなインメモリキャッシュです。

双方に備わっているMulti-AZという仕組みは1つのデータセンターが津波や地震に襲われたとしても、もう1つのデータセンターがデータを保全し、かつサービスも止めないようにしてくれるという仕組みとなっています。

これらの仕組みによって、皆さんのデータを守り、ゲームを快適に遊び続けられる事を担保していきたいと考えております。

開発者にとってのメリット

また忘れてはいけないのは、今後のエンジニアのスキルとしてクラウドコンピューティングが欠かせないということです。

以前はオンプレミスのサーバーでは、サーバーを担いでデータセンターに持っていき、サーバラックに突っ込むなんていう運用もありました。

寒いサーバールームで必死に対応した、なんて思い出をお持ちの方も多い筈です。

しかし、これらの思い出話は苦労話としては成り立つでしょうが、以後役に立つ経験値とは言いがたいはずです。

5年後、10年後、もっとゲームは進化するでしょう。その時に、サーバーを担いでデータセンターに向かう経験よりも役に立つ開発経験があるはずです。

また、今ではクラウドを徹底的に活用することで、開発者がゲームを面白くする、快適に遊んで頂くというところに集中できるようになりました。

最後に

ということで、お時間を戴いてしまいましたが移行したサーバーが年始年末も安定して動作しており胸をなで下ろしています。

今年も何かとあるかとは思いますが、何卒宜しくお願い致します。

そして、ディライトワークスはエンジニアを積極的に採用中です。

もしご興味があればお気軽にご応募ください。

オブジェクト指向は衰退しますか?

最近はGolangをさわり始めている磯波です。

IT業界やゲーム業界でもオブジェクト指向が持てはやされた時期がありました。

ファイナルファンタジーIからファイナルファンタジーIIIまでを開発していた天才プログラマ、ナーシャ・ジベリさんがファミコン上でのアセンブリでオブジェクト指向を用いていたなどという逸話もあります。

アセンブリが全盛であったころは難しかったものの、ハードウェアの進歩はめざましくゲーム業界でもC言語やC++を用いたオブジェクト指向プログラミングが盛んにおこなわれてきました。

昔はメモリ食いで実行も遅いということで嫌われていたんですけど、時代は変わるものです。

オブジェクト指向=クラス

オブジェクト指向とは「振る舞い」であるという話を聴いたことはないでしょうか?

確かにオブジェクト指向言語と呼ばれるものはクラスベースで開発されているものが多いです。

クラスが存在しないJavaScriptやLuaのような言語はプロトタイプベースではありますが、プロトタイプを用いた擬似的なクラスのようなものをつかってオブジェクト指向を実現します。

では、クラスやプロトタイプという概念がないGolangはオブジェクト指向言語ではないのでしょうか?

インターフェイスで会話をすること

代わりにGolangはインターフェイスという仕組みを持っています。

これはまさしく「振る舞い」の為の機能です。

ダックタイピングという言葉を聞いたことがないでしょうか?

「もしもそれがアヒルのように歩き、アヒルのように鳴くのなら、それはアヒルである("If it walks like a duck and quacks like a duck, it must be a duck")」という意味です。

「それ」(=オブジェクト)が、アヒルのように歩き、アヒルのように鳴けるのであれば、例え腕が4本あろうと、足が8本だろうと、双頭であろうとアヒルとして扱っても良いという意味です。

プログラムの用語に置き換えるのなら、「インターフェイス」が適切に実装されているのであれば、どんなものもアヒルのように振る舞うことができる、という意味です。

この例であれば、「歩く」と「鳴く」ということが出来るのが「アヒル」としたとき、その2つが「適切に」行えるマンティコアが渡されても実行できるという意味です。

ideone、なかなか便利なので良かったらためしてみて下さい。

これだとマンティコアがアヒルのように歩いたり鳴いたりすることがわかると思います。

Golangという言語

長い間CやC++を使ってきた人間からすると、Golangはなかなか愉快な言語です。

今までの言語とは明確に違った特徴を持ちながらも、どこか懐かしさすら憶える言語です。

それでいて、コンパイルできる言語ですから速度的にもスクリプト言語に比べて非常に有利でかつ、マルチプラットフォームで動作します。

簡単なツールをつくるのであれば十分な実力を持っている言語だと思います。

良かったら皆さんも触ってみて下さい。

様変わりするゲーム業界の中で生き残るためにエンジニアができること

ディライトワークスの磯波です。

最近は、色々なエンジニアと話をする機会があり、特に若いエンジニアと話をするとき、今の開発者を取り巻く環境というのは本当に様変わりしたんだな、と感じることがあります。

ムーアの法則に立ち向かえ?

例えば私の開発デビュー作はゲームボーイカラーでした。

CPUは8MHz、メモリは32KB、カセットの容量は最大8MBです。

皆さんはiPhone6sがどんなスペックかご存じですか?

CPUはデュアルコアの1.85GHz、メモリは2GB、ストレージは最大128GBです。

CPUは231倍、

メモリは62,500倍、

ストレージは16,000倍です。

大昔は1バイトを必死で節約していたのが夢のようですね。

こんなに環境が違うのであれば技術も随分と違うものだと感じるでしょう。

それはその通りで、遙か昔に使えた技術も、今では使えないことが沢山あります。

いつまでも通用するスキルを身につけること

ただ、そういった中で今でも生き続ける技術があります。

それは、

・コンピュータサイエンスの知識

と、

・積み重ねて来たゲームの経験と知識

です。

私が思うに、良いゲーム=良いコードというわけではありません

どんな綺麗に書かれたコードもそのゲームの面白さを保証してくれはしないのです。

そして、私たちそれでも次こそはもっとうまく作ろう、全体を考えて設計しようと思います。

ですが、ゲーム開発は多くの場合、始まったときに完成形が見えておらずに「面白いゲーム」を目指して四苦八苦することになります。

次はきっと最高の開発をしてやろうと思う事

では、私たち開発者はどこに経験や知識を用いるのでしょうか?

良いコードとは、何かを変更したときにそれが即座に全体に馴染むコードだと考えています。

言葉を変えて言うと、技術とは「おもしろさ」をいかにコスト少なくこねくり回せるか、ということです。

ゲームには変更がつきものなのです。

誰だって「無茶苦茶面白いことを考えたんだ!」といって飛び込んできたゲームデザイナーに対して「それできないよ、だって想定になかったし」とは答えたくないですよね。

私はゲームデザイナーの思いつきを面白さに変えるのが良い技術なんだと思います。

Unityのようなゲームエンジンが全盛期であっても、ゲームエンジンがゲームを考えてつくってくれる訳ではありません。

Unityに使われずUnityを使いこなすにはしっかりとした経験が必要なのです。

ゲームエンジンはゲームを設計してくれはしないですからね。

より多くのコードを書き、より多くの経験を重ねることで、より良いゲームの設計を作れるようになります。

 

ディライトワークスでは、技術に使われるのではなく技術を使いこなすエンジニアを募集しています。

「ゲームエンジン・アーキテクチャ 第2版」とても良い本なのでもし機会があったら読んでみてくださいね。

 

ゲームエンジン・アーキテクチャ 第2版

ゲームエンジン・アーキテクチャ 第2版

 

 

ディライトワークスを支える技術

はじめに

ディライトワークスのエンジニアの磯波です。

この記事では、ディライトワークスの中で使われているエンジニアリングについて紹介させていただきたいと思います。

技術

ディライトワークスでは、クライアントの技術としてUnity(C#)、

サーバーの技術として.NET Framework(C#)を利用しています。

なぜC#なのかということには理由があります。

その最も大きい理由として「最新鋭の言語」であるということです。

C#という言語の出自には非常に面白い経緯があり、主要な開発陣は元々はBorlandという会社のDelphiという言語を開発していた人たちです。

構文やフレームワーク構成に関しても、Javaに近いように見えるかもしれませんが、実際には1995年に生まれたDelphiという言語に準じています。

かといって、決して古くさい言語ではありません。

なぜならC#として作り直されたときに洗練され、かつ進化しているからです。

故に古い歴史をもち、かつ今でも最新鋭の機能を取り込み続けている言語なのです。

なぜC#なのか?

上記の通りC#は進化し続ける言語です。

今年も6.0がリリース(2015年7月20日)され、様々な機能が導入されました。

いまゲーム開発では非常に高い水準の技術が求められています。

その中で、言語が進化し続けるということは非常に優れた強みと言えます。

どんどんプログラマは楽になっていく訳ですから。

そして、Unity上でも動作し、ASP.NETでサーバーでも動作する、また、WPFによるツール開発にだって使えます。

あらゆる状況で一流の仕事ができる言語というのはC#をおいて他にはありません。

私たちはC#に拘ることで最高のものを最速のスピードで生み出すことを心がけています。

Visual Studio + ReSharper

かつてVisual StudioはVisualではない、なんてことを言われた時代もありましたが、今は違います。

非常に強力なIntelliSenseを持ち、使い勝手の良い最強のエディタであると言えます。

また、ディライトワークスではReSharperを用いることで、更に優れたIDEとなっています。

それに加え、これらを動作させるPCにも拘りを持ち、27インチディスプレイを複数用意し、最新のWindowsとMacを取りそろえています。

C#という強力な言語に加え、Visual Studio + ReSharperという強力な環境、そして強力なPC。

これらの環境が面白いゲームを生み出す手助けになると信じています。

f:id:delightworks:20151016154101j:plain

DELiGHTWORKS Framework

ディライトワークスでは、ガリガリにフルスタックのフレームワークを構築し開発している、という訳ではありません。

個人の自主性を尊重し、独りよがりのコードでなく使いやすいものであればそれをどんどん導入することを文化としています。

とはいえ、カオスになることを防ぐため定期的なレビューとリファクタリングを行うようにしています。

開発環境を取り巻く技術

ソースコードのバージョン管理にはGitを利用しており、

データベースはMySQL + Redisを使用し、負荷計測にはNew Relicを用いています。

また、KPIの測定にはFluentdを用いたログ収集に加えBigQueryとModeAnalyticsという環境を使っています。

これに止まらず、ゲームを遊んで下さるユーザーさんに向けてより快適なものを提供できるよう、日々環境を整えていきます。

f:id:delightworks:20151016160523j:plain

開発者を募集しています

ディライトワークスでは今の自分に満足しておらず、新しいことに挑戦してみたい開発者を募集しています。

特に今やっていることがルーチンワークになってしまい、新しい事にチャレンジできていないという方を歓迎します。

いまのディライトワークスは決して完成された状態ではなく、皆で一緒に環境を作り上げていっている状態です。

目の前の仕事をやるだけではなく、やらなければいけないことを見つけ、状況にあわせて自分の為すべきことを為せる人たち、そんな人たちと一緒に仕事をしたいと考えています。

f:id:delightworks:20151016160518j:plain