私が取り組んでいる場所は、いくつかの基本ルールを確立しようとすることであり、私たちが今抱えている議論は、コードの再利用のためのローカルライブラリとWebサービスの比較です。 Webサービスは、ほとんどの企業で人気のある選択肢のようであり、それが、ここにいるほとんどの開発者が頼りにしていることです。
真面目な仕事のためにWebサービスを効果的に使用する方法がわかりません。トランザクションを使用できない場合、複数のサービス呼び出しを安全に実行するにはどうすればよいですか?
通知が必要な特定の条件を満たす顧客をデータベースから取得するcronジョブがあるとします。ファックス、電子メールが送信され、問題を内部で追跡するためのチケットが作成されます。これは、forループで顧客ごとに発生する3つの異なるサービス呼び出しです。
どこかでエラーが発生した場合、たとえば、ファックスや電子メールが顧客に送信されてもチケットは作成されない可能性があります。さらに悪いことに、このcronジョブには、毎回同じ時点で失敗するバグが含まれている可能性があり、同じ顧客に繰り返しメールを送信します。ライブラリがすべてローカルである場合、すべてがトランザクションにラップされるだけで、それは起こりません。ただし、この例ではWebサービスを使用しています。
電子メールとFAXの方法では、実際にデータがデータベースでサポートされているキューテーブルに挿入され、順番に別のcronジョブプロセスで処理されることに注意してください。したがって、「電子メールの送信」および「ファックスの送信」サービスメソッドの呼び出しは、必要に応じて副作用なしで中止できます。
オプションは、このコードのチャンク全体をWebサービス自体に配置することです。これにより、Webサービス自体がトランザクションでEメール、FAX、およびチケット作成メソッドを呼び出します。ただし、トランザクションを使用するためのWebサービスメソッドを作成しています。この1つのcronスクリプト以外の場所から実際にこのメソッドを呼び出す必要がある正当な理由はありません。
この方法を一般的にどのように処理しますか?
あなたが説明しているのは、実際には 分散トランザクション 実装 2フェーズコミット です。一部のエンタープライズメッセージングプラットフォームには、その種のものをサポートするトランザクションマネージャーが含まれていますが、具体的な製品はプラットフォーム/言語に依存しています。私はそのようなツールの具体的な経験はありませんが、これらの指針が役立つことを願っています。
この特定のQ&Aに参加しているときに興味深いのは、参加しているDDD/CQRSメーリングリストの複数のプラットフォームをサポートするサービスに関する同様のスレッドがあることです。ここで私のアドバイスのいくつかを繰り返します。
異機種混合環境でトランザクションをサポートするための1つのオプションは、トランザクションをサポートし、それが使用されるすべてのプラットフォームでサポートされるトランスポートメカニズムを使用することです。 Advanced Message Queue Protocol (AMQP)はトランザクションをサポートし、今日一般的に使用されているほとんどすべての言語にネイティブAPIがあります。 RabbitMQ は、AMQPを実装するサーバーであり、堅牢なソリューションとして業界で吟味されています。
RabbitMQベースのシステムを利用することで、ESBに成長する必要がある場合に完全なESBを取得することができます。メッセージをチャネルにパブリッシュし、キューをサブスクライブします。それが本当に強力になるのは、チャネルとキューの間です。多くの興味深いことを実行できます。チャネルは複数のキュー(pub/sub)にフィードできます。キューは複数のチャネルからフィードできます。コンテンツなどに基づいてメッセージを異なるキューにルーティングできます。
私はトランザクションの代替方法(オーバーヘッドがあり、非同期操作をブロッキング操作に変える)について読んでいました。 RabbitMQは publisher confirm と呼ばれるものをサポートしています。基本的には、公開されたメソッドのコールバックを登録して、失敗したトランザクションを処理できます。あなたの場合、それは電子メール/ファックスの要求を取り消し、チケットを削除する可能性があります。
もちろん、ウサギの穴(しゃれを許して)はそこからさらに深くなります。 Rabbitを使用して、内部と外部の両方のWebサービスで複雑なオーケストレーションを行うことができます。
一般に公開されているWebサービスの場合、非常に単純になります。サービス(SOAP、REST、JSONなど)は、適切なサービスキューにメッセージをパブリッシュし、そこから内部システムに処理させるだけです。
また、情報がすぐに戻ってくることが予想されるシナリオで、要求/応答メッセージを作成するための機能もあります。
あなたが探しているキーワードは「ウェブサービスの振り付け」です。
Wikipedia の記事をチェックしてください。
私が作成したサービスアプリでこれを処理する方法は、必要なトランザクションを処理するラッパーを作成することでした。私の場合、Webサイト、デスクトップアプリ、またはWindowsサービスによって行われたユーザー要求は、Webサービスにクエリを実行する必要があり、結果とユーザーのオプションに基づいて、ローカルDBと、オプションでリモートDBを更新する必要がありました。 Webサービス経由。次に、すぐに返され、電子メールで送信されたり、ファックスで送信されたりするレポートを生成する必要がありました。ローカルDB、電子メール、レポートの生成を制御できましたが、WebサービスやFAXサーバーでは制御できませんでした。
ラッパーを作成すると、トランザクション制御とエラー処理が改善されます。また、外部ソースからの内部ネットワークサービスへのアクセスを制御することにより、セキュリティを向上させました。一般に、コードが適切に再利用される限り(カットアンドペーストコーディングなし)、単一のソリューションに適切なラッパーを作成する正当な理由として、トランザクションとサービスの管理の必要性を理解しています。
真面目な仕事のためにWebサービスを効果的に使用する方法がわかりません。トランザクションを使用できない場合、複数のサービス呼び出しを安全に実行するにはどうすればよいですか?
できません。
あなたが尋ねるべき質問は、どのようにしてWebサービスフレームワークXでトランザクションを実装するかです。今、それは不可能だと思っているだけです。