トランザクションを使用できない場合、エンタープライズ環境でWebサービスを効果的に使用するにはどうすればよいですか?


14

私が取り組んでいる場所は、いくつかの基本的なルールを確立しようとしています。そして、私たちが現在持っている議論は、コードを再利用するためのローカルライブラリとWebサービスです。Webサービスは、ほとんどの企業で人気のある選択肢のようです。そして、それは、ここの開発者のほとんどが傾いていることです。

深刻な仕事にWebサービスを効果的に使用する方法がわかりません。トランザクションを使用できない場合、どうすれば複数のサービスコールを安全に実行できますか?

通知が必要な特定の条件を満たす顧客をデータベースから取得するcronジョブがあるとします。ファックス、電子メールが送信され、チケットを作成して問題を内部的に追跡します。これは、forループの各顧客に対して発生する3つの異なるサービスコールです。

そこのどこかでエラーが発生した場合、たとえば、ファックスとメールが顧客に送信されても​​、チケットは作成されない可能性があります。さらに悪いことに、このcronジョブにはバグが含まれていて、毎回同じポイントで失敗し、同じ顧客に繰り返しメールを送信する可能性があります。ライブラリがすべてローカルである場合、すべてをトランザクションにラップすることができますが、それはまったく起こりません。ただし、この例ではWebサービスを使用しています。

電子メールとFAXのメソッドは、実際にはデータベースにバックアップされたキューテーブルにデータを挿入します。これは、別のcronジョブプロセスによって処理されます。したがって、「電子メールの送信」および「ファックスの送信」サービスメソッドの呼び出しは、必要に応じて副作用なしで中止できます。

オプションは、このコード全体をWebサービス自体に配置することです。そのため、Webサービス自体は、トランザクションで電子メール、ファックス、およびチケット作成メソッドを呼び出します。ただし、トランザクションを使用するためだけにWebサービスメソッドを作成しています。この1つのcronスクリプト以外のどこからでも実際にこのメソッドを呼び出す必要がある正当な理由はありません。

このメソッドを一般的にどのように処理しますか?


完全な回答を提供するためには、さらに情報が必要です。サービスベースのアーキテクチャに移行する際には、考慮すべきことがたくさんあります。たとえば、異種(異なる言語とプラットフォーム)環境または同種(単一言語とプラットフォーム)環境がありますか。サービスバスシステムはありますか?そうでない場合は、実装する予定ですか?サービス(単一の場所のイントラネット、複数の場所のWAN、分散型クライアントがパブリックサービスAPIにアクセスする)へのアクセスをどのように計画しますか。「最適な」ソリューションに影響する多くの変数があります。
マイケルブラウン

@MikeBrown:サービスはすべて1つの言語で記述されますが、複数のプラットフォームで使用されます。EBSの実装については全く考えていません。私たちはどんな種類のサービス作業も始めていないので、何でも可能です。サービスは主にローカルネットワーク上で内部的に消費されますが、モバイルアプリケーションの場合は公開する必要があるものもあります。
ライガイ

「ライブラリがすべてローカルである場合、すべてをトランザクションにラップすることができ、それはまったく起こりません」。偽。このエラーは、電子メールの送信、最終的なデータベースの更新前に発生する可能性がありました。トランザクションは、電子メールまたはFAXをさかのぼって防止しません。
S.Lott

@ S.Lott:電子メールとFAXサービスの呼び出しは実際にはそれらをキューに挿入するだけで、別のプロセスによって配信されるためです。上記のトランザクションが発生した場合、キューの挿入は中止されます。
ライガイ

1
@ryeguy:質問を更新してください。質問にコメントを追加しないでください。これは、アーキテクチャの重要な部分です。質問でそれを開示してください。
-S.Lott

回答:


5

説明しているのは、実際には2フェーズコミットを実装する分散トランザクションです。一部のエンタープライズメッセージングプラットフォームには、そのようなことをサポートするトランザクションマネージャーが含まれていますが、具体的な製品はプラットフォーム/言語に依存しています。このようなツールの具体的な経験はありませんが、これらのポインターが役立つことを願っています。


3

この特定のQ&Aに参加しているので、私が参加しているDDD / CQRSメーリングリストで複数のプラットフォームをサポートするサービスについて同様のスレッドがあるのは興味深いことです。ここでアドバイスを繰り返します。

異種環境でトランザクションをサポートするための1つのオプションは、トランザクションをサポートし、それが使用されるすべてのプラットフォームでサポートされるトランスポートメカニズムを使用することです。高度なメッセージキュープロトコル(AMQP)は、支持取引を行い、今日一般的に使用されているほぼすべての言語のネイティブAPIがあります。RabbitMQはAMQPを実装するサーバーであり、堅牢なソリューションとして業界で精査されています。

RabbitMQベースのシステムを活用することで、システムに成長する必要がある場合にフルESBを使用できるようになります。メッセージをチャネルに公開し、キューにサブスクライブします。それが本当に強力になるのは、チャネルとキューの間で、多くの興味深いことを実行できることです。チャネルは複数のキュー(pub / sub)にフィードでき、キューは複数のチャネルからフィードできます。コンテンツなどに基づいてメッセージを異なるキューにルーティングできます。

私はちょうどトランザクションの代替手段について読んでいました(オーバーヘッドが発生し、非同期操作をブロッキングopに変えます)。RabbitMQは、パブリッシャー確認と呼ばれるものをサポートしています。基本的に、公開されたメソッドのコールバックを登録して、失敗したトランザクションを処理できます。あなたの場合、メール/ファックスのリクエストを取り消し、チケットを削除できます。

もちろん、そこからウサギの穴(しゃれを許して)はさらに深くなります。Rabbitを使用して、内部Webサービスと外部Webサービスの両方で複雑なオーケストレーションを行うことができます。

一般向けのWebサービスでは、非常に簡単になります。サービス(SOAP、REST、またはJSON)は、適切なサービスキューにメッセージを発行し、そこから内部システムに処理させるだけです。

情報がすぐに戻ってくると予想されるシナリオ向けに、要求/応答メッセージを作成する機能もあります。



1

作成したサービスアプリでこれを処理する方法は、必要なトランザクションを処理するラッパーを作成することでした。私の場合、Webサイト、デスクトップアプリ、またはWindowsサービスによって行われたユーザーリクエストは、Webサービスを照会し、結果とユーザーのオプションに基づいて、ローカルDBと、オプションでリモートDBを更新する必要がありましたWebサービス経由。その後、すぐに返されるレポートを生成し、電子メールやファックスで送信する必要がありました。ローカルDB、電子メール、レポートの生成は制御できましたが、WebサービスやFAXサーバーは制御できませんでした。

ラッパーを作成すると、トランザクション制御とエラー処理が改善されました。また、外部ソースから内部ネットワークサービスへのアクセスを制御することにより、セキュリティを強化しました。一般に、コードが適切に再利用される限り(カットアンドペーストコーディングなし)、単一のソリューションに適切なラッパーを作成する正当な理由として、トランザクションとサービスの管理の必要性を認識しています。


1

深刻な仕事にWebサービスを効果的に使用する方法がわかりません。トランザクションを使用できない場合、どうすれば複数のサービスコールを安全に実行できますか?

できません。

あなたが尋ねるべき質問は、WebサービスフレームワークXでトランザクションを実装するにはどうすればよいですか?今、あなたはそれが不可能だと思っているだけです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.