Monolith

モノリス

モノリスを分かりやすく

モノリスとは、ソフトウェアの設計パターンの一つで、全てのコードを一つの単一のプロジェクトまたはプラットフォームに統合する形式を指します。これに対して、マイクロサービスなどの設計パターンでは、ソフトウェアは複数の独立したサービスに分割され、それぞれが特定の機能を担当します。

モノリスの代表例としては、WordPressがあります。WordPressはPHPで記述されたオープンソースのコンテンツ管理システム(CMS)で、プラグインとテーマを組み合わせることで様々なウェブサイトを作成することが可能です。しかし、WordPressの全ての機能が一つのプロジェクト内に統合されているため、モノリスとして認識されています。

モノリシックなWordPressのデメリット

モノリス構造のWordPressは、その初期の簡便さから幅広く採用されてきましたが、いくつかのデメリットが指摘されています。

1. スケーラビリティの問題

全てのコードが一つのプロジェクトに統合されているため、システムの一部をスケールアップすることが難しいです。例えば、ユーザーが増えた場合、全てのコードをスケールアップする必要があります。

2. 柔軟性の欠如

WordPressのようなモノリスシステムは、全てのコードが一つのプロジェクトに統合されているため、新しい技術の導入や変更が困難であるという問題があります。

3. 開発とデプロイの遅延

全てのコードが一つのプロジェクトに統合されているため、開発者が新しい機能を追加または修正するたびに、システム全体をデプロイしなければならない場合があります。これにより、開発とデプロイのサイクルが遅くなり、生産性が低下する可能性があります。

4. セキュリティの問題

モノリス構造では、一部のコードに脆弱性が存在すると、システム全体がリスクにさらされる可能性があります。

歴史的な背景

モノリスは、コンピューティングの初期段階から存在していました。早い時期のソフトウェア開発では、システム全体を一つの単一のコードベースで管理することが一般的でした。これは、開発者が全てのコードを一元管理でき、全体的なコンテキストを把握しやすいという利点があったからです。

しかし、時間とともにシステムが大規模になり、機能が複雑化すると、モノリスの限界が明らかになりました。特に、大規模なシステムでは、全てのコードを一つのプロジェクトで管理することが困難になり、新しい技術の導入や機能のスケーリングも難しくなりました。

これに対応するために、マイクロサービスというアーキテクチャが登場しました。マイクロサービスでは、システムは複数の独立したサービスに分割され、それぞれが特定の機能を担当します。これにより、スケーラビリティ、柔軟性、セキュリティなどの問題を解決することが可能となりました。

マイクロサービスを分かりやすく

マイクロサービスは、ソフトウェアアーキテクチャのスタイルで、アプリケーションを小さく独立したサービスの集合体として設計・構築するアプローチです。各サービスは特定のビジネス機能に焦点を当て、独自のデータベースを持ち、独立してデプロイ・スケーリング可能です。これにより、システム全体の柔軟性、スケーラビリティ、故障耐性が向上します。

Jamstackのアーキテクチャでは、マイクロサービスを使うことが十分に可能です。実際に、Jamstackの主要なコンポーネントの1つである「API」の部分は、マイクロサービスの考え方と非常によく一致します。

Jamstackでは、ウェブサイトのUI部分(JavaScriptとMarkup)とサーバーサイドのロジック(API)が明確に分離されます。これにより、ウェブサイトのフロントエンドは静的にホストされ、必要に応じてAPIを呼び出すことで動的な機能を提供します。これらのAPIは、独立したマイクロサービスとして設計・実装されることが多く、その結果、それぞれのサービスが独立してスケーリングや更新が可能となり、全体としてのシステムの柔軟性と耐障害性が向上します。

したがって、Jamstackとマイクロサービスは共存し、相互に補完することができるアーキテクチャパターンであり、多くの場合、両方を使用したアプリケーション開発が行われています。

モノリスを使うメリット

現代のフロントエンドで避けられがちなモノリスにもメリットもあります。

開発の簡素化

モノリスの最大のメリットは、開発の簡素化です。全てのコードが一つの場所にあるため、開発者はシステム全体のコンテキストを簡単に理解し、コードの依存関係を把握することが容易です。

デプロイメントの簡易性

モノリスでは、全てのコードが一つの単一の実行可能ファイルにコンパイルされるため、デプロイメントが簡単です。マイクロサービスに比べてデプロイメントの複雑性が大幅に低減されます。

一貫した開発環境

全てのコードが一つの場所にあるため、一貫した開発環境を保つことができます。これにより、開発者が異なる技術スタックやプラットフォーム間でコンテキストスイッチを行う必要がなくなります。

モノリスを実装

少々強引な解説になりますが、以下に、Next.jsとTypeScriptを使用したモノリス的なソフトウェアアーキテクチャの一例を示します。これは、簡単なブログアプリケーションの一部を実装したもので、記事の取得と表示を行うコンポーネントを含んでいます。

type Post = {
  id: string;
  title: string;
  content: string;
};

type Props = {
  posts: Post[];
};

const Blog = ({ posts }: Props) => {
  return (
    <div>
      {posts.map((post) => (
        <div key={post.id}>
          <h2>{post.title}</h2>
          <p>{post.content}</p>
        </div>
      ))}
    </div>
  );
};

// Next.jsのgetServerSidePropsを使用してデータを取得
export async function getServerSideProps() {
  const res = await fetch('https://example.com/posts');
  const posts: Post[] = await res.json();

  return {
    props: {
      posts,
    },
  };
}

export default Blog;

このコードは、全てのロジックが一つのファイルに集約されているという点でモノリスの特徴を示しています。データの取得、データの型定義、表示のためのコンポーネント、全てが同じ場所にあります。

しかし、モノリスの制約に直面すると、このような設計はスケーラビリティと保守性の観点から問題を引き起こす可能性があります。そのため、アプリケーションが成長し、より複雑になるにつれて、より洗練されたアーキテクチャへの移行を検討することが重要です。

それぞれのアプリケーションとその要件に最適なアーキテクチャを選択することが重要で、モノリスとマイクロサービスの両方がそれぞれの利点を持っています。これらの特性を理解し、自分のプロジェクトに適した選択をすることが、成功への道筋を描く上で重要なステップとなります。

モノリスを学ぶ

1. Martin Fowler's Website

Martin Fowlerは著名なソフトウェア開発者であり、多くのデザインパターンとソフトウェアアーキテクチャについての洞察を提供しています。彼のサイトには、モノリスとマイクロサービスについての詳細な解説が含まれています。

2. Microservices.io

このサイトは、マイクロサービスアーキテクチャについての包括的な情報を提供していますが、その中にはモノリスの解説も含まれています。

3. ThoughtWorks Technology Radar

ThoughtWorksはソフトウェア開発とアーキテクチャについての権威ある情報源であり、定期的にTechnology Radarを発行しています。これは、新しいテクノロジーとトレンドについての洞察を提供するもので、モノリスとマイクロサービスのトレンドについても触れています。

4. The New Stack

The New Stackはクラウドネイティブテクノロジーに焦点を当てた情報源で、モノリスとマイクロサービスについての多くの記事を提供しています。

これらのサイトはモノリスについての理解を深めるのに役立つ情報源であり、それぞれが独自の視点と洞察を提供しています。ただし、これらの情報を読む際には、自身のプロジェクトやチームの具体的なニーズと状況を考慮することが重要です。