web-dev-qa-db-ja.com

バッチジョブタイプの処理を設計する最良の方法は何ですか

ERPシステムの一部で作業しています。このシステムでは、一連のバッチジョブと同様の方法でデータを処理する必要があり、最適なプログラムアーキテクチャの決定に苦労しています。私がここで尋ねているのは、多くの最先端のプログラミング手法を知らないことを知っていて、実現することなく古い方法でソフトウェアを設計することを心配しているからです。

私のシステムでは、データのバッチを処理し、処理ジョブを定期的にスケジュールできるようにし、オンデマンドで実行できるようにする必要があります。一部の処理は外部のWebサービスにも依存しています。

今の私のアーキテクチャは、1つのVisual Studio C#ソリューション(内部に複数のプロジェクトがある)を持っているということです。このソリューションは、ジョブをオンデマンドで実行するためのインターフェースを備えたプログラムを生成し、ジョブが自動的に実行されるようにスケジュールを構成することもできます。単一のプログラムには、すべてのバッチ処理コードも含まれています。

プログラム内で、各「バッチジョブ」は、public async Task BillOrders()などのメインコントローラークラスのメソッドを呼び出すことによって呼び出され、次に、高レベルのサービスクラスから適切なメソッドを呼び出し、低レベルを呼び出します。サービスなど。クラス自体はすべて、単一の責任の原則という点でかなりよく分離されています。メインコントローラーは各バッチジョブメソッドを非同期的に呼び出し、それらの監視、エラーの報告、スロットリングなどを処理します。

これはすべて機能しますが、これが私がやるべき方法ではないことを心配しています。具体的には、私の懸念は次のとおりです。

  1. 同じプログラム内にいくつかの個別のバッチプロセスタイプの関数があるため、プログラムのクラッシュまたはバグが原因ですべてのバッチプロセスが機能しなくなるのではないかと心配しています。また、さまざまなことを実行する単一のプログラムを用意するのも悪いようです。

  2. 各バッチプロセスは私のERPの1つの領域に関連していますが、さまざまな機能を備えた単一のコードベースを使用すると、単一のコードベースが作成され、複数の開発者が同時にさまざまな側面に取り組むことが困難になるのではないかと心配しています。

これを単一のプログラム(およびVisual Studioソリューション)として実行した主な理由の1つは、Entity Frameworkコンテキストとサービスクラスが各バッチジョブ間で共有されていることです。プログラムをいくつかの小さなプログラムに分割すると、各プログラムには同じコードである多くのクラスとEFコンテキストが含まれます。また、あるプログラムのサービスのバグ修正や拡張機能は、他のプログラムにコピーする必要があります。また、EFコンテキストには、Fluent APIで実行される数十のテーブルがあります。

一連のマイクロサービスを作成することを検討しましたが、横断的関心が非常に高いため、各マイクロサービスには、上で説明したものと同じEFコンテキストとサービスクラスが大量に必要になるため、マイクロサービスを使用するという目標を達成できません。

この種の一般的に受け入れられているアーキテクチャはありますか?私は何をしているのですか、それとも15年前のようにプログラミングしていますか?

3
Ben Rubin

同じプログラム内にいくつかの個別のバッチプロセスタイプの関数があるため、プログラムのクラッシュまたはバグが原因ですべてのバッチプロセスが機能しなくなるのではないかと心配しています。

同じプロセスで同時に複数のジョブを実行していますか?その場合、1つのエラーが他のジョブを終了させるリスクが少しあります。これは、プロセス全体を損傷するエラーに対してのみ発生します。これはかなりまれです。たとえば、メモリ不足、スタックオーバーフロー、プロセスの終了などです。それ以外の場合は、処理コードをtry-catchでラップして、それらを互いに分離できます。これがWebアプリケーションの機能であり、通常は非常にうまく機能します。

各ジョブを個別のOSプロセスとして実行することもできます。次に、ジョブは完全に分離されます。これには同じEXEファイルを再利用できます。起動することになっている多くの可能なジョブのどれをEXEに通知する整数または文字列のコマンドライン引数を作成します。

同じEXEファイルを再利用すると、多くのC#プロジェクトを作成する必要がなくなり、それらのプロジェクトに伴うコード管理のオーバーヘッドが発生します。

また、さまざまなことを実行する単一のプログラムを用意するのも悪いようです。

あなたの懸念は何ですか?たぶん、これは単一責任の原則に反するのではないかと心配しています。この原則は、同じコードが複数のことを実行することについてです。私の理解では、あなたの仕事は互いにかなり孤立しています。また、一般的なWebアプリケーションが数百または数千のさまざまな処理を実行しており、問題ではないことも考慮してください。 SRPは原則であり、厳密なルールではありません。あなたのために働くことをしてください。

各バッチプロセスは私のERPの1つの領域に関連していますが、さまざまな機能を備えた単一のコードベースを使用すると、単一のコードベースが作成され、複数の開発者が同時にさまざまな側面に取り組むことが困難になるのではないかと心配しています。

コードベースが扱いにくくなるのではないかと心配している場合は、コードを複数のプロジェクトに分割しても何も得られないと主張します。それでも、同じコード、同じ依存関係、異なる場所のアーキテクチャです。

コードを別の場所(追加のプロジェクトまたはサービス)に配置するだけでは、もつれの解決は不可能です。アーキテクチャを変更する必要があります。

したがって、ジョブごとに1つのEXE /マイクロサービスを構築する場合でも、各ジョブを単に作成する場合でも、それ自体がC#クラスであることは、アーキテクチャ上の違いはあまりありません。開発の複雑さが大幅に増すだけです。

あなたの仕事は互いにかなり分離されているので、私はそれらすべてを同じプロジェクトに入れることについて心配していません。

また、Entity Frameworkモデルなどのインフラストラクチャを共有したいようです。それは、物事をまとめておくための良い理由でもあります。

2
usr