Mediumは、Twitterの共同創業者Evan Williams氏が立ち上げたオンラインパブリッシングプラットフォームだ。2012年にローンチされ、いまや月間ユニークビジターは6000万を超えている。このサイトのテクノロジースタックには、AWSへのデプロイ、NodeJSとGoで書かれたアプリケーションとサービス、DynamoDBによるデータストレージ、データウエアハウスとしてのAmazon Redshiftが含まれている。
元エンジニアリングヘッドのDan Pupius氏は、これらの技術選択についてブログで説明している。このサイトで行われている数千年に相当する読書時間を考慮して、大規模な運用の助けになるものを選択しているという。
現在、彼らの環境はAWS VPCにデプロイされており、インフラはAnsibleを使って設定されている。アプリケーション自体はEC2で動いている。
また、サービス指向アーキテクチャを採用しており、全体として1ダースほどのプロダクションサービスになっている。機能を新しいサービスにするか、それとも既存のサービスに組み込むかは、結合度や凝集度といった特性による。
メインの言語はNodeJSで、その主な利点は、サーバーとクライアントでコードを共有できることだという。シングルスレッドのイベントループをブロックすることで、パフォーマンスに問題が生じていたが、彼らはこれを、複数のインスタンスを実行することで回避している。高負荷のエンドポイントに対するトラフィックを特定のインスタンスにルーティングすることで、他のリクエストがハングするのを防いでいる。
Pupius氏によると、パッキング、ビルド、デプロイが容易なため、残りの補助的なサービスはGoで書かれているという。彼はGoを使う理由として、タイプセーフのようなものと冗長さがないことを挙げている。
私は個人的に、チーム環境で意固地な言語を使うのが大好きです。一貫性を改善し、あいまいさを減らし、最終的に自分勝手なことをしにくくするためです。
メインのデータストアはDynamboDBだが、Pupius氏によると、途中でいくつか問題があったという。主な問題はホットキーだ。分散データベースであるにもかかわらず、非常に多くのクエリが単一のノードにあるデータに対して実行され、データ分割から得られるパフォーマンス上のメリットがなくなってしまうのだ。Mediumの場合、キャッシュとしてRedisを使い、実際にデータベースにアクセスするクエリを大幅に削減することで、この問題を軽減している。現在、Mediumは今後のデータのためにAmazon Auroraで実験をしているそうだ。
人、投稿、タグの関係などの関係データには、Neo4Jが使われている。1つのマスターインスタンスと2つのスレーブインスタンスを使っているという。またデータウェアハウスには、Amazon RedshiftとクエリのためにApache Sparkを使っている。
Pupius氏によると、テスト、ビルド、ステージング環境へのデプロイは、Jenkinsを使って15分以内で完了するという。プロダクションへのデプロイは1日に5回ほど行われる。
継続的インテグレーションおよびデリバリーを採用しており、できるだけ素早くグリーンにするように努めています。
Mediumのチームは職務横断型で、どのエンジニアもスタックの一部で作業できるという。これが強力なエンジニアにつながっていると彼は考えている。
彼のブログ記事はオンラインで読むことができる。Mediumはフリーで利用することができる。
Rate this Article
- Editor Review
- Chief Editor Action