2011-12-19 9 views
5

私は現在、クライアントにデータを転送する方法としてWebSocketを使用しなければならないプロジェクトに取り組んでいます。インフラストラクチャはこのように見えます。
クライアント - > Webサーバー - > Microsoft SQLデータベースMicrosoft SQLデータベースのWebSocketリスナー

私が最も理想的な状況は、このようなことだろうと思う: クライアントがサーバにソケットを開きます。 サーバーは、Microsoft SQLデータベースへのソケットを開きます。 データベースが更新されると(一部のデータが挿入されると)、DBはソケットにデータを書き込みます。 サーバーはデータをクライアントに書き戻します。 これはちょっと面倒かもしれませんが、多分クライアントから直接DBへのソケットを開くことができますか?

MSSQLデータベースが更新された場合、その情報を処理できるように、Webサーバーにソケットを自動的に通知する方法があるかどうかを知りたいと思います。

主な質問は本当にあります。私はこの仕事をどうやって作りますか?私は、Node.JSやSocket.IOのようなWebSocketで動作するいくつかのプロジェクトを見てきました。私はこの特定の機能を探す場所についての手がかりは見つけていませんが。私はNodeJS用のMSSQLデータベースのためのいくつかのむしろ不安定なドライバを見つけましたが、DBにソケットを作成し、データベースにポンピングされるとすぐにソケットを通してデータを送信する方法があるかどうかは分かりません。

私はまた、クライアントとdbの間のソケットを作ることは、今のところ問題ではないので、セキュリティが賢明ではないとは言えません。SQLはリアルタイムアプリケーションには向かない方法ですが、私は今、この問題の解決策を知っているが、深刻な性能の向上を疑う@tomfanningに

ありがとう:今:)

編集1のためにそれにバインドメートル。あなたに状況を描写させてください。 MSSQLデータベースでTriggerを使用する場合、私はこれが起こったと想像します。

状況1

  1. データベースはトリガーがCLRのスクリプトは、Webサーバーへの接続を行う
  2. を引っ張られ
  3. に更新されます。いずれか( は役に立たないオーバーヘッドである)ヘッダを開閉含む要求
  4. (S) が開くように有するソケットとすべてのトリガの近く又は 介してHTTPを介してWebサーバは、トリガを受信しクライアントの にデータを送信します。
  5. クライアントが更新されます。

そして今、同じシナリオを想像しますが、その後AJAX

状況2:AJAXは

  • を要求するために

    1. は1000ミリ秒のタイムアウトは、クライアントに設定されていますクライアントタイムアウトが発生し、AJAXリクエストが発生する
    2. データベースでクエリが実行され、結果が返信されます。
    3. クライアントが更新されます。

    状況1では、リクエストとソケットの送受信が必要です。状況2では、1つのリクエストのみが必要です。 AJAXリクエストのタイムアウトを10MSに設定すると、あたかもWebSocketのようなリアルタイムアプリケーションであるかのように見えますか?それとも、状況1が依然として効率的で、私は誇張していますか?

    ありがとうございます!

  • +0

    WebSocketを介して安全な方法でdbにアクセスできる場合は、私も可能です。私があなたのデータベースにアクセスできるなら、私はルルツのためにそれをトロールするでしょう。セキュリティは冗談ではありません。 – Raynos

    +0

    @Raynos私はセキュリティは冗談ではないと私は確かにそれを考慮に入れます。しかし、今のところこれを行う方法があるかどうかを知る必要があります。 –

    答えて

    3

    可能な解決策はT-SQL triggers on INSERT or UPDATECLR procedureで、メインアプリケーションに通知を送信します。通知はメインアプリケーションに送信され、Webサーバー経由でクライアントに送信されます。データベースをポーリングする必要がなくなります。

    あなたのコメントによれば、クライアント(ブラウザ)からの技術であるため、あなたのソリューションは再びポーリングされるため、避けたいと思っています。 WebSocketsは、ポーリングを必要とせずに、サーバからクライアントに真の「プッシュ」を行う機能を提供するため、ここにぴったりのように聞こえます。

    明らかに私はここで非常に一般的かつ理論的な用語で話しています。

    +0

    私は実際にポーリングを避け、アプリケーションでWebSocketを使いたいと考えています。しかし、引き金が引かれ、スクリプトが実行されているとすれば、データベースはソケット経由でWebサーバーへの接続を確立する必要があります。そうしないと、リンクなどの要求が開かれません。それは、オーバーヘッドのために私が避けたいヘッダーを構築しなければならないということです。クライアントからサーバにAJAXリクエストを送信する場合、1回のリクエスト+ソケット転送の代わりに1回のリクエストを受け取りますか? –

    +0

    クライアントコードがデータベースサーバーに直接話すことが考えられるどのようなシナリオにおいても賢明な考えはありません。したがって、ミドルウェアは常にテクノロジーに関係なく、1つではなく2つの接続(クライアントとWebサーバーの間、Webサーバーとデータベースサーバー間の1つ)を持つことになります。また、クライアント側から更新*を開始すると、ポーリングモデルより常にスケーラビリティが低いポーリングモデルになります。真のプッシュモデルが必要な場合は、データベースの最後から何らかの操作を開始する必要があります。 – tomfanning

    +0

    私はちょうど、データベース内のINSERTまたはUPDATEトリガーが、Webアプリケーションへの接続を1つだけ開いて、プッシュを受け取る必要があるクライアントの数(数十、数千..) WebSockets経由の通知。それは、何千ものクライアントが定期的にAJAX要求を送信して更新をポーリングするのではなく、データベースに大きな負担をかけることよりも優れています。 – tomfanning

    関連する問題