本をベースに独学時のつまずいたポイントを共有 - HITAMUKI
資格、受験、IT、経済、医療など様々な分野で独学している人が本をベースに情報を記録できる。
全部無料。
既存の読書ログサービスは、マークダウンに対応してないから作ってみた。
本のつまずきポイントが集約されれば、後から勉強する人にとって宝の山になるはず!
最終的に、本版のQiitaみたいなサービスになった。
システム構成
マークダウンエディタについて
マークダウンエディタは「tui.editor」を利用した。
マークダウンエディアは色々あるけど、「tui.editor」が一番組み込みやすかった。
なにより画像アップロードに簡単に対応できるのが素晴らしい。
デザインについて
デザインはbootstrapのサンプル改造した。
bootstrapに対する知識は全く無かったけど簡単に改造できた。
認証周りについて
フレームワークにLaravelを利用した。
最新版の5.8を利用すれば基本的な認証周りが実装済み。
ソーシャル連携はsocialiteを利用した。
あまりに簡単に実装できて感動した(笑)
はじめはfirebaseの利用を予定していたけど、カスタマイズ性が低くて却下した。
データベースについて
aws RDSを利用した。
auroraは月額費用が高いから、mysql版を利用した。
MYSQLのバージョンは5.7。
インスタンスタイプは「db.t3.micro」。
シングルAZ。
月額1500円くらいで済む。
PHP実行環境について
aws ECSを利用してコンテナベースでプログラムが動いている。
PHPのバージョンは7.2。
Fargateは使わずにEC2で動かしている。
インスタンスタイプ「t3.micro」。
月額が900円。
高速化のために工夫した点
すべて基本的な対応。
HITAMUKIでは、グローバル・ネットワーク越しにレイテンシがトップページで52msと非常に満足な結果が得られた。
OPcacheを有効にした
OPcacheを有効にするだけでレイテンシが全然違う。
PHPとmysqlの接続を永続化した
PDO::ATTR_PERSISTENT => true
このオプションを有効にする。
ベンチマークを取ると分かるが、コネクションを永続化しないとアクセスが増えた時にスムーズにスケールしない。
マスター系の情報をローカルのmemcachedに保存する
データのキャッシュに「Amazon 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に配置すべき。
※ただし可用性は落ちる
今後の課題について
とりあえずサービスはローンチできた。
まだ利用者が全然いないから、今後はサービスを広げていく事にフォーカスしたい。