Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当数据库表发生更改时,如何在.NET应用程序中接收通知?_C#_.net_Sql Server_Database - Fatal编程技术网

C# 当数据库表发生更改时,如何在.NET应用程序中接收通知?

C# 当数据库表发生更改时,如何在.NET应用程序中接收通知?,c#,.net,sql-server,database,C#,.net,Sql Server,Database,我一直想知道,大型应用程序(如Facebook)如何处理实时通知用户事件(例如,有人给你发了消息)而无需每秒钟/分钟汇集数据库等(我假设Facebook不会每秒钟检查登录用户是否有任何新消息)。当数据库发生更改(插入或更新行)时,Sql Server中是否有任何方法可以在C#应用程序中接收通知 (希望)让事情变得更实际一点: 如何处理桌面聊天应用程序,该应用程序连接到数据库服务器,并允许用户互相发送消息,为接收消息的人提供即时通知 您将如何处理通知用户他们在“脱机”时收到的消息 让我们假设应用程

我一直想知道,大型应用程序(如Facebook)如何处理实时通知用户事件(例如,有人给你发了消息)而无需每秒钟/分钟汇集数据库等(我假设Facebook不会每秒钟检查登录用户是否有任何新消息)。当数据库发生更改(插入或更新行)时,Sql Server中是否有任何方法可以在C#应用程序中接收通知

(希望)让事情变得更实际一点:

如何处理桌面聊天应用程序,该应用程序连接到数据库服务器,并允许用户互相发送消息,为接收消息的人提供即时通知

您将如何处理通知用户他们在“脱机”时收到的消息


让我们假设应用程序将处理数百/数千个用户,并且通知应该是(相对)即时的(不需要每隔10秒汇集数据库以查看是否有任何新消息)。

使用数据库作为通信中心将遇到瓶颈,并且可能无法很好地扩展。既然你提到了.NET,你应该看看Signal


在一个简单的用例中,您可以写入数据库,同时发送notify事件,告诉客户机检查您刚刚写入数据库的新内容

这取决于你需要的准确度。Facebook不需要精确,所以它可以按照自己的意愿来做。对于准确的实现,例如,如果存在服务质量问题,因此消息必须在特定时间到达目的地,那么您需要在客户机和服务器之间建立双向链接。Websockets在HTTP上执行此操作,尽管它实际上只是屏蔽了一个轻量级HTTP轮询机制

在确保特定会话(用户)获取消息方面,我倾向于使用内存中的数据库(如Redis)作为生成的所有消息的可写缓存。如何在Redis中为用户会话更新会话存储取决于消息的来源;可能是

1) 因为数据库更新 2) 由于外部系统输入 3) 因为一段时间过去了,一些日程安排的看门人到达了


在所有这些情况下,您可能会使用不同的技术通知分布式消息缓存,因此在SQL Server中,您可能会生成一个触发器来写入传出消息表,可能会使用SQL Server对象代理或MSMQ作为消息转储。一个单独的进程将解析消息转储并上载Redis缓存。

如上所述,这应该是服务器(应用程序)的责任,而不是数据库

我会用以下方法来做:

应用程序(让它成为中央服务器)必须确保消息是否已传递。如果已交付,请将其保存到历史记录(db)。如果不是,则将其保存到延迟消息(db)

如果用户处于脱机状态,他/她将有一段时间登录到服务器。登录完成后,服务器会向他/她发送延迟的消息

在无服务器/分布式系统的情况下,逻辑将是相同的,只是延迟的消息可能只保存在客户端,或者保存在执行消息路由的某些节点上