micro service(マイクロサービス)

マイクロサービス

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

マイクロサービスは、大規模な単一のアプリケーションを小さな独立したサービスに分割する設計パターンであり、これらは独立してデプロイ・スケールすることができます。各サービスは自己完結型であり、特定のビジネス機能を提供します。

このアーキテクチャスタイルは、モノリシックなアプリケーションの欠点を克服するために登場しました。モノリシックなアプリケーションでは、すべての機能が同じコードベースに組み込まれ、一つのサービスとしてデプロイされます。これは、新しい機能の追加や既存の機能の更新が難しく、スケーラビリティとメンテナンス性に問題を生じさせる可能性があります。

それに対して、マイクロサービスアーキテクチャでは、各サービスが独立しているため、一つのサービスに問題が発生しても他のサービスに影響を与えません。また、各サービスは異なる技術スタックで構築でき、それぞれが独自のデータベースを持つことができます。

マイクロサービスの歴史的変遷

マイクロサービスという概念が初めて提示されたのは、2011年の一連のワークショップで、それは「分散システムをうまく設計するための最良の方法」として提案されました。しかし、その背後にある基本的な原則は、それ以前から存在していました。

この考え方は、2000年代初頭のサービス指向アーキテクチャ(SOA)と密接に関連しています。SOAは、ビジネス機能を再利用可能なサービスとしてモデル化することを目指していました。しかし、実装が複雑で、しばしば巨大で重いエンタープライズサービスバス(ESB)に依存していました。

それに対して、マイクロサービスは、サービスの小規模化と軽量化を目指しました。各サービスは、単一のビジネス機能に焦点を当て、それぞれが独立してデプロイ可能であり、他のサービスとは軽量なメカニズム(通常はHTTP/RESTやメッセージングキュー)で通信します。

2014年には、マーチン・ファウラーとジェームズ・ルイスが「Microservices」という用語を使った記事を公開し、この概念が広く認知されるようになりました。その後、多くの企業が、そのスケーラビリティ、生産性の向上、技術的柔軟性を活用するために、マイクロサービスへの移行を進めています。

マイクロサービスとJamstackの関係

マイクロサービスとJamstackは、互いに補完する形で一緒に利用できます。Jamstack(JavaScript、API、Markupの略)は、フロントエンドとバックエンドを分離することを目指すアーキテクチャの一種です。フロントエンドは静的に生成され、CDNにデプロイされ、バックエンドの機能はAPIを通じて提供されます。

マイクロサービスは、このAPI部分を担当することが多いです。各マイクロサービスが特定のビジネス機能を担当し、それらが共同して全体のバックエンド機能を提供します。これにより、フロントエンドの開発者はバックエンドの詳細を気にすることなく、APIを利用してデータを取得・操作することができます。また、バックエンド側でも、各マイクロサービスが独立して開発・デプロイ可能なため、開発の効率化と運用の柔軟性が実現します。

Jamstackによってフロントエンドとバックエンドが分離されたことで、マイクロサービスの採用がより容易になりました。これは、フロントエンドとバックエンドが密接に結びついている従来のモノリシックなアプリケーションでは、バックエンドのマイクロサービス化が難しかったからです。しかし、Jamstackによる分離により、フロントエンドとバックエンドが独立して開発・運用可能となり、バックエンドのマイクロサービス化が進んでいます。

以上のように、マイクロサービスとJamstackは、それぞれが提供する利点を活かし、一緒に利用することで、モダンなWebアプリケーション開発の効率化と品質向上を実現します。

マイクロサービスを使うメリット

スケーラビリティの向上

各サービスが独立しているため、需要に応じて個々のサービスをスケールアップまたはスケールダウンすることが可能です。これにより、リソースを最適に利用し、コストを抑制することができます。

メンテナンス性と生産性の向上

各サービスは小規模で、特定のビジネス機能に集中しているため、理解しやすく、メンテナンスが容易です。また、サービスが独立しているため、開発チームも独立して作業を進めることができ、生産性が向上します。

技術的柔軟性

各マイクロサービスは、他のサービスと独立しているため、異なる技術スタックを使用して構築することが可能です。これにより、特定のタスクに最適な技術を選択する柔軟性が提供されます。

マイクロサービスを実装

Next.jsとTypeScriptを使用したマイクロサービスの一例を示します。ここでは、ユーザー情報と注文情報を管理する2つの独立したマイクロサービスを想定します。

ユーザーサービス

まず、ユーザー情報を管理するユーザーサービスを作成します。以下はその一部を示すコードです。

import express from 'express';
import { v4 as uuidv4 } from 'uuid';

type User = {
  id: string;
  name: string;
};

let users: User[] = [];

const app = express();
app.use(express.json());

app.post('/users', (req, res) => {
  const user: User = {
    id: uuidv4(),
    name: req.body.name,
  };

  users.push(user);

  res.status(201).json(user);
});

app.listen(3000, () => console.log('User Service is running on port 3000'));

このサービスは、ユーザーを作成し、それを配列に保存します。そして、作成したユーザーの情報をJSON形式で返します。

注文サービス

次に、注文情報を管理する注文サービスを作成します。以下はその一部を示すコードです。

import express from 'express';
import { v4 as uuidv4 } from 'uuid';

type Order = {
  id: string;
  userId: string;
  product: string;
};

let orders: Order[] = [];

const app = express();
app.use(express.json());

app.post('/orders', (req, res) => {
  const order: Order = {
    id: uuidv4(),
    userId: req.body.userId,
    product: req.body.product,
  };

  orders.push(order);

  res.status(201).json(order);
});

app.listen(3001, () => console.log('Order Service is running on port 3001'));

このサービスは、注文を作成し、それを配列に保存します。そして、作成した注文の情報をJSON形式で返します。

以上のように、マイクロサービスでは、各サービスが独立して機能し、それぞれが特定のビジネス機能を提供します。また、各サービスは独立してデプロイ・スケールすることができ、柔軟なアプリケーション開発が可能です。

マイクロサービスを学ぶ

マイクロサービスについて更に深く学びたい場合は以下のリンクが参考になります:

  1. Microservices - James Lewis and Martin Fowler
  2. Microservices.io
  3. Building Microservices - Sam Newman

以上のリンクは、マイクロサービスの設計と開発に関する権威ある情報源です。これらのリソースを通じて、マイクロサービスの基本的な概念から高度なトピックまで、幅広く学ぶことができます。