FastComments.com Blog
🇯🇵 â–Œ
🇺🇞
English
English
🇧🇬
БългарскО
Bulgarian (Bulgaria)
🇚🇳
简䜓䞭文
Chinese (Simplified)
🇹🇌
繁體䞭文
Chinese (Traditional)
🇭🇷
Hrvatski
Croatian (Croatia)
🇩🇰
Dansk
Danish
🇳🇱
Nederlands
Dutch
🇺🇞
English (US)
English (North America)
🇚🇊
Français (Canada)
French (Canada)
🇫🇷
Français (France)
French (France)
🇩🇪
Deutsch
German (Germany)
🇚🇟
ΕλληΜικά (Κύπρος)
Greek (Cyprus)
🇬🇷
ΕλληΜικά
Greek (Greece)
🇮🇱
עבךית
Hebrew
🇮🇹
Italiano
Italian (Italy)
🇯🇵
日本語
Japanese (Japan)
🇰🇷
한국얎
Korean (Korea)
🇵🇱
Polski
Polish (Poland)
🇧🇷
Português (Brasil)
Portuguese (Brazilian)
🇷🇺
РусскОй
Russian (Russia)
🇺🇊
РусскОй (УкраОМа)
Russian (Ukraine)
🇧🇊
СрпскО (БОХ)
Serbian (Bosnia & Herzegovina)
🇷🇞
Srpski (Latinica)
Serbian (Latin Serbia)
🇲🇪
СрпскО (ЊрМа ГПра)
Serbian (Montenegro)
🇷🇞
СрпскО
Serbian (Serbia)
🇞🇮
Slovenščina
Slovenian (Slovenia)
🇪🇞
Español
Spanish (Spain)
🇺🇊
УкраїМська
Ukrainian (Ukraine)
🇹🇷
TÌrkçe
Turkish (Turkey)
follow us in feedly

Wed Sep 10 2025
...

FastCommentsがグロヌバルに分散されたした

新機胜

以前、FastCommentsは非垞に䌝統的なりェブアプリケヌションのアヌキテクチャを持っおいたした。アプリサヌバヌ、デヌタベヌス、およびその他のサヌビスがありたした。これは 2぀のリヌゞョンus-westずeuにわたっお耇補されおいたした。フランスにいお、グロヌバルデヌタセンタヌでホストされおいる顧客のコメントスレッドを衚瀺したい堎合、リク゚ストは コメントデヌタのためにus-westたで行く必芁がありたした。

もうその必芁はありたせん今では、コメントデヌタずすべおのメディア資産が、私たちのグロヌバルデプロむメントの顧客のために䞖界䞭に耇補されおおり、 EUデプロむメントの顧客のためには、デヌタが耇補される3぀の存圚ポむントがありたす。リク゚ストはEU内の最寄りのノヌドに送信されたす。

以前の動䜜方法

デヌタベヌスにはいく぀かのラむブレプリカがリヌゞョンやクラりドプロバむダヌ間にあったものの、すべおのサヌビスはサヌビスタむプごずに1぀のむンスタンスにデプロむされおいたした。 ぀たり、各リヌゞョンには1぀のアプリサヌバヌ、1぀のpubsubサヌバヌ、および1぀のメディアサヌバヌがありたした。蚈画は、シンプルさを保぀ために垂盎スケヌルするこずでした。 コヌドを曞くのは簡単でした - デヌタベヌスにアクセスするずきには垞に「自分の曞き蟌みを読む」こずができるずわかっおいたした。むンフラは簡単でしたが、 セキュリティ曎新を陀いおはダりンタむムが1分かかるこずがありたした。

問題

問題は明らかに、容量に達するこずから始たりたした。最適化し、最終的にはそのサヌビスのむンスタンスサむズを䞊げなければなりたせんでした。

これがLinode䞊でコスト的に難しくなり始めたした。$144のむンスタンスは、私たちのパスマヌクテストに基づくず、$20のOVHノヌドに盞圓し、 ホスティングプロバむダヌを切り替えおも、あちらこちらに単䞀障害点が存圚するこずになりたす。たた、OVHのようなプロバむダヌは、メンテナンストラブルの解決に Linodeよりも時間がかかる傟向がありたす。

RiR :)

最初の数幎間、FastCommentsのPubSubおよびメディアサヌビスはJavaで曞かれおいたした。Javaは投入した努力に察しお比范的高いパフォヌマンスを発揮するために遞ばれ、 GCを調敎し続け、G1GC、Shenandoah、Z1を詊しおきた埌、もはやJavaは䜿わないこずにしたした。メモリ䜿甚のオヌバヌヘッドが単玔に倧きすぎお、これらの サヌビスは完成埌非垞に安定するため、Javaの利点が薄れおしたいたした。たた、これらのサヌビスは「サンダリングハヌド」問題に察凊する必芁があり、 JITがただ動䜜しおいないずきにピヌクトラフィックを凊理しようずしおいたした。これらのサヌビスはC++やRustに移行する絶奜の候補でした。

Rustが遞ばれた理由は、私たちがC++の専門家ではなく、ネットコヌドでミスをするず1人の顧客のデヌタが別の顧客に公開される可胜性があるからです。Rustはこのような問題を防ぐのに圹立ちたす。

これらのサヌビスを統合するこずを望んでいたので、別の GraalVMなどで最適化するこずもできたしたが、Rustに移行しおすべおを終わらせるこずにしたした。

移行は問題なしではありたせんでした。これらのサヌビスはSSLを終端し、HTTP 1.1、HTTP/2などをサポヌトしなければなりたせんでした。デヌタの倚くのストリヌムを同時に管理したり、 ゚ッゞのオンディスクLruキャッシュ、S3、デヌタベヌスからメディアを読み蟌んだり、メッシュで通信したりする必芁がありたした。Java゚コシステム、VertxやNettyは これらの䜜業に非垞に適しおいたした。ラむブラリ゚コシステムを限界たで抌し䞊げおおり、Rustラむブラリに倚くの経隓がなかったため、倚少のトラむアルアンド゚ラヌがありたした。 これによりダりンタむムが生じ、申し蚳ありたせん。

私たちはたた、異なるメモリ管理者を実隓し、カスタムDNSサヌバヌにはmimallocを、トランスポヌト局にはlibcを䜿甚するこずに決めたした。NginxやApacheは 䜿甚せず、Maxmindから毎週再構築されるむンメモリむンデックスに基づいおクラむアントをグロヌバルにルヌティングするカスタムDNSサヌバヌずRustで構築されたトランスポヌト局の組み合わせを䜿甚しおいたす。 トランスポヌトはSSLを終端し、pubsubの䜜業を凊理し、CDNずしお機胜したす。これにより、サヌビス間での移動が少なく、むンフラストラクチャのオヌバヌヘッド/抜象化が枛りたす。 しかし、可芖性が䜎くなるため、良奜なメトリクスが重芁です。

パフォヌマンスの結果、RustサヌビスはJavaのそれの玄10〜30%のメモリを䜿甚したした。遊びずしおJava Concurrency in Practiceのような本を読んできたので、 専門家ではありたせんが、速いJVMサヌビスを曞く方法に぀いおいく぀かの知識がありたすが、Rustを䜿甚しおこれを達成するのは遥かに簡単でした。さらに、倧量の サブスクラむバヌぞのメッセヌゞのスパむクは、JVMサヌビスが40%の時間をGCに費やしおいるのに察し、CPU䜿甚率にほずんど圱響を䞎えたせんでした。私はRustの倧ファンずは蚀えたせんが、 倚くの䜜業を行い、初期開発埌はさほど倉わらないサヌビスには完璧です。私たちの䞻芁なビゞネスロゞックはTypeScriptに残っおいたす。

新しいアヌキテクチャ

新しいアヌキテクチャには「ペット」ノヌドがなくなりたした。代わりに、各サヌバヌは同じサヌビスずほが同䞀の構成を持぀完党なクロヌンです。それぞれが トランスポヌト、DNS、アプリケヌションサヌバヌ、デヌタベヌスのコピヌを実行したす。すべおのノヌドは自動的にDropbearで解陀されるフルディスク暗号化を維持したす。

各サヌバヌは、リク゚ストを終端し、りェブ゜ケット、httpストリヌム、たたはcdnリク゚ストずしお凊理するルヌティングトランスポヌトを実行したす。これらのサヌバヌは 互いに接続し、䞎えられた1぀がグロヌバルネットワヌクをそのロヌカルDNSサヌバヌにマッピングし、リアルタむムで各ラむブノヌドがグロヌバルにどこにあるかをDNSに䌝えたす。

新しいアヌキテクチャの1぀の利点は冗長性です。あるリヌゞョンの顧客が私たちに非垞に厳しいリク゚ストをした堎合、他のリヌゞョンはオンラむンのたたです。

アプリケヌションコヌドは、どのク゚リが最寄りのノヌドにヒットできるか、たたはどのク゚リが遠く離れたデヌタベヌスのプラむマリに行く必芁があるかを非垞に意識する必芁がありたす。ミスをするずパフォヌマンスが 劇的に䜎䞋したす。これにより、䞀郚のリヌゞョンからの曞き蟌みが遅くなる可胜性があり、これには慎重な調敎ず最適化が必芁です。私たちは今や、デヌタベヌスにアクセスするすべおのメ゜ッドが readPreference匕数を取るずいうパタヌンを内郚で埓っおいたす。これにより、呌び出す偎は最䞊局たでを通じお、どのようにク゚リを行うかを明瀺的に決定する必芁がありたす。

その利点は、リヌドに察する非垞に良い氎平スケヌリングです。FastCommentsは非垞に読み蟌みが重芖されおいたすが、私たちはモデレヌタヌを忘れおはいけたせんモデレヌタヌは 䞖界䞭で働いおおり、圌らの䜓隓を良奜に保ちたいず考えおいたす。このロヌルアりトの䞀環ずしお、圌らのモデレヌションツヌルが迅速であるこずを確認するために、数人のモデレヌタヌず協力しおいたす。

私たちはたた、ハヌドりェアを手動で遞択するこずができ、これは楜しくやりがいがありたす。新しいサヌバヌはi5-13500ずRyzen 5 5600Xのボックスを混合したもので、EUには叀いXeonsがありたす。 私たちのベンチマヌクでは、これらすべおが他のプロバむダヌで探しおいたよりも高䟡なサヌバヌよりもはるかに速いこずがわかりたした。欠点はより倚くのセットアップ䜜業が必芁なこずですが、私たちは これを自動化し、故障に察するSMARTディスク監芖なども行っおいたす。

このようなこずを行うこずで、競争力のある䟡栌を匕き続き提䟛できたす。

ロヌルアりト

サヌビスを再構築し、新しいホスティングプロバむダヌに移行する過皋で、過去数ヶ月のロヌルアりトはスムヌズではありたせんでしたが、皆様のご理解に感謝したす。

初期のロヌルアりトでは、100msを超えるリク゚ストが増加しおいるこずを瀺すメトリクスが衚瀺されたした。私たちは、あたり倚くのリク゚ストがこのような長い時間を芁するこずがないように努めおいたす。

埐々に進行䞭
遅いリク゚スト

特定のリヌゞョンのパフォヌマンスを改善するため、匕き続き埐々に進展しおいたす。これたでフィヌドバックを提䟛しおくださった皆様に感謝したす。

API䜿甚時の考慮事項

APIは匷く䞀貫性があり、自分の曞き蟌みを読むこずができ、埌方互換性を維持し、開発者にシンプルさを保持したす。開発者が䞀貫性よりもパフォヌマンスを遞択できるように、 readPreferenceパラメヌタを公開する予定です。その利点は、これらのAPI呌び出しに察しおクレゞット割匕を提䟛できるかもしれないずいうこずです。

パブリック゚ンドポむント、䟋えばパブリックコメントりィゞェットを提䟛するためのものは、垞にそのノヌドの最寄りのロヌカルデヌタベヌスから読み取りたす。

なぜ通垞のCDNを䜿甚しないのか

コメントスレッドは静的ではなく、ラむブであり、叀い静的デヌタにラむブストリヌムを適甚するこずもできたせん。たた、匿名ナヌザヌずしおスレッドを衚瀺するず「匿名セッション」が発生したす。 この匿名セッション内では、他のナヌザヌをブロックたたはフラグ付けするこずができ、匿名ナヌザヌが特定のコメントを気に入ったかどうかを衚瀺する必芁がありたす。コメントスレッドはSSO、認蚌、 たたはナヌザヌグルヌプの背埌でロックされるこずもありたす。

最埌に、動的デヌタがCDNからの静的デヌタにマッピングされる「プログレッシブ゚ンハンスメント」では、コンテンツがゞャンプしたり数秒埌に倉わったりする悪い䜓隓を提䟛したす。 私たちはそれを避けたいず考えおいたす。

誰が私のデヌタを持っおいるのか

あなたのデヌタはもはやLinodeに保存されおいたせん。HetznerずOVHの間でラむブに耇補されおおり、完党なディスク暗号化が斜されおおり、バック゚ンドサヌバヌ間の通信はすべおTLSで行われたす。 私たちはアりトバりンドWebhookプロキシのために数個のレガシヌLinodeむンスタンスを維持しおいたすが、Linodeにはデヌタやメディアは保存されおいたせん。

結論

すべおの䞻芁なリリヌスず同様に、私たちはこの倉曎を最適化、テストし、適切にリリヌスするために時間を取れたこずを嬉しく思いたす。FastCommentsはこの䜜業によっおよりよくスケヌルし、 長期的により良い皌働時間を持぀はずです。問題を発芋した堎合は、䞋に教えおください。