Lokadプラットフォームのアーキテクチャ

Lokadのプラットフォームは、マルチテナントのクラウドホステッドSaaSソリューションです。このページでは、プラットフォームのハイレベルなアーキテクチャを紹介します。このページはITの専門家を対象としていますが、テクノロジーに詳しいサプライチェーンの専門家にとっても興味深い情報となっています。なぜなら、このアーキテクチャは、サプライチェーンの予測最適化のための私たちの技術的なビジョンを反映しているからです。

system-architecture

アーキテクチャの概要

Lokadは、サプライチェーンの問題に対する予測最適化アプリケーションの開発と運用のための環境として位置付けられています。その中核には、Lokadによって開発されたドメイン固有言語(DSL)であるEnvisionがあります。Envisionはエンドユーザーにアクセス可能であり、ほとんどの機能はそれを通じて提供されます。Envisionは「プログラミング」を意味しますが、LokadはITの専門家やソフトウェアエンジニアではなく、「サプライチェーンの専門家」を対象としています。

Lokadプラットフォームはマルチテナントです。同じアプリケーションがすべてのクライアントに提供され、いくつかのサービスが含まれています。この分割の粒度は、各サービスの信頼性、セキュリティ、パフォーマンスに関する異なる要件によって主に動機付けられており、純粋な機能的な分割ではありません。実際には、これらのサービス間には比較的高い結合度が存在しています。これらのサービスは同じGitコードリポジトリを共有しており、一緒に頻繁にアップグレードされます。

私たちのコードベースはF#、C#、およびTypeScriptで実装されており、Microsoftによって開発されたオープンソースフレームワークである.NET以外のほとんどのサードパーティ依存関係はありません。さらに、.NET自体以外にも、他の依存関係は非常に少ないです(通常の数桁少ないです)。

このアーキテクチャは、一般的なエンタープライズアプリケーションで見られる「通常の」アーキテクチャとは大きく異なりますが、その理由は十分にあります。一般的なエンタープライズアプリケーションは、重くて広範な依存関係に依存しています。各依存関係は通常100万行以上のコードを持っています。しかし、Lokadには次の領域でサードパーティの依存関係がありません。

  • リレーショナルデータベース:代わりに、イベントストアとコンテンツアドレス可能なストアを使用しています。
  • キャッシュシステム:代わりに、計算と一時的なストレージを共有します。
  • パイプラインマネージャー:代わりに、独自のスケジューラーを使用しています(詳細は以下で説明します)。
  • 分析エンジン:代わりに、EnvisionというDSLが分析機能を提供します。
  • 機械学習ツールキット:代わりに、DSLも機械学習の機能を提供します。
  • データ可視化ツールキット:代わりに、独自のツールキットを提供しており、DSLとの緊密な統合が行われています。

なお、私たちはプラットフォームの開発を徹底的に内部化している一方で、暗号アルゴリズムなどのセキュリティコンポーネントについては、意図的にかつ排他的にサードパーティのコンポーネントに依存しています。

フロントエンド

フロントエンドとは、エンドユーザーがアクセスできる要素を指します。これには、データをLokadに移動するために使用される自動化エージェントも含まれます。これらのほとんどのやり取りは、HTTPSを介してWebブラウザを通じて行われますが、Lokadはファイルを移動するためにFTPSおよびSFTPプロトコルもサポートしています。

go.lokad.com

このサービスは、LokadのWebアプリのフロントエンドフレームワークであるReactをホストしています。これはシングルページアプリケーション(SPA)として実装されています。このフロントエンドは、他のサービスが提供するAPI(アプリケーションプログラミングインターフェース)に依存しています。

このサービスは静的コンテンツのみを提供しており、主にJavaScriptです。サーバーサイドの動作部分はなく、特にデータの永続化もありません。この設計は意図的なものであり、このサービスの最優先事項は「稼働時間」です。どのサービスがWebを介してアクセスされても、サービス「go.lokad.com」は利用可能でなければなりません。

ダッシュボード

ダッシュボードサービスは、Lokadが提供するWeb分析ダッシュボードのレンダリングを担当します。

各ダッシュボードは、実行されたEnvisionスクリプトの結果です。ダッシュボードは広範に事前計算されていますが、一部のインタラクティブな機能も提供されています。Envision自体の設計により、クライアント側のインタラクションは元のデータセットのサイズに関係なく「小規模データ」の問題になります。

クライアント側では、ダッシュボードの最初のレンダリングに必要なすべてのデータを単一のHTTPSリクエストで取得します。この単一リクエストの設計は、レイテンシのオーバーヘッドを最小限に抑えるためです。バイナリパッキングと圧縮により、帯域幅の消費を最小限に抑えます。

サーバーサイドでは、特定のダッシュボードに関連するデータはコンテンツストアによってパックされます。再度、パッキングは、通常、ダッシュボードの複雑さに関係なく、ネットワークリクエストの総数を非常に低く保つために必要です。通常、半ダース以下です。

インタラクティブなダッシュボードでは、エンドユーザーはブラウザを介して表示することができる以上の大容量のデータセットにアクセスできます。1つのビューから次のビューに切り替えるためには、クライアント側のリクエストは最大で1つだけ必要です(サーバーサイドのリクエストも非常に少ないです)。

Lokad vs 主流

Lokadの一定のレンダリング時間の設計は、主流のビジネスインテリジェンス(BI)や他の分析ツールとは異なります。このようなツールで見つけることができるダッシュボードは、必ずしもタイルのリストで構成されています。これらのタイルは、ブロックやウィジェットと呼ばれることもあります。これらのタイルに対処する標準的な方法は、タイルごとに1つのクライアント側リクエストを行い、その後、指定されていない/保証されていない数のサーバーサイドリクエストを行うことです。残念ながら、この設計では、各タイルごとに遅延があり、すべてのダッシュボードのタイルの完全な表示には数秒かかることがよくあります。

Lokadは、ダッシュボードのレンダリングに使用されるデータのパッキング戦略をEnvisionコンパイラに作成させることで、この問題を解決しています。これにより、クライアント側では一桁のリクエスト、さらにはサーバーサイドでもそれ以下のリクエストが実現されます。私たちの視点からは、ダッシュボードのパフォーマンスは、ダッシュボードをバックアップするスクリプトによってコンパイル時から始まります。

さらに、ほとんどの分析ツールは、ダッシュボード(時にはレポートとも呼ばれる)が要求されるまで、計算の大部分を後回しにします。残念ながら、この設計は、同時にアクセスするエンドユーザーの数が増えると、サーバーサイドの計算リソースに避けられない競合が生じるため、パフォーマンスの問題も発生します。これらのリソースは、すべてのエンドユーザーに提供するために共有されています。

Lokadは、ダッシュボードを事前計算することで、この問題を大幅に軽減しています。私たちの設計では、エンドユーザーの要求に応じて、ダッシュボードを提供するために必要なサーバーサイドのリソースを最小限に抑え、コンテンツストアを主要な(しかし意図的な)ボトルネックとしています。この設計により、大量のエンドユーザーに対して最小限のパフォーマンス低下でダッシュボードを同時に提供することができます。

プロジェクト

プロジェクトサービスは、スクリプトとバッチジョブ(シーケンスと呼ばれる)を管理します。このサービスにはプロジェクトの階層があります。適切なアクセス権を持つエンドユーザーは、プロジェクトを表示、編集、実行することができます。Lokadによって実装された特注の予測最適化アプリには通常、プロジェクトのリストが含まれています。

イベントソーシングは、ここで詳しく説明されているイベントストアを活用して、ユーザーエントリを永続化するために使用されます。サービスに対して発行されるすべての単一のコマンドまたはインタラクションは、ログとして記録され、結果としてイベントに変換されます。ユーザーインターフェースは、すべてのイベントをまとめて取得した状態を表示します。このアプローチは、CQRS+ESパターンとして知られています。CQRSは、コマンドとクエリの責任の分離を意味し、ESはイベントソースを意味します。

CQRS+ESパターンは、アプリケーションに導入されたすべての変更の完全な履歴化を設計上提供します。Lokadの場合、これはアカウント内に存在するEnvisionスクリプトに適用されたすべての変更のGitのようなバージョン管理を提供します。

Lokad vs 主流

UIとUXの観点では、プロジェクトサービスは主流のアプローチに従っています。しかし、その裏では、CQRS+ESパターンが、ほとんどのエンタープライズソフトウェアで使用されるCRUD(作成、読み取り、更新、削除)の代わりに使用されています。このパターンは、リレーショナルデータベースをイベントストア(以下で詳しく説明します)で置き換えます。

CQRS+ESアプローチは、CRUDパターンに比べて多くの利点を提供します。たとえば、優れたセマンティクス、優れた監査可能性、そしてLokadの場合は優れたパフォーマンスを提供します。なぜなら、Envisionソースコードの保存と取得に使用する永続化戦略を広範にカスタマイズできるからです。実際、プロジェクトサービスによって永続化されるデータの大部分は、Envisionソースコードです。

コード

コードサービスには、Envision言語に特化した統合開発環境(IDE)があります。このWebベースのIDEには、コードの着色、自動補完、静的コード解析によって可能になるコードアクション(例:変数の名前変更)など、モダンな開発環境で期待されるすべての機能が備わっています。

コードサービスの複雑さの大部分は、リアルタイムフィードバックを提供する言語サーバーのバックエンドにあります。このフィードバックには、自動補完のヒント、エラー、またはコードアクションが含まれます。特に、この機能の低レイテンシを維持することは、通常のキーボード操作のペースを考慮すると、かなりの遅延が目立つことになるため、主要な技術的課題の1つです。

ファイル

Lokadの各アカウントには、ファイルを保存するための独自のスペースがあります。ファイルサービスには、ファイルを管理するために使用される分散バージョン管理ファイルシステムがあります。このファイルシステムは、WebインターフェースとSFTPおよびFTPSプロトコルを介してアクセスできます。概念的には、このファイルシステムはGitリポジトリに非常に似ていますが、ギガバイトサイズのフラットファイルを対象としています。

ファイルのバージョン管理は、CQRS+ESパターンによって保証されており、ファイルシステム自体の進化を反映した「コミット」のシーケンスの表示を補完しています。ファイルの内容の永続性は、内容アドレス可能なストア(以下で詳しく説明します)によって保証されています。

コード(Envisionスクリプト)とデータの両方をバージョン管理することで、Lokadはプラットフォーム上で展開されるサプライチェーンアプリの過去の動作の完全な再現性を提供します。サプライチェーンの観点からは、この機能は、サプライチェーンアプリによって生成されるすべての異常な結果をトラブルシューティングするために重要です。

Lokad vs 主流

ファイルサービスは、Envision言語(正確性の利点)、Envision IDE(生産性の利点)、およびEnvisionランタイム(パフォーマンスの利点)と緊密に統合されています。これらの利点は、汎用のファイルシステムでは実現が難しいものです。汎用のファイルシステムは、まず最初にカーネルのコンパニオンとしての役割を果たすソフトウェアです。

さらに、ファイルサービスの多くの利点は、汎用のファイルシステムよりも少ないことをすることで得られます。たとえば、ファイルサービスでは、複数のプロセスによる同時更新を許可しません。このような機能は、サプライチェーンアプリの特定のコンテキストでは、サプライチェーンの専門家に対してIT中心の問題と複雑さを露呈するだけで、価値を提供しません。

アカウント

アカウントサービスのIdentity and Access Management(IAM)は、Lokadの中でも最も主流な部分の1つです。これは、Lokadアカウント、Lokadユーザー、認証(理想的には委任された認証)、およびLokadアカウントでユーザーができることまたはできないことを制御するACL(アクセス制御リスト)を管理します。

このサービスもCQRS+ESパターンを利用しており、すべてのIAM操作の完全な監査ログを提供します。IAMの性質上、これらの操作は常にセキュリティに関連するものであり、イベントソースを監査ログとして使用することで、選択されたイベントが記録されていないことによる監査ログの危険性など、セキュリティの問題のクラス全体を排除します。

パーシステンスレイヤー

パーシステンスレイヤーは、その名前が示すように、Lokadが管理するすべてのデータの永続性を確保します。これらのデータは2つの異なるフレーバーで提供されます。まず、クライアントがLokadにアップロードするファイル、またはEnvisionスクリプトによって生成されるファイルです。次に、ユーザー操作(自動化されたエージェントなど)によって生成されるイベントです。Lokadは、Azure Blob Storageをキーバリューストアとして使用して、両方のデータフレーバーを永続化します。

イベントストア

イベントストアは、Lokadプラットフォームのすべてのサービスによって生成されるイベントを永続化します。このストアは、Lokadの状態遷移データベースを表します。私たちは、イベントストアのソースコードをオープンソースとして公開しています。

このコンポーネントはシンプルです。信頼性のある方法でイベントを永続化し、提供します。これは、基礎となる分散キーバリューストア(Azure Blob Storage)を利用しています。イベントのサイズは小さくなることが期待されており、512kBまで制限されていますが、通常は1kB未満です。

ストリーミングアナリティクスやプロジェクション管理などの「スマート」な機能はありません。再度、Lokadはより少ないことをすることで、永続化レイヤーの機能によって引き起こされるSQLインジェクション攻撃などの問題のクラス全体を排除します。

コンテンツアドレス可能ストア

コンテンツアドレス可能ストア(CAS)は、LokadプラットフォームにアップロードされるファイルまたはEnvisionスクリプトによって生成されるファイルを永続化します。私たちは、コンテンツアドレス可能ストレージのソースをオープンソースとして公開しています。

CASは、通常数MBの大きなファイルをサポートすることを目的としており、上限は100GBです。CASは、ファイルまたはファイルフラグメントをカラムストア戦略に従ってシャーディングして保存するために使用されます。カラムストアは、実行レイヤーのアクセスパターンに合わせて配置されます。

実行レイヤー

名前の通り、実行レイヤーはLokadプラットフォーム内でEnvisionスクリプトの実行を保証し、いくつかのコンポーネントを含んでいます。簡潔さのために、ここでは特筆すべきもののみをリストアップします。コンパイラは、Envisionスクリプトを分散仮想マシン向けの命令に変換します。スケジューラは、Envisionスクリプトのトリガー、スケジュール、シーケンスを行うためのユーティリティサービスです。Thunksは、Envision仮想マシンのコードネームです。最後に、IonicはEnvision仮想マシンによって生成および消費されるカラムストア戦略の名称です。

コンパイラ

コンパイラは、EnvisionスクリプトをLokadプラットフォームの分散仮想マシン向けのバイトコードに変換します。このコンパイラのアーキテクチャは、主流の設計プラクティスに従っています。パーシングから始まり、内部表現から次の表現への一連の変換を経て、バイトコードの生成で終わります。

Envisionソースコードとの対話をガイドする言語サーバーバックエンド(上記のCodeサービスを参照)も、コンパイラの一部です。言語サーバーは、進行中のコーディング中にEnvisionプログラマーに有意義なフィードバックとエラーメッセージを提供するために、状態を保持しています。ほとんどのキーストロークの後、スクリプトはまだ有効なEnvisionスクリプトではありませんが、言語サーバーの状態により、有意義なフィードバックが提供されます。

スケジューラ

スケジューラは、手動での介入なしにEnvisionスクリプトを実行するためのユーティリティサービスです。スケジューラは、Envisionスクリプトの実行をトリガーし、スケジュールし、シーケンスします。また、実行が予想されるタイムラインから逸脱した場合にアラート機能も提供します。スケジューラは、プラットフォームの他の部分との緊密な統合により、ファイルの変更トリガー(たとえば、ファイルの受信時にEnvisionスクリプトを開始する)や、失敗の早期検出(シーケンス内のEnvisionスクリプトの1つがコンパイルされない場合など)など、さまざまな便利な機能を提供します。

Thunks

Thunksは、Lokadの分散仮想マシンのコードネームです。実際に、Envisionスクリプトは分散実行をネイティブに利用しています。この意味では、Envisionコンパイラは単一のマシンではなく、クラスターを対象としています。この機能は、大規模なデータセットをタイムリーに処理するために重要です。Envision言語は、自動並列化のために特別に設計されています(一般的なプログラミング言語では非常に難しい機能です)。偶然にも、クラスターは、1つのマシンが応答しなくなった場合にスクリプトの実行の信頼性を高めることも提供します。

Thunksに専用のマシンクラスターは、マルチテナントの形式でプールされます。この機能は、コンピューティングコストを抑えるために不可欠です。典型的なサプライチェーンのユースケースでは、通常1日あたり1つの実行バッチがあり、通常は60分未満です。マルチテナンシーを介したリソースのプール化により、コンピューティングリソースに関連するオーバーヘッドが大幅に軽減されます。このオーバーヘッドは、24時間ごとに請求されるコストであり、実際には1時間(またはそれ以下)しか利用されません。

詳しい説明については、Victor Nicollet氏の4部作のEnvision仮想マシンの設計をご覧ください。また、一般的なパフォーマンスに関するLokadの質問に対する回答については、セキュリティFAQのセクション8をおすすめします。