- Waveは70人のエンジニアを擁する$1.7B(2.3兆ウォン)規模の企業(アフリカ向けのモバイルバンキングサービスを提供)
- PostgresベースのPythonモノリスという、標準的なCRUDアプリのアーキテクチャを採用している
- シンプルなアーキテクチャから始め、複雑さを最小限に抑えながら問題を解決することで、エンジニアはユーザーに価値を届ける作業に集中できた
- Stack Overflowは単一体(monolith)をスケールさせ、18億ドルで買収されるほど成功裏に成長した
シンプルなアーキテクチャの効率性にもかかわらず、大半のメディアは複雑なアーキテクチャを好む
- 技術カンファレンスでは複雑なマイクロサービスベースのアーキテクチャに関する発表が多い一方、シンプルなモノリスに関する発表はほとんどない
- 多くの企業が小規模なアプリケーションであるにもかかわらず複雑な技術を模倣し、それによってカンファレンスやHNで人気を集めている
- 私たちが使っているアーキテクチャはあまりにシンプルで、アーキテクチャ図を書く必要すらない
シンプルさを維持する方法
- Waveは同期式Pythonを使っており、これはサーバープロセスがI/Oを待つ間ブロックされることを意味する
- Eventletのような非同期フレームワークも試したが、バグが多すぎて、そのコストは運用上の苦痛に見合わないと判断した
- 複雑さを増やす代わりに、実行時間の長い処理はキューに切り出して処理している
- データレジデンシー規制を順守するため、一部の国ではオンプレミスのデータセンターを運用しなければならない
- セネガル/コートジボワールはクラウドだったが、ウガンダや他の国々では規制のためオンプレミスが必要だった
- このような場合、複雑なアーキテクチャよりもシンプルなアーキテクチャのほうがはるかに容易である
購入ではなく構築
- 少人数チームだったため初期にはソフトウェア購入を好んでいたが、重大なバグを解決できない場合には自前のツールを開発した
- 自前ツールの構築は本来引き受けたくない複雑さだが、いくつかの製品カテゴリではかなり広範な調査をしても、自分たちに合う製品を提供できるベンダーが見つからなかった
- コアコンピタンス以外でも、自前ツールを開発し、社内の専門性を維持することが時には必要になる
再考している選択
- RabbitMQ、Celery、SQLAlchemy、Pythonなどの技術選択を再考しており、これらは複雑さを増したり保守負担を高めたりする
- 新しいコードベースを始めるなら、これらの技術選択について慎重に検討するだろう
満足している選択
- GraphQL、カスタムトランスポートプロトコル、Kubernetesなどの選択には満足している
- GraphQLには、自己文書化、コード生成、GraphiQLインタラクティブエクスプローラーなどの利点がある
- GraphQLを使うと、利点が欠点を上回ると考えている
- 利点
- 正確な戻り値の型に関する自己文書化
- 正確な戻り値の型に基づくコード生成により、クライアントの安全性が高まる
- GraphiQL対話型エクスプローラーによる生産性向上
- さまざまなアプリ(ユーザーアプリ、サポートアプリ、Waveエージェントアプリなど)がほぼ1つのAPIを共有でき、複雑さが減る
- 構成可能なクエリ言語を使うことで、クライアントは特定用途向けエンドポイントを多数構築しなくても、1回のパケット往復で必要なデータを正確に取得できる
- RESTful APIと見なされるものについてのbikeshedding(重要な議題を先送りし、重要度の低いことを延々と議論して時間を費やすこと)をなくせる
- 欠点
- GraphQLライブラリは、GraphQLを採用した当時はまだ十分に優れていなかった
- デフォルトのGQLエンコーディングは冗長であり、多くの顧客が低帯域幅を使っているため、サイズ制限に強い関心を払っている
- Kubernetesは、国ごとのデータセンター運用要件を満たすために使われている
結論
- アプリケーションアーキテクチャを可能な限りシンプルに保つことで、ビジネスに役立つ複雑さがある場所へ複雑性(および人員)の予算を投じることができる
- 複雑さを加える強い理由がない限り、できるだけシンプルに物事を進めるという考え方によって、一般には難しい事業と見なされるアフリカの金融事業を運営しているにもかかわらず、多くのエンジニアがいなくてもかなり大きな事業を築くことができた
9件のコメント
「構築するより購入する」ではなく、「購入するより構築する」が正しい気がします。
あ、強調しようとしていたらタイトルがおかしくなってしまいました。修正しました。ありがとうございます。
景気サイクルによって流行が変わるのでしょうか? 流行に関係なく、モノリスで始めるほうが固定費の削減とメンテナンスのしやすさの面で有利です。
理解しやすいアーキテクチャは、保守もしやすいですよね。
私の基準では、どんなサービスでもモノリシックで始めるのがよさそうです。最初からMSAを前提に進めるのはお金の無駄でしょう。
「複雑さが増すと、コスト(金、人、時間...)も増加する」
「シンプルなアーキテクチャで解決できる問題を、複雑なアーキテクチャで解決しようとするな。」
Hacker Newsの意見
マイクロサービスに関するエンジニアの助言
マイクロサービスに関するトーク
認知バイアスとシンプルさ
過剰なエンジニアリングと経験不足
ワークライフバランスを重視する会社
Dan Luuに関する個人的な経験
シンプルなアーキテクチャの重要性
アーキテクチャとエンジニアリングチームの社会的構造
シンプルなアーキテクチャの選好
「David Schmitz のマイクロサービス失敗に関するヒントを扱った講演」のリンクをお願いできますか。
https://www.youtube.com/watch?v=r8mtXJh3hzM です