IPhoneアプリ用のRESTfulAPIを構築しています。
ユーザーが「チェックイン」したとき[新しい行をテーブルに挿入]次に、その挿入からデータを取得してWebサービスを呼び出し、その挿入に基づいてプッシュ通知を送信します。
これを行うことを考える唯一の方法は、trigger
を介して行うか、挿入が成功したときに実際の挿入メソッドを使用してWebサービスを呼び出すことです。それは私には悪い考えのように思えます。
これについて何か考えがあったのか、それとも私が考えていなかったより良いアプローチがあるのか疑問に思いました。
技術的には可能だとしても、それは本当に良い考えではありません!トリガーは非常にスリムである必要があり、長時間の操作(Webサービス呼び出しは間違いなくそうです)を伴うべきではありません!アーキテクチャを再考してください-これを行うためのより良い方法があるはずです!
私の推奨事項は、トリガーでWebサービスを呼び出す必要があることを「通知」するタスクを、そのWebサービス呼び出しの実際の実行から分離することです。
何かのようなもの:
トリガーコードで、「後でWebサービスを呼び出す」をテーブルに挿入します(無駄のない高速な状態を維持するためにINSERT
だけです-それだけです)
実際のトリガーの実行とは別にこれらの呼び出しを行い、そのWebサービスから取得したデータをデータベースの適切なテーブルに格納する非同期サービス(SQLジョブまたはできればWindows NTサービス)があります。
トリガーは非常に厄介なものです-それは常に非常に速く、非常に無駄がないはずです-最大でINSERT
または2つを実行します-そして、トリガー内のカーソルや他の長い操作(Webサービス呼び出しなど)を絶対に避けてください)
Brent Ozarは、 スケーリングしない開発者の間違いトップ1 に関するすばらしいWebキャスト(SQL PASSで発表)を公開しており、トリガーは彼が最初に焦点を当てるものです!強くお勧めします
それはビジネスニーズに依存します。これはビジネスロジックであり、BLで処理する必要があるため、通常はトリガーを使用しないようにします。
しかし、答えはあなたの質問に「はい」です。それは可能です。Webサービスを非同期で呼び出すようにしてください。そうすれば、Webサービスの呼び出しが終了するまで挿入が遅れることはありません。
OneWay Webサービスの使用を検討することもできます。つまり、ファイアアンドフォーゲットです。
しかし、他の人が指摘しているように、トリガーを使用しない方が常に良いでしょう。
適切にアーキテクチャ化されている場合、データベースと通信できるコードは1つだけである必要があります。つまり、単一のサービスでDALを抽象化したものです。そこに引っ掛けて、挿入後に必要なものを作ります。
DALサービスを介さずに、データベースに直接アクセスしてデータベースに書き込むことができるさまざまなアプリケーションが多数ある場合は、トリガーを使用します。これもまた、起こるのを待っている災害です。
内部でホストされているサードパーティアプリケーションを処理する必要がある場合、つまりデータベースサーバー自体にはアクセスできるが、データベースに書き込むコードにはアクセスできない場合に、トリガーが発生する可能性がある別の状況。
トリガー->キュー-> SP-> XP_XMDShell-> BAT-> cURL->サードパーティのWebサービス
トリガーを使用してキューテーブルにレコードを挿入し、次にカーソルを使用してキューエントリをプルするストアドプロシージャを使用しました。
WSDLやサードパーティのAPI開発者へのアクセスがなく、プロトタイプを完成させる緊急の必要があるため、ストアドプロシージャはXP_CMDShellを呼び出し、パラメーターを使用して.batファイルを呼び出します。
Batファイルは、REST/JSONの呼び出しと応答を管理するcURLを呼び出します。
それは無料で、迅速で、確実に機能します。アーキテクチャ的に純粋ではありませんが、プロトタイプを公開しました。
ストアドプロシージャはどうですか?トリガーで設定する代わりに、ストアドプロシージャを呼び出します。これにより、データが挿入され、場合によっては他の処理が実行されます。
私の知る限り、トリガーは実行できる範囲がかなり制限されています。ストアドプロシージャには、より多くのスコープがある場合があります(またはない場合があります)。
最悪の場合、いつでも独自の「API」ページを作成できます。データを直接挿入する代わりに、データの挿入とプッシュ通知の両方を実行できるAPIページをリクエストします。
ユーザーがページにアクセスしたときに、そのWebページに別のテーブル(message_queueを呼び出します)にエントリを作成させることをお勧めします。
次に、サーバー上のWindowsサービス/ * nixデーモンにmessage_queueテーブルをスキャンさせ、Webサービスを介してモバイルアプリへのプッシュを実行します。 SQLのトランザクション処理の能力を活用して、キュー処理を管理できます。
このアプローチの良いところは、1つのスタンドアロンサーバーですべてを開始でき、スケールアップするにつれてWebサイト、データベース、サービス/デーモンを異なる物理サーバーまたはサーバークラスターに分離できることです。