問題タブ [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.
dependency-injection - SignalR & Autofac - Redis バックプレーン スケールアウト
次のような状況があります: Autofac を依存関係リゾルバーとして使用する SignalR アプリケーションがあります。
そして、これがAutofacContainer
クラスです。
現在、Microsoft の公式の SignalR Redis スケールアウト ドキュメントGlobalHost.DependencyResolver
には、 to に通知する必要があると記載されていUseRedis
ます。
GlobalHost
私はアプリケーションでもう使用していないので(使用してもGlobalHost
Redis にはまったく動作がありません) ( Autofac と SignalR および Owin の統合が示すように):
OWIN 統合でよくあるエラーは、GlobalHost の使用です。OWIN では、最初から構成を作成します。OWIN 統合を使用する場合は、どこでも GlobalHost を参照しないでください。
Startup
クラスが現在構成されているため:
新しいresolver
タイプを作成するAutofacDependencyResolver
と、Redis PubSub に正常に接続されます。ただし、問題は、1 つのメッセージを送信しようとすると、そのメッセージが何千回も繰り返されることです。
(Chrome コンソールでは、サーバーから単一のメッセージを送信すると、無限ループに陥り、クライアントはそれを無限に受信します)。
したがって、問題は、Autofac を依存関係リゾルバーとして使用しているときに SignalR Redis スケールアウトをセットアップするにはどうすればよいかです (注: 別の依存関係リゾルバーを使用できる状況はありません)。
ありがとう!
編集: ソリューションに関する詳細情報が必要な場合は、この行のないリポジトリを次に示します。
ありがとう!
編集: いくつかのことを明確にする必要があるように感じます: を使用するresolver.UseRedis();
と、通常は (1 回) 送信されるすべてのメッセージが何度も送信されsubscribe "channelName"
ます。クライアントでの動作: 各メッセージは複数回送信されます。
次に行うことは、Autofac を使用しない基本的な SignalR アプリケーションを作成し、Redis の動作を確認することです。ただし、これは Autofac 関連の問題、より具体的には構成に関連する問題だと思います。
ありがとう!
更新: どうやら、Autofac を使用しない基本的な SignalR アプリにも同じ動作があります。この問題は Autofac とは何の関係もありません。
sql-server - Signalr 用の SQL Server バックプレーンのスケールアウト
SQL Server バックプレーンを使用して負荷分散された SignalR サービスを既に実装しており、正常に動作しています。バックプレーンを 2 つの SQL Server にスケールアウトしたいと考えていますが、その方法に関する SignalR 固有のドキュメントが見つかりません。SignalR 用に SQL Server バックプレーンをセットアップすると、必要なすべてのテーブルが作成および管理されます。
だから私の質問:
- SignalR 用に 2 つの SQL Server 間のサービス ブローカーをどのように構成しますか?
- SignalR SQL Server バックプレーンはサービス ブローカー通信も管理しますか?
- これは可能ですか?
asp.net - Redis を使用した SignalR スケールアウト バックプレーン
Redis バックプレーン スケールアウトで SignalR を使用しています。現在、Microsoft.AspNet.SignalR.Redis
パッケージには への依存関係がありStackExchange.Redis.StrongName
ます。
アプリケーションですでに Redis を使用していたので、StackExchange.Redis
パッケージをインストールしました。
Microsoft.AspNet.SignalR.Redis
Redis の厳密な名前のパッケージへの依存関係をインストールし、インストールしないことを選択すると、アプリケーションが動作しなくなります (クライアントはサーバーに接続しません。すべての接続方法を試行し、にフォールバックしますlongPolling
が、失敗します)。
奇妙なことに、インストールするとStackExchange.Redis.StrongName
(この時点で、厳密な名前のバージョンと通常のバージョンの両方があるため、Redis のすべてのタイプの識別子が重複しています)、厳密な名前のパッケージをアンインストールすると、すべてが機能し始めます。(厳密な名前のパッケージに依存関係がない場合でも)。
私の質問 - 厳密な名前のパッケージには、SignalR が使用する特定のものが含まれていますか (そして、アプリケーションを削除した後にアプリケーションが機能するのはなぜですか?)
ありがとう!
asp.net-mvc-5 - SignalR ハブでのユーザーごとの統計情報の更新
SignalR 2 と MVC 5 を使用して単純なゲームに取り組んでいます。各ユーザーの「死」と「キル」の数を追跡する必要があります。これらの統計は、複数のサーバーにまたがる複数のゲーム インスタンス (ユーザーは複数の同時セッションを持つことができます) から読み取り/書き込みを行う必要があります。
フィールドを追加することApplicationUser : IdentityUser
は合理的な解決策ですか? Facebook やその他の OAuth プロバイダーを簡単にサポートできるので、組み込みの認証システムを使用する予定です。
マルチユーザー/スレッド/サーバーの問題を減らし、高度にスケーラブルな最適化された方法でこれらの統計を更新するにはどうすればよいですか? 統計自体は単純で、おそらくユーザーごとに数秒に 1 回しか更新されませんが、複数のサーバーにまたがる何百万ものユーザーをサポートできる設計が必要です。
たとえば、MVC コントローラー内に次のコードを追加して、統計を更新できることはわかっています。
ただし、それは非常に安全/トランザクション的ではないようです。別のプロセス/接続/サーバーがそのユーザーを同時に更新している場合、問題が発生する可能性があります。
純粋な SQL 設計では、SQL トランザクションで実行されて現在のカウンターを取得し、それをインクリメントするストアド プロシージャがおそらくあるでしょう。それを、さまざまな API レイヤー (OWIN、MVC、ASP.NET など) が提供するすべての機能を利用する優れた SignalR 設計に変換する方法がわかりません。理想的には、SQL への直接アクセスが問題になった場合に、簡単に Redis を追加できるものです。
c# - イベント ハブ プロセッサから SignalR サービス バス バックプレーンにメッセージを送信する際の問題
サービス バス バックプレーンで SignalR を使用しています。Web サーバーではないものからメッセージを開始しようとしています。(イベント ハブ プロセッサ)
次のコードは、C# コマンド ライン アプリで正常に動作します。
しかし、イベント プロセッサ コードに追加すると、黙ってデータを送信しません。私の質問は、これをイベント ハブ プロセッサで動作するように設定するにはどうすればよいかということです。
私は現在、メッセージをブロードキャストする Web サイトに Web 要求を送信することで、この問題を回避しています。
ありがとう。
c# - 1 つのバックプレーン上の複数の SignalR ハブ タイプ -- 長所/短所/スケーラビリティ?
最近、いくつかの Web アプリで SignalR を変更して、SQL バックプレーンを使用して Web ファームの状況で動作するようにしました。
微調整できるさまざまな方法の数は、それがどのように機能するか (スケーラビリティを最大化し、障害点を最小化するという目標に向かって) を調査するにつれて、頭の中で増えています。
現在、SignalR は各アプリで使用され、データベースに記録されている変更のポーリング駆動型ブロードキャストをサポートしています。
すべてのアプリのすべての SignalR インスタンスに対して 1 つのバックプレーンを使用することに関する重要な前提/観察:
1 つの共通バックプレーンを持つすべてのハブとハブ インスタンス (すべてのタイプ) は、1 つのメッセージバス上で動作します。
すべてのハブ インスタンスは、基本的にクライアント プールを「マージ」します。ハブ インスタンスは、所有しているクライアントの数を実際には認識できません。
一部の AppB_Hub からのメッセージ トラフィックは、AppA からのトレース出力で確認できます。もし AppA が同じ名前のハブを持っていたら、競合するだろうし、クライアントを共有していることに気付いていない限り、そうではないだろう。
質問/懸念/不明:
- 異なるハブ (異なるハブ タイプ、おそらく異なるアセンブリ) は適切に再生されますか? つまり、一方のメッセージと通話が他方に干渉することはありますか? どんな状況で?
- それはすべてネーミングに基づいていますか?つまり、AppAHub と AppBHub がうまくプレイしたい場合、メソッドとカルバックの名前が異なることを確認する必要がありますか? それとも、ハブ名が異なる限り、それらはすでに異なっていますか?
- 「十分に安全」であると仮定すると、各アプリが他のアプリのメッセージをふるいにかけるために「スケールアウト」しますか。ある程度の規模で別のバックプレーンを用意する価値はありますか。小規模でやる価値ある?例: 2 種類のハブ、それぞれの 2 つのインスタンス。
- あるいは、AppAHub と AppBHub が実際には同じハブへの 2 つのインターフェイスにすぎない可能性があるため、AppA は AppB に関する情報を保持できる可能性があり、その逆も同様です。それらすべてにすべてが供給されることがわかっている場合、それらが別々のハブであることに何か意味があるのだろうか。または、AppBメッセージをより明示的に「気にする」ようになったため、AppAの避けられない追加コストが発生しますか?
c# - SignalR Redis バックプレーンが機能しない - 依存関係の問題?
冗長 Azure Web アプリケーションの Redis (Azure キャッシュ) バックプレーンで SignalR を使用しています。数日前に、すべての SignalR メッセージが配信されていないように見える (過去には機能していた) ことを検出しました。これは、バックプレーンに問題があることを示しています。
このアプリケーションは、ASP.Net Owin の起動と、ハブの IoC として Autofac を使用し、次のように SignalR を起動します。
Redis バックプレーンの構成文字列を無効なものに変更しても問題ありません。接続できないだけです。SignalR コードは、Web ホストとは別のアセンブリにあります。
アプリケーション自体では例外は発生しませんが、SignalR をトレースするときに次のエラーが発生します。
SignalR.ReflectedHubDescriptorProvider 警告: 0 : アセンブリ "Microsoft.AspNet.SignalR.Owin、Version=1.2.2.0、Culture=neutral、PublicKeyToken=31bf3856ad364e35" の一部のクラスは、ハブの検索時に読み込めませんでした。[C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET
Files\root\79fa3057\a44a64e\assembly\dl3\75de3633\cfc73faf_eb21d101\Microsoft.AspNet.SignalR.Owin.dll]
元の例外の種類: ReflectionTypeLoadException 元の例外メッセージ: 1 つ以上の要求された型を読み込めません。詳細については、LoaderExceptions プロパティを取得してください。
ナゲットの依存関係の問題ですか?
これは、packages.config からの関連する抜粋です。
あなたの助けに本当に感謝します!
asp.net - セッション データの格納と SignalR バックプレーンに Azure Redis Cache を使用する
そこで、古いエンタープライズ レベルの ASP.net ソリューションを Azure に移行する準備をしています。セッション状態と SignalR Backplane の両方に単一の Azure Redis Cache を使用したかったのです。
チームの新しいメンバーとして、SignalR に慣れていない ので、出発点としてここにチュートリアルを作成しました。そこから、Session-State プロバイダーをセットアップし、それを機能させることができました。私はそれについてブログ投稿をしましたが、まだ共有するのに十分な評判がありません. :/
しかし、SignalR Redis バックプレーンを実装する段階になったとき、私は成功しませんでした。
これが私が試したコードです:
これは、Web サイトを起動し、SignalR 呼び出しが行われているページに移動するときに発生するエラーの例です。
誰かがこれを成功させていますか?