問題タブ [signalr-backplane]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
1019 参照

signalr - SignalR バックプレーン

SignalR BackPlane を実装しましたが、問題なく動作しているようです。

このURLを参考にしました。

SingalR を実現するために、新しい SQL データベースを作成しています。私の疑問は、なぜ新しい DB を作成しなければならないのか、またはなぜ既存のデータベースを利用できないのかということです。

  1. 新しい DB を作成するのではなく、既存の DB を使用して同じことを達成できますか?
  2. 既存の DB に新しいテーブルを作成するには、どの SQL パーミッションに注意する必要がありますか?
0 投票する
1 に答える
384 参照

signalr - ScaleoutMessage ブロードキャストをインターセプトする方法: (編集: メッセージを ServiceBus SignalR バックプレーンに直接送信する方法)

次のシナリオがあります。

  1. サーバー上の特定のリソースに対するユーザー リクエスト。このリクエストは長時間実行されるタスクであり、2 ~ 3 秒から 10 秒ほどかかります。ユーザーが待機したいので、ジョブチケットをユーザーに発行します。
  2. リクエストを受け取ると、そのリクエストを永続ストレージに保存し、JobTicket (GUID) としてトークンをユーザーに発行します。
  3. ユーザーはハブに接続して、その GUID に関する情報を取得します。

バックグラウンドで:

  1. その要求に対して何らかの操作を実行するために、WAS Hosted と Windows Service があります。
  2. 完了すると、WAS Hosted/Windows サービスは、ジョブが完了した Web アプリケーションを呼び出します。
  3. そこから、ジョブ チケットに基づいてどのユーザーを識別し、その接続でジョブが完了したことをユーザーに知らせます。

現在、サーバーのファームがあり、正常に動作している Windows Server On Prem ServiceBus 1.1 を使用していますが、ServiceBus ベースのバックプレーン メッセージ ブロードキャストを傍受できず、メッセージがすべてのクライアントに送信されるという課題があります。ファームがあるため、ユーザーは途中で接続を切断し、ロードバランサーに基づいて他のサーバーに接続する可能性があるため、シームレスに統合するために Service Bus を使用してスケールアウトする必要があり、アプリケーションの内部目的にも使用しているため、複雑なソリューションで他の組み合わせを使用したくありません。

使用してみIHubPipelineModuleましたが、メッセージ ブロードキャストをスケールアウトしても通過しません。SignalR コードを直接接続してデバッグしようとしましたが、時間がかかりました。実際のコードで恣意的なものを台無しにしたくありません。私が見ることがOnReceiveできるように、メッセージが来ていることがわかりますが、それ以上フォローすることはできません. ブロードキャストメッセージを傍受し、リソースを浪費してすべてのクライアントではなく、意図したクライアントに確実に送信されるようにする小さなメカニズムと、セキュリティ上の懸念が必要です。

この問題で私を助けてください、それは過去4日間からちょっと立ち往生していて、解決策にたどり着くことができず、同時にパターンを確立したいので、この種の小さな問題のために特別なビルドをフォークしたくありません.あなたの専門家の 1 人が、シームレスにそれを行う方法を知っていると確信しています。

ありがとう、シュレニク

0 投票する
1 に答える
645 参照

azure - SignalR を使用してメッセージ配信時間がうまくスケーリングされないのはなぜですか?

私はまだ SignalR をテストしていますが、私にとって本当に重要なことの 1 つは、メッセージができるだけ早くクライアントに届くことです (私はリアルタイムの株価を扱っています)。

問題は、私が試したほぼすべてのシナリオで、完全にローカルから Azure で実行されている数百のインスタンス (バックプレーンなどを含む) まで、メッセージがサーバーからクライアントに到達するまでの時間が長くなることです。接続されたクライアントの数が増えるにつれて指数関数的に増加します。

Hubs、Persistent Connection、.net クライアント、phantomJS で実行されている JS クライアント、zombieJS および node.js でこれを試しました...何十もの構成を試しましたが、動作は常に同じであり、それが私を導きますこれは SignalR に固有のものであるという結論に達しました。

SignalR が非常に少数のサーバーで数千の同時クライアントを処理できることはわかっていますが、メッセージが (同じ Azure リージョン内で) 通過するのに数秒かかる場合、それは役に立ちません。

メッセージが遅くなる原因は何ですか?

ありがとう

0 投票する
1 に答える
590 参照

signalr - 外部データストアで接続を管理するシグナル

接続されたクライアントにメッセージをプッシュするバックグラウンド プロセスを持つ方法を探しています。

私たちが取っているアプローチは、新しい接続が確立されるたびに (OnConnected)、mongo db に (後でフィルタリングするために) いくつかの要求メタデータと共に connectionId だけを保存することです。そして、イベントが発生すると (クライアントまたはバックエンド プロセスからトリガーされます)、workerrole (別のバックグラウンド プロセス) がそれらのイベントをリッスンし (メッセージングなどを介して)、イベントの詳細に基づいて、キャプチャされたメタデータを使用して接続されたクライアントをフィルター処理します。

アプローチは問題ないようですが、次の場合に問題があります

  1. シグナルサーバーがダウンする
  2. サーバーがバックアップされる前に、クライアントが切断されます(ブラウザを閉じるか、何でも)
  3. signalr サーバーが復旧します

  4. 接続ステータスがわからないmongodbに接続が残っています

これを行うためのより良い方法があるかどうか疑問に思っています。目標は、接続されている特定のクライアントをターゲットにして、バックエンド サービス (ワーカー ロール) からメッセージをプッシュできるようにすることです。

ちなみに、サービスバスバックプレーンでスケールアウトオプションを使用しています

0 投票する
0 に答える
359 参照

signalr-hub - SQLBackPlane を使用して HubContext から SignalR メッセージを送信するときの MissingMethodException

HuContext から (つまり、別のクライアントではなくサーバーから) シグナル メッセージを送信しようとすると、次のエラーが表示されます。これは私の元のプロトタイプでは機能していましたが、 Backplane を実装してから機能しなくなりました:

メソッドが見つかりません: 'Microsoft.AspNet.SignalR.Hubs.IHubConnectionContext Microsoft.AspNet.SignalR.IHubContext.get_Clients()'.

Hub クラスにいくつかの静的メソッドを作成して、処理中の SignalR メッセージの起動を容易にしました (私が見つけた例に従います)。Hub クラスは現在、次のようになっています (簡潔にするために同様のメソッドは削除されています)。

このエラーが発生する理由は、バックプレーンを使用するときにこのタイプの要件にアプローチする方法が間違っているためだと思われます (プロトタイプで機能したため)。これをやっています。

SignalR クライアント クラスをサーバーに追加して、クライアントと同じように接続できると思いますが、それは非常に洗練されたアプローチとは思えません。

0 投票する
1 に答える
279 参照

database - SignalR バックプレーンとデータベース入力?

負荷分散された Web サーバーのセットアップがあるため、SignalR バックプレーンとのクライアント/サーバー通信に SignalR を使用したいと考えています。

クライアントがサーバーに何かを送信するときに、1 つのサーバーのみがデータベースに書き込むようにするにはどうすればよいでしょうか? バックプレーンはメッセージをすべてのサーバーに再ルーティングしますが、すべてのサーバーが同じことを DB に書き込めるわけではありません!

SignalR バックプレーンを使用し、1 つのサーバーからのみ DB に書き込む方法についてのテクニック/提案はありますか?

私の理想的な世界では、1 つのサーバーでメッセージを受信し、メッセージを DB に保存してから、メッセージ (受信メッセージと同じではない可能性があります) をバックプレーンに配置します。

0 投票する
1 に答える
126 参照

asp.net - SignalR Scaleout が重複した呼び出しを行う

システムをスケールアウトしようとしていますが、Azure Web サイトでバックプレーン スケールアウトの将来をどのように使用するかがわかりません。これが私たちのシナリオです。

私たちの問題は、ブローカー側のバックプレーンがブローカー クライアントへの複数の呼び出しを引き起こしていることです。

私たちは何をすべきか?

ここに画像の説明を入力