更新SignalR轮询数据库(SignalR polling database for update

2019-07-18 05:05发布

我希望用SignalR提供更新到客户端,更新被从哪儿来的东西时,整个应用程序中发生被更新的消息表..

我的问题是,应用程序将有大约500-600个并发用户和我不能都具有针对该表到数据库的连接,并不断地轮询他们..

什么编号喜欢做的是有一个单一的东西{}?轮询表,然后更新集线器而不是每个连接轮询..我想用这种单身的? 所以也许当应用程序启动的东西被创建,然后,将完成所有的工作真的..

我的问题是 - 说我有一个单身是有其被解雇每次有一个更新时间事件..会的表现是什么样的说500个控制器订阅这个活动?

另外..如果有更好的方法来做到这一点,然后高兴说..这是我的第一个也是唯一的想法可悲!

任何帮助将是非常美妙!

编辑:数据带来的遗留应用程序提供的,我有过如何输入数据,因此将需要数据库查询的控制。

你。

Answer 1:

遗憾的是,这种解决方案并不signalR,但也许你可以从中获得灵感。

下面是下载GitHub上完整的例子



Answer 2:

我宁愿不轮询数据库,这将是一种浪费。 我会打开只有一个条目为我的数据(HTTP API等)的单点解决这个问题,然后广播更新通过SignalR集线器的所有连接的客户端。 布拉德·威尔逊这证明这种方法的一个超级酷的演示:

布拉德·威尔森-微软的现代网络堆栈,主演的ASP.NET Web API

下面是这种方法,它使用的ASP.NET Web API技术用于数据输入一个代码示例。 它在内存中的字典数据存储,但数据存储技术这里就不关注:

// 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
}

为此布拉德演示了应用程序的完整源代码也可以: https://github.com/bradwilson/ndc2012 。

另一种选择,你不喜欢,是使你的数据库,只要数据发生改变火的通知。 然后,你可以挑选并通过SignalR播放。 下面是一个例子:

使用SignalR和中的SqlDependency ASP.NET数据库更改通知



文章来源: SignalR polling database for updates