Edited at

本版のQiitaみたいなサービスを立ち上げた


本をベースに独学時のつまずいたポイントを共有 - HITAMUKI

https://hitamuki.me

資格、受験、IT、経済、医療など様々な分野で独学している人が本をベースに情報を記録できる。

全部無料。

既存の読書ログサービスは、マークダウンに対応してないから作ってみた。

本のつまずきポイントが集約されれば、後から勉強する人にとって宝の山になるはず!

最終的に、本版のQiitaみたいなサービスになった。


システム構成


マークダウンエディタについて

マークダウンエディタは「tui.editor」を利用した。

https://github.com/nhn/tui.editor

マークダウンエディアは色々あるけど、「tui.editor」が一番組み込みやすかった。

なにより画像アップロードに簡単に対応できるのが素晴らしい。


デザインについて

デザインはbootstrapのサンプル改造した。

https://startbootstrap.com/templates/

bootstrapに対する知識は全く無かったけど簡単に改造できた。


認証周りについて

フレームワークにLaravelを利用した。

https://laravel.com/

最新版の5.8を利用すれば基本的な認証周りが実装済み。

ソーシャル連携はsocialiteを利用した。

https://laravel.com/docs/5.8/socialite

あまりに簡単に実装できて感動した(笑)

はじめはfirebaseの利用を予定していたけど、カスタマイズ性が低くて却下した。


データベースについて

aws RDSを利用した。

auroraは月額費用が高いから、mysql版を利用した。

MYSQLのバージョンは5.7。

https://aws.amazon.com/rds/

インスタンスタイプは「db.t3.micro」。

シングルAZ。

月額1500円くらいで済む。


PHP実行環境について

aws ECSを利用してコンテナベースでプログラムが動いている。

PHPのバージョンは7.2。

https://aws.amazon.com/ecs/

Fargateは使わずにEC2で動かしている。

インスタンスタイプ「t3.micro」。

月額が900円。


高速化のために工夫した点

すべて基本的な対応。

HITAMUKIでは、グローバル・ネットワーク越しにレイテンシがトップページで52msと非常に満足な結果が得られた。


OPcacheを有効にした

https://www.php.net/manual/en/book.opcache.php

OPcacheを有効にするだけでレイテンシが全然違う。


PHPとmysqlの接続を永続化した

https://php.net/manual/en/pdo.connections.php

PDO::ATTR_PERSISTENT => true

このオプションを有効にする。

ベンチマークを取ると分かるが、コネクションを永続化しないとアクセスが増えた時にスムーズにスケールしない。


マスター系の情報をローカルのmemcachedに保存する

データのキャッシュに「Amazon ElastiCache」とか使いたくなる。

https://aws.amazon.com/elasticache/

ただ、マスター系の情報はローカルにキャッシュするのが最速。

極力外部リソースの利用を避けた方がレイテンシが小さくなる。

よって、ECSクラスタインスタンスにnginxとphp-fpmと一緒に、memcachedのコンテナを同居させた。


外部リソースのアクセスを極力減らした

レイテンシを減らす上で重要なのが、極力mysqlへのアクセスを減らすこと。

例えばループで必要な情報を都度mysqlから取得するのは最悪。

そういうケースではin句を使って一括で情報を持ってくるべき。

ただし、注意しないといけないのが、ビジネスロジックをmysql側に持たせないこと。

ストアード・プロシージャーを使うと最悪。

メンテナンスコストが激増してしまう。


laravelを本番環境にむけて最適化

[Laravel]デプロイ時の最適化

https://qiita.com/qiita-kurara/items/d37dbc5b67e6b6dfbe1d


すべてのリソースを同じAZに配置する

日頃ゲーム会社でシビアなレイテンシを求められる。

awsを利用する際に、multi-AZを推奨されるがこれには落とし穴がある。

webサーバーとDBサーバーが異なるAZとだと、ベンチマークの時にはっきりとレイテンシが大きくなる。

最速を目指すのであれば、すべてのリソースは同じAZに配置すべき。

※ただし可用性は落ちる


今後の課題について

とりあえずサービスはローンチできた。

まだ利用者が全然いないから、今後はサービスを広げていく事にフォーカスしたい。