8

SignalRを使用してクライアントに更新を提供したいと思っています。更新は、アプリケーション全体で発生したときに更新されるメッセージテーブルから取得されます。

私の問題は、アプリケーションに約500〜600人の同時ユーザーがいて、すべてのユーザーがデータベースに接続していて、テーブルに対して常にポーリングすることができないことです。

どのidがやりたいのかは、テーブルをポーリングしてから、各接続のポーリングではなくハブを更新することです。これにシングルトンを使用することを考えていましたか?したがって、アプリケーションが起動すると、すべての作業を実際に実行する何かが作成される可能性があります。

私の質問は、更新があるたびに発生するイベントが発生したシングルトンがあったとしましょう。このイベントにサブスクライブしている500個のコントローラーのパフォーマンスはどのようになりますか?

また..これを行うためのより良い方法がある場合は、言ってください..これは悲しいことに私の最初で唯一のアイデアです!

どんな助けでも素晴らしいでしょう!

編集:データはレガシーアプリケーションによって提供され、データの入力方法を制御できないため、データベースのポーリングが必要になります。

ste。

4

2 に答える 2

14

無駄になるので、データベースをポーリングしたくありません。この問題に取り組むには、データの単一のエントリポイント(HTTP APIなど)を1つだけ開き、SignalRHubを介して接続されているすべてのクライアントに更新をブロードキャストします。Brad Wilsonは、このアプローチを示す非常にクールなプレゼンテーションを行っています。

Brad Wilson-ASP.NETWebAPIを主演するMicrosoftの最新のWebスタック

これは、データ入力にASP.NETWebAPIテクノロジを使用するこのアプローチのコードサンプルです。データストアにメモリ内ディクショナリを使用しますが、ここではデータストレージ技術は重要ではありません。

// This hub has no inbound APIs, since all inbound communication is done
// via the HTTP API. It's here for clients which want to get continuous
// notification of changes to the ToDo database.
[HubName("todo")]
public class ToDoHub : Hub { }

public abstract class ApiControllerWithHub<THub> : ApiController
    where THub : IHub {

    Lazy<IHubContext> hub = new Lazy<IHubContext>(
        () => GlobalHost.ConnectionManager.GetHubContext<THub>()
    );

    protected IHubContext Hub {

        get { return hub.Value; }
    }
}

public class ToDoController : ApiControllerWithHub<ToDoHub> {

    private static List<ToDoItem> db = new List<ToDoItem> {

        new ToDoItem { ID = 0, Title = "Do a silly demo on-stage at NDC" },
        new ToDoItem { ID = 1, Title = "Wash the car" },
        new ToDoItem { ID = 2, Title = "Get a haircut", Finished = true }
    };
    private static int lastId = db.Max(tdi => tdi.ID);

    // Lines removed for brevity

    public HttpResponseMessage PostNewToDoItem(ToDoItem item) {

        lock (db) {

            // Add item to the "database"
            item.ID = Interlocked.Increment(ref lastId);
            db.Add(item);

            // Notify the connected clients
            Hub.Clients.addItem(item);

            // Return the new item, inside a 201 response
            var response = Request.CreateResponse(HttpStatusCode.Created, item);
            string link = Url.Link("apiRoute", new { controller = "todo", id = item.ID });
            response.Headers.Location = new Uri(link);
            return response;
        }
    }

    // Lines removed for brevity
}

Bradがデモしたアプリケーションの完全なソースコードも入手できます:https ://github.com/bradwilson/ndc2012 。

もう1つのオプションは、データが変更されるとすぐにデータベースに通知を送信させることです。次に、それを取得して、SignalRを介してブロードキャストできます。次に例を示します。

SignalRとSqlDependencyを使用したASP.NETのデータベース変更通知

于 2013-01-14T15:50:11.303 に答える
0

このソリューションはsignalRではありませんが、アイデアを得ることができるかもしれません。

これがGitHubでダウンロードするための完全な例です

于 2013-01-14T21:15:26.633 に答える