株式会社ユーザベースの技術チームブログです。開発を担当している杉浦です。NewsPicksはおかげさまでユーザ数が20万を突破しました。サービスが順調に成長するということは大変にうれしいことなのですが、エンジニアとしては負荷との戦いになったりします。我々も例に漏れず日々、負荷との戦いを強いられています。NewsPicksの機能面の特長として次の2つがあります。・フォローしているユーザのPickが自分のタイムラインに集約される・各カテゴリで話題になった記事を閲覧できるこれらの機能を高速に処理・実現するためにRedisを採用しているのですが、ユーザ数の増加による負荷増加によって問題が発生するようになりました。・ユーザ数が増える中でRedisにどのような問題が発生したか・ソースコードを読みながら問題の原因を考える・そして、どのような対応を行っているかを共有したいと思います。どのような問題が発生したか主に2つの問題が発生しました。ピーク時のレスポンスタイムが遅くなるNewsPicksは朝の8時にその日の注目ニュースをPush通知で送信します。その直後が最大のピークタイムになり、平常時の10倍程度のリクエストを処理する必要があります。ピークタイムに画面表示のレスポンスタイムが悪化するという問題が発生しました。夜間バッチ実行時にslaveとのレプリケーションが切れる夜間にRedisに保持している古いタイムラインデータを削除するというバッチが実行されるのですが、バッチによる大量のデータ更新が発生しレプリケーションのタイムアウト値を越えてしまい、レプリケーションが切れるという障害が発生しました。ソースコードを読みながら問題の原因を考えるなぜこのような問題が発生するようになったのでしょうか。原因を知るにはRedisのアーキテクチャを理解する必要があります。ソフトウェアのアーキテクチャを理解する近道はいつの時代もソースコードを読むことです。ファイル数が少なくシンプルなソフトウェアということがわかります。理解をしやすくするために、おおまかな機能ごとに整理します。読み進めると、RedisはI/O戦略としてイベントループモデルを採用していることがわかります。イベントの発火時に各コマンドハンドラーが呼ばれて処理が進められています。2006年の古い記事ですがよくまとまっていて、今読んでも本質的な部分は変わっていません。イベントループモデルのメリットは以下が挙げられます。処理ごとにスレッド/プロセスを用意しないので使用メモリ量を抑えられるスレッド/プロセス切り替えのコンテキストスイッチのオーバヘッドが少ないノンブロッキングI/Oを合わせて採用することで、I/O待ち時間に他の処理が行われる逆に、デメリットは以下のようなものがあります。1スレッドでループ処理を行うので、マルチコアのサーバの場合に全てのCPUリソースを使い切らないRedisはデータを全てメモリ中に持つため、高速に処理を行いますが、それでもRedisの利用度が上がってくると、Redisの能力を越える多量の読み書きが実行される時がやってきます。Redisはイベントループモデルの特性から、閾値を越えると一気に処理遅延が発生します。NewsPicksが遭遇した問題はまさにこの事象で、あるタイミングを境に突然問題が発生するようになりました。システムのアーキテクチャを考える際に負荷に合わせてタイミング良くスケールアウトしていくことができる仕組みを作ることが大切です。Nginx、Node.jsも同様にイベントループを採用しているので、同じ考え方を適用できると思います。NewsPicksではどのような対応を行っているか現在、データのシャーディングと、垂直・水平に処理リクエストを分散をするように対応を進めています。タイムラインデータについては、一定のユーザ数毎にデータ保存するサーバを分離しています。一般的にユーザパーティショニングによる垂直分散と呼ばれる手法です。ランキングデータについては読み取りリクエストをslaveに分散させるといった水平分散の対応を行っています。BOTをつくってみたはじめまして。NewsPicks技術チームの井原です。ユーザベースのデザイナー、広田です。»プロフィール『経済情報で、世界を変える』をミッションに、企業・業界情報プラットフォーム「SPEEDA」やソーシャル経済ニュース「NewsPicks」、ABMを強力にサポートする「FORCAS」、スタートアップの情報収集を圧倒的効率化「entrepedia」などを提供する株式会社ユーザベースの技術チームブログです。多国通貨」をハンズオンしたら快適で楽しかったGo言語でオブジェクト指向プログラミングの基本(型編)月別アーカイブ検索@Uzabase_Techさんのツイートスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。