我开发了一个聊天Web应用程序,它使用SqlServer数据库来交换消息。
所有客户端每x秒轮询一次以检查新消息。
很明显,这种方法消耗了很多资源,我想知道是否有“更便宜”的方式。
我对“存在”使用相同的方法:检查是谁。
答案 0 :(得分:1)
不使用像flash或java applet这样的浏览器插件/扩展,浏览器本质上是一种单向通信工具。该请求必须由浏览器启动以获取数据。您无法将数据“推送”到浏览器。
许多使用Ajax轮询方法的Web应用程序来模拟服务器“推送”。诀窍是平衡频率/数据大小与带宽和服务器资源。
我只是对gmail做了一个简单的观察。它每5秒进行一次HttpPost轮询。如果没有“状态”更改,则响应数据大小仅为几个字节(不包括http标头)。当然谷歌拥有庞大的服务器资源和带宽,这就是为什么我提到:找到一个很好的平衡。
即“改善用户体验与服务器资源”。您可能需要采用创造性的轮询策略方式,而不是每隔x秒进行简单的轮询。
E.g。如果A方没有活动,则每3秒轮询一次。当A方打字时,每5秒轮询一次。这只是一个插图,你可以玩数字,或者提出一个更高效的数字。
最后,数据交换。挑战在于找到一种方法来传递最小数据大小以传达相同的信息。
我的2美分:)
答案 1 :(得分:0)
如果您使用的是SQL Server 2005,则可以查看Notification Services。当然,这将锁定您进入SQL 2005,因为在SQL 2008中删除了Notification Services,它旨在允许SQL Server通知客户端应用程序对数据库的更改。
如果您想要一些可扩展性更强的东西,可以在Users记录上放置几个位标志。当用户的消息进入时,将新消息的位更改为true。当您阅读消息时,将其更改为0.当人们登录和注销时也是如此。这样你就会读到一个非常小的领域,这个领域很可能已经在缓存中。
工作流程是否准备就绪。如果是1则转到消息表中的消息。如果它是0什么都不做。
答案 2 :(得分:0)
在ASP.NET 4.0中,您可以use the Observer Pattern with JavaScript Objects and Arrays即:使用jQuery和/或PageMethods调用AJAX JSON。
您将始终必须访问数据库以分析是否有任何数据要返回。诀窍在于使这些调用变小,只在需要时返回数据。
答案 3 :(得分:0)
SQL Server 2005内置了两个相关的解决方案,并且仍然可以在SQL Server 2008中使用:
1)Service Broker,允许订阅者在队列上发布读取(带有WAIT的RECEIVE命令..)。在您的情况下,您可能希望使用面向这些队列的Service Broker Services通过数据库发送您的消息,然后等待的客户端可以接收这些消息。没有轮询,等待的客户端只在收到消息时被激活。
2)Query Notifications,允许订阅者定义查询,以及当执行该查询时产生的数据集发生变化时的接收通知。基于Service Broker,查询通知更容易使用,但也可能效率稍低。 (而不是查询通知及其兄弟,事件通知经常被误认为是Notification Services(NS),这引起了关注,因为NS在2008年被解除了,但是,查询和事件通知仍然完全可用,甚至在SQL Server 2008中得到增强)
答案 4 :(得分:0)
对于像实时聊天应用程序这样的东西,我建议使用带有SQL支持的分布式缓存。我碰巧喜欢使用Enyim .NET提供程序进行memcached,所以我会做类似以下的事情:
数据库支持允许您在清除缓存或应用程序重新启动时预加载缓存,但功能位依赖于内存缓存,而不是轮询数据库。