概要
原著者の許諾を得て翻訳・公開いたします。
- 英語記事: The Citadel Architecture at AppSignal | AppSignal Blog
- 原文公開日: 2020/04/08
- 著者: Thijs Cadier
- サイト: AppSignal
Rails: AppSignalが採用する「シタデルアーキテクチャ」(翻訳)
DHHが「シタデル(Citadel: 要塞、とりで)」という用語を命名しました。これは私たちAppSignalでアプローチしている技術を表すうってつけの用語となっています。「うちでやってるのはまさにこれだよ!ついに名前が付いた」と話題になったものです。
In addition to the Majestic Monolith, someone should write up the pattern of The Citadel: A single Majestic Monolith captures the majority mass of the app, with a few auxiliary outpost apps for highly specialized and divergent needs.
— DHH (@dhh) April 7, 2020
DHH: やはりマイクロサービス採用による痛みはとてつもなく大きい。
DHH: マジェスティックモノリス(Majestic Monolith)パターンに続いて、誰かCitadelパターンについてもまとめ記事を書くべき。マジェスティックモノリスがアプリの主な重量を支え、特殊かつ多様なニーズについては周辺に配置した数個のアウトポストを用いるというものだ。
AppSignalで用いているシタデルパターンについて説明するために、私たちのシステムがどうなっているかを少しばかりご紹介します。AppSignalとは、顧客が利用しているアプリケーションを監視する製品であり、監視エージェントからのデータ送付先となるAPIです。このデータが処理されてグラフやインサイトとして表示されます。
モノリス
私たちの顧客がやりとりするアプリケーションは、フロントエンドの一部がReactで書かれたモノリシックなRailsアプリ、すなわちモノリス(Monolith)です。バックエンドはすべてRubyで書かれており、いくつかのデータベースと通信します(スケール上の理由でデータを顧客ごとにクラスタに分離しています)。このRailsアプリでは、外部サービスへのアラート送信といった多くのタスクも扱っています。
このRailsアプリで監視エージェントから受け取ったデータも処理するようになった頃、データインジェストが今後ボトルネックになるであろうと予見されました。そこで私たちはSinatraアプリをサブドメインで動かし、Railsアプリで処理されたデータをそこでインジェスト(ingest: 摂取)してSidekiqジョブを作成するようにしました。
つらみが増してきた
このアーキテクチャは長年うまく動いていました。しかしビジネスが成長するに連れて、エージェントから受け取ったデータを処理する特定のタスクの扱いについて特別な注意が必要になってきたのです。数十億単位のリクエストを絶え間なく監視していれば厳しい上限に突き当たるものです。Rubyの遅さは上限の主要なファクターではありませんでした(Rubyのせいでないことはとっくに承知です😉)が、私たちが構築していたアーキテクチャではデータベースロックがあまりに多すぎたのです。
アウトポスト
私たちはさまざまな可能性を検討した末、自分たちの状況にはApache Kafkaが最適であると判断を下しました。私たちの場合はRustの経験も多少あったので、このシステムではスピードや信頼性の点でRustが非常によい結果を生むと考えたのです。そこでデータのインジェストシステムや処理システムをRustで書き換え、キューとストレージを組み合わせたシステムとしてKafkaを用いました。
Railsアプリからこのアウトポスト(outpost: 出城、前哨基地)サービスに移行したのは、受け取ったデータを処理する部分だけでした。システムのその他の部分は、モノリシックアプリの形のまま問題なく動作しています。私たちはこのシステムを深く理解し、システムをシンプルに保つことに没頭しました。モノリスは従来同様にロジックのほとんどを扱い、Kafkaと密にやり取りしています。そして私たちのモノリスを崩さないためにKafka用のgemを書いたことで、メインアプリはアウトポストと簡単にコミュニケーションできます。
AppSignalにおけるKafkaの利用法について詳しくは、以下の動画でRailsConfでの私のセッションをご覧ください。
要塞暮らしはいいぞ
というわけで、今や私たちの籠城生活は実にハッピーです。DHHが以下に述べたように。
マジェスティックモノリスはアプリの主な重量を支え、特殊かつ多様なニーズについては周辺に配置した数個のアウトポストを用いるというものだ。
私たちの場合は、極めて特殊なニーズを1個のアウトポストサービスで賄っています。もし仮に今年RailsConfが開催されるのであれば、素敵な名前を付けてくれたDHHに私たちからストロープワッフルを余分に進呈することでしょう🍪。
おたより発掘
Rails: AppSignalが採用する「シタデルアーキテクチャ」(翻訳)
モノリスも辛いし、マイクロサービスもそれはそれで辛いので、その間でバランスを取りましょうってことだな😌シタデルとアウトポストはかっこいい🥰 https://t.co/utEULLzuOJ
— fatal flaw (@yamukotonaku) June 10, 2020
マイクロサービスハイプのカウンターとして、大多数のサービスがごく自然にたどり着く構成にあえて名前をつけよう運動https://t.co/jLgTBM5dqB
— ntaoo (@ntaoo) June 10, 2020