同じASP.NETアプリケーションでバックグラウンドサービスを実行する
ServiceStackを使用する場合は、 WebサービスAPIとバックグラウンドサービスを同じASP.NETWebアプリケーションでホストできます。ServiceStackは、このストーリーをサポートしています。IMessageService
登録されている場合、すべてのOneWay Async HTTP呼び出しは自動的に延期され、登録されたMQサービスに公開されます(たとえば、Redis MQの場合、RequestDTOはServicesMQ受信ボックスで公開されます)。
さまざまなASP.NETアプリケーションでのバックグラウンドサービスの実行
ASP.NETホストの展開はWindowsサービスよりもASP.NETアプリケーションの方が簡単なので、StackOverflow Careersでは、BackOfficeサービスを個別のASP.NET Webアプリケーション(公開されていません)に分割することを選択しました。
一方向メッセージの場合、インターネット向けのキャリアWebサイトはRequest DTOをRedisにドロップし、 ServiceStackのRedisMQServerによって処理されます。通常の応答サービスの場合、Request DTOを再利用し、型指定されたC#サービスクライアントの1つを使用してServiceStackWebサービスを直接呼び出すことができます。
ServiceStackを使用する利点の1つは、組み込みのメッセージングAPIが既存のWebサービスを再利用できるため、特定のMQのみのサービスを開発しなくてもメッセージングの利点を享受できることです。
MQサービスが常に実行されていることを確認する
ASP.NETホストではバックグラウンドスレッドの実行が少し不安定になるため、Global.asaxにこれを追加してmqHost.Start()
、すべての要求の最後に呼び出し、何らかの理由で強制終了された場合にMQServerメインスレッドを開始します。
protected void Application_EndRequest(object sender, EventArgs e)
{
//If the MQ Host goes down for whatever reason, restart it
if (appHost == null) return;
var mqHost = appHost.TryResolve<IMessageService>();
if (mqHost != null)
mqHost.Start();
}
これは通常はNo-Opですが、何らかの理由でマスターバックグラウンドスレッドが強制終了された場合は、再度起動します。
Windowsサービスでのバックグラウンドサービスの実行
Windowsサービスを実行すると、AppDomainの再起動やASP.NET要求の制限を受けないため、バックグラウンドサービスにとっておそらく理想的な環境になります。Windowsサービスの展開とデバッグは難しく、クロスプラットフォームではないため、必要な場合を除いて、通常は避けています。ただし、このルートをたどりたい場合は、ServiceStackのWindowsサービスデモプロジェクトを確認する必要があります。