マイクロサービスの束で作られたアプリケーションを実装しています。それぞれがかなり単純で、独自のタスクに焦点を当てています。それらの2つをService A
とService B
と呼びましょう。どちらもNodeJに実装されており、Rest APIを公開しています。次に、いくつかのcronジョブを実行する必要があります(1 m間隔で実行するもの、5 m、1時間で実行するものなど)で、あるサービスから別のサービスにデータを渡す必要があります。たとえば、Service A
からのデータが必要です。外部APIを呼び出し、データを処理してPOST
をService B
に送信します。
この例ではTask Master
と呼ばれる別のマイクロサービスを使用することを考えました。これにより、このcronジョブとその他すべて(アプリケーション内のすべてのサービス)が実行され、すべてのcronジョブのマスターになります。
これはかなり一般的なパターンです。あなたが説明したことの多くを達成するための既存のソフトウェアがあるのに十分一般的です。 kubernetes cronjobs 、または セロリ定期タスク などを確認してください。ほとんどのサーバーレスフレームワークは、定期的なスケジューリングもサポートしています。独自のものを作成する前に、既存の実装を徹底的に見直します。
ご覧ください Apache Airflow 。また、ほとんどのサーバーレスフレームワークには、それを達成するための機能があります。たとえば、ユーザーがPythonおよびAWS Lambdaという名前のZappaというフレームワークを使用しているとします。このフレームワークには、ジョブをスケジュールするための設定があります。
非常に複雑なジョブをスケジュールする別の方法は、 Jenkins をいくつかのプラグインで使用して、いくつかの単純なパイプラインを構築することです。
マイクロサービス環境では、サービス間でデータを同期する必要があります。それにはさまざまなオプションがあります。 Cronの仕事を持つことは間違いなくアプローチの1つです。他のアプローチとしては、ETL、サービスが他のサービスから必要なデータを定期的にフェッチするサービス、メッセージングまたはPub/Subメカニズムなどがあります。他の方法や同期が考えられますが、これらは最も一般的で効果的な方法のようです。仕事をする方法が複数ある場合は、さまざまなアプローチの長所と短所を比較するとよいでしょう。
[〜#〜] etl [〜#〜]サービスAのデータベースを直接読み取り、データを変換してサービスBのデータベースに挿入/更新するように構成できるツールがあります。ツールのクラスはETL(Extract Transform And Load)と呼ばれます
Cronジョブ設計したcronジョブは、いくつかの点でETLに似ています。ただし、大きな違いは、データベーススキーマではなく、アプリケーションによって指示される言語を使用するアプリケーションとの仕事上の話です。
サービスAから定期的にデータをフェッチするサービスB
Messagin/Pub-SubメカニズムサービスAは、イベント/メッセージをkafka、RabbitMQ、Azure Service Busなどのメッセージブローカー/イベントシステムに発行します。サービスBはこれらのイベント/メッセージをリッスンします。イベント/メッセージには、サービスBに必要なすべてのデータを含めることができます。または、サービスBがサービスAにクエリを発行して、イベント/メッセージの受信に関する追加のデータを取得できます。
個人的には、サービスBを開始してサービスAから定期的にデータをフェッチし、システムの複雑さが増すにつれてイベントメカニズムに移行することを好みます
ここで達成しようとしているのはコンテキストマッピングです。各マイクロサービスはコンテキストを表し、データをあるコンテキストから別のコンテキストに移動(マッピング)しています。理想的には、この通信を非同期にして、コンテキスト間のデータが最終的に整合するようにする必要があります。トランザクションの一貫性が必要な場合は、コンテキスト/マイクロサービスの境界を再検討する必要があります。
コンテキストマッピングを実現するにはいくつかの方法があります。メッセージバスを使用できます。ServiceAはServiceBが必要とするデータを含むメッセージを発行し、ServiceBはこのメッセージにサブスクライブしてデータを受信します。ただし、これにはまだ導入されていない場合があり、実装にかなりの労力を要するインフラストラクチャの使用が含まれます。
このコンテキストマッピングを実現する別の方法は、ポーリングを使用することです。 ServiceBは、ServiceAから必要なすべてのデータについてServiceAをポーリングできます。このポーリングは別のプロセス(AWS Lambda、Azure Function、またはcronジョブの可能性があります)にすることができますが、それでもマイクロサービスServiceBの一部になります。結局のところ、ServiceAのデータを必要とするのはServiceBです。あなたがそれを説明したように、ServiceAはServiceBから何も必要としません。ここでの照明はマイクロサービスは複数のプロセスになる可能性があるだと思います。これまでに説明したことを踏まえると、これはシナリオに最も適したコンテキストマッピング戦略であると思います。 TaskMasterサービスは必要ありません。必要なデータの取得を処理するServiceBの構成プロセスのみです。
他にもコンテキストマッピング戦略があります。詳細については、Vaughn VernonのIDDDを参照してください。