2017-06-27 12 views
0

私たちのデザインでは、パラドックスの何かがあります。私たちはプロジェクトのデータベースを持っています。各プロジェクトにはステータスがあります。プロジェクトを「準備完了」状態から「クリーンアップ」状態に変更するためのREST APIがあります。 2つのことが起こらなければならない。RESTfulなAPIが部分的にしか成功しない場合の対処

  1. 更新データベース
  2. でステータスが承認者に電子メールを送信

現在、RESTfulなAPIが1を行い、それが成功した場合、2

しかし、時には行います電子メールは送信に失敗します。しかし(1)は既にコミットされているため、ロールバックすることはできません。

電子メールを送信する前にコミットが成功したことを確認したいので、私はコミットする前に電子メールを送信したくありません。

私はについて考えて、手順1を元に戻しましたが、それは非常に難しいです。ステータスの変更には、履歴テーブルに新しいレコードが追加されるため、削除する必要があります。そして、他の人が同時に他の変更を加えた場合、元に戻すことが邪魔になるかもしれません。

どうすればいいですか? (2)が失敗した場合、クライアントに「200 OK」を返す必要がありますか?

最高のオプションのように、「500 Server Error」と「プロジェクトステータスが変更されました。」というエラーメッセージが返されます。ただし、承認者に電子メールを送信できませんでした。適切な処置をとってください。」

私は1回の操作で1 + 2を行うべきではないでしょうか?しかしそれはクライアントに負担をかけるだけです。これは悪いことです!

答えて

1

ただ、いくつかのランダムな思考:

あなたが提出の日時と一緒にステータスフラグを通知を送ってきたことができます。電子メールが成功すると、それは反転し、そうでない場合はそのまま残ります。変更が送信されると、コードはすべての未送信の通知を繰り返し、送信しようとします。あなたが訴えているバックエンドのデータベースが何であるか分かりませんが、多くの人が電子メールを送信する機能を持っていると思います。 1時間ごとに実行されるスケジュールされたジョブ(SQL Serverエージェントfor MSSQL)を使用して、送信の日時が一定時間経過した場合に送信を試みるか、失敗した場合にアラームを設定することができます。

tiがそれほど重要でない場合は、sendgridなどのサードパーティのサービスを統合してバックアップ送信mechとして実行することもできます。これはもちろん$$以上になるでしょう...

これまで、私はいつも、このような機能をバックエンドワーカープロセスに分けていました。これは、この種の管理タスクをさまざまなアプリケーションにわたって処理しています。毎朝、一部の通知が送信されます。 15分ごとに送られる人もいます。いくつかは毎週の要約です。私がクラッシュして火傷した場合、私はイベントログを点灯させて、指定されたアプリケーションイベントで私たちに警告するサーバー監視ツールを持っているほど十分に(幸運にも不運な)

+0

ありがとうございます!それは非常に役に立ちます。はい、バックグラウンドタスクを使用して電子メールを管理できると思います。 –

関連する問題