モノリスからの脱却

そしてマイクロサービスでどのように進化したか

(2018年7月19日)

モノリス支配コードモンキー

コニオでは、それはすべて一般に「モノリス」と呼ばれるものから始まりました。つまり、フロントエンドコンポーネント、バックエンドコンポーネント、APIサービス、バックグラウンドタスクなど、アプリケーション全体のすべてを含む単一のコードベースです。地獄、さらにdevopsスクリプト。そして、それは最初は非常にうまく機能しました。コードベースの別々の領域で作業している(コード変更の競合の可能性が非常に少ない)ソフトウェアエンジニアは数人だけで、簡単に展開できます。他のことをあまり気にせずに、アプリケーションの機能を書くことに完全に集中します。展開にどのようにアプローチしましたか?進行中の進歩を認識しているベータ版の顧客はごくわずかであるため、しばらくの間サービスをシャットダウンし、コードベース全体を展開することは実際の問題ではありませんでした(全体的な変更がどれほど小さいか大きいか、データベースの移行が含まれているかどうかに関係なく)。

製品がゼロから形になり、エンドユーザーから評価を得るのを見て、間違いなく満足のいくものでした。ただし、このアプローチが現代のフィンテック企業に適していないことはよくわかっていました。

それではどうしますか?

ほとんどのソフトウェアアプリケーションでは、顧客は非常に寛容です。はい、Whatsappは動作を停止し、数時間停止が続く可能性があります。間違いなく迷惑ですが、認識されている問題ではありません。ポケモンGOやお気に入りのゲームアプリも同様です。ただし、お金が関係している場合はそうではありません

:銀行口座にログインできない場合やログインできない場合は気分が変わります貿易業務を行います。これは、暗号通貨アプリケーションの場合はさらに悪化します。ほとんどの人は過去の悪名高い過ちを覚えており、短時間でも暗号通貨の資金にアクセスできないときはいつでも、憶測が飛び交います。それは公正です。それはあなたのお金であり、それを使用したいときにほとんどまたはまったく問題がないはずです。

上記のMonolithは、そのようなシナリオには適していません。本番環境でコードベースを変更するには、完全な展開が必要です。関連するダウンタイムを伴います。私たちは毎日、バグを修正し、インターフェースをさらに使いやすくし、古い機能を削除し、より使いやすい新しい機能を追加することで、サービスの改善に取り組んでいます。これらのアップデートは、お客様がすぐに利益を享受できるように毎日リリースされることが多く、お客様のエクスペリエンスに影響を与えないように努めています。つまり、私たちが舞台裏で作成する式が何であれ、(少なくともほとんどの場合)外の世界には見えないはずです。そこで、モノリスから離れて、一般に「マイクロサービスアーキテクチャ」と呼ばれるものを選択しました。

マイクロサービスによる進化

密に接着された大規模な単一のコードベースが小さな部分に分解され、それぞれが特定のサービスを表します。サービスは実行されるたびに、標準のHTTPプロトコルを介して同期的に通信し、キューを介して非同期に通信します(たとえば、RabbitMQとApache Kafkaによって処理されます)。

マイクロサービスアーキテクチャでの相互作用

モノリスをより小さなコンポーネントに分割し始めるのは非常に困難ですが、それだけの価値はあります。努力。軍事的には、ジュリアスシーザーがガリアの広大な領土を着実に統治するために行った「分割統治法」と非常によく似ています。

1)製品は継続的に展開できます。コードの更新はマイクロサービスにのみ適用されるようになりました。ほとんどの場合、顧客に影響を与えることなく、すぐに本番環境にデプロイしてリリースできます。

2)コードの管理が簡単です。会社の組織の観点からは、2人のソフトウェアエンジニアのチームが10人のソフトウェアエンジニアのチームになると状況が変わります。各チームメンバーが自分のマイクロサービスに責任を持つと、より効果的でコードの競合が少なくなります。

3)コードの保守が簡単です。マイクロサービスアーキテクチャは、本質的に、外部世界(フロントエンドアプリまたは別のバックエンドサービス)と通信するためのインターフェイスの定義を必要とし、他の観点から完全に分離されています。これにより、アプリケーションの単一のコンポーネントを、他のコンポーネントに影響を与えることなく、最初からレビュー、再設計、または完全に書き直すことができます(便利な場合は異なる言語でも)。

4)パフォーマンスを向上させることができます。各マイクロサービスは、最も適切な言語を使用できるようになりました。たとえば、重い暗号化計算コンポーネントはCで最適化され、APIサービスはPythonで、長時間実行されるタスクはGoで最適化されます。

5)コードの分離とセキュリティが向上しました。各マイクロサービスは独自のDockerコンテナで実行できるため、特権の分離、ネットワークとデータの分離が可能になり、成長フェーズで最も重要なのは、スケーラビリティの可能性が非常に高いことです。

マイクロサービスがその答えですか?

もちろん、無料のランチなどはありません。マイクロサービスアーキテクチャには、独自の一連の困難な課題も伴います。

1)運用の複雑さ。新しい導入プロセスの複雑さをスムーズにするために、DevOpsエンジニアは間違いなく必要です。

2)ハードウェアの肥大化。マイクロサービスは多くの場合、Dockerコンテナーで実行されます。マイクロサービスの数が増えるとすぐに、以前と同じハードウェアで完全なアプリケーションを実行することがますます困難になります。

3)相互通信のオーバーヘッド:各リクエストは1つ以上の異なるものと対話する必要がある場合がありますネットワークを介したマイクロサービス。これにより、待ち時間が長くなり、一時的な障害が発生する可能性があります。復元力のあるサービスを実装し、システム全体のスケーラビリティを向上させるには、インタラクションを非同期メッセージングに移行する必要があります(Apache KafkaやRabbitMQを使用するなど)

4)結果整合性。 これはおそらくマイクロサービスアーキテクチャの最も難しい課題です。

単一のマイクロサービスがあれば、その境界内にRDBMSトランザクションを作成できます。 。ただし、残念ながら、分散アーキテクチャの一般的な問題は、同じ境界内にない複数のトランザクションを処理することです。その結果、システムが違法で回復不能な状態になる可能性があります。このような問題を軽減するために、Conioはさまざまな戦略を採用しています。

  1. ドメイン駆動設計の慣行に従い、上位レベルドメインをサブドメインに分解し、それらを個別に制限されたコンテキストに限定します ;制限された各コンテキストは、トランザクション境界が適用されるマイクロサービスとして実装されます。これにより、特定のサブドメインに不整合が生じる可能性が解決されます。
  2. べき等非同期相互作用を実装し、遅かれ早かれ不整合を解決します。
  3. 可能な限り、複数のサブドメインが関与する可能性のあるアクションは避けてください。

5)複雑なレポート。各サブドメインは特定の制限されたコンテキスト内に存在するため、複数のサブドメインを含む複雑なレポートでは、複数のデータソースからデータをクエリする必要がある場合があります。これは、ドメインの表現力とシステムのスケーラビリティの両方に悪影響を与える可能性があります。ここコニオでは、バックオフィスアクティビティとビジネス分析レポートをサポートするためにCQRSアーキテクチャ

を採用しています。

6 )ロギングシステム。分散システムの各要素は、システム全体のログの作成に貢献します。ただし、相互作用ごとに統一されたログを作成するには、このような分離されたすべてのログ間に必要な接続を作成できるツールを実装する必要があります。ここコニオでは、ELK(ElasticSearch、Logstash、Kibana)スタックを使用して、ログデータを保存およびクエリします。各ログは、上記の統合ログを可能にするために必要な相関IDで強化されています。

進化を止めないでください

私たちの考えは? 最初の単一コードベースの分解は、継続的な改良を伴う長期的なタスクと見なす必要があります。 Conioでは、1つの大規模なコードベースから100を超える マイクロサービスに段階的に移行するのに数年かかりました。結果に誇りを感じるようになりましたが、同時に探求を続けています。考えられる新しい最適化は複数あります。DockerSwarmからKubernetesに移行しますか?バックエンドからフロントエンドへのサービスをサーバーレスラムダ関数に移行しますか?完全継続的デプロイの操作フローに切り替えますか?可能性は無限大です。

ここでは多くのトピックとテクノロジーに触れました。次の記事では、調査結果と進捗状況について詳しく説明します。よろしければ、コメントして、あなたの経験を教えてください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です