我已经开发了一个聊天Web应用程序,该应用程序使用SQLServer数据库交换消息。

所有客户端每X秒进行一次轮询,以检查新消息。

显然,这种方法消耗了许多资源,我想知道是否有一种“便宜”的方式。

我使用相同的方法来进行“存在”:检查谁在进行。

有帮助吗?

解决方案

对于实时聊天应用程序之类的内容,我建议使用带有SQL备份的分布式缓存。我碰巧喜欢与Enyim .NET提供商一起使用的Memcach,所以我会做以下操作:

  1. 用户帖子消息
  2. 系统将消息写入数据库
  3. 系统将消息写入缓存
  4. 所有用户定期进行新消息调查缓存

数据库备份允许您在清除缓存或重新启动应用程序的情况下预紧缓存,但是功能位依赖于内存中缓存,而不是对数据库进行轮询。

其他提示

在不使用浏览器插件/扩展名(例如flash或java applet)的情况下,浏览器本质上是一种单向通信工具。该请求必须由浏览器启动以获取数据。您不能将数据“将”数据推向浏览器。

许多使用AJAX轮询方法的Web应用程序模拟服务器“推”。诀窍是平衡频率/数据大小与带宽和服务器资源。

我只是对Gmail做了一个简单的观察。它每5秒进行一次HTTPPOST调查。如果没有“状态”更改,则响应数据大小只有几个字节(不包括HTTP标头)。当然,Google拥有庞大的服务器资源和带宽,这就是为什么我提到:找到良好的平衡。

那就是“改善用户体验与服务器资源”。您可能需要采用一种创造性的投票策略方式,而不是每x秒进行一次直接的民意调查。

例如,如果没有政党A的活动,则每3秒进行一次民意调查。当政党A打字时,每5秒进行一次调查。这只是一个插图,您可以随身携带这些数字,也可以提出更有效的数字。

最后,数据交换。挑战是找到一种传递最小数据大小以传达相同信息的方法。

我的2美分:)

如果您使用的是SQL Server 2005,则可以查看通知服务。当然,这将锁定您进入SQL 2005,因为在SQL 2008中删除了通知服务,因此旨在允许SQL Server通知客户端应用程序的数据库应用程序。

如果您想要一些更可扩展的东西,则可以在用户记录上放置几个位标志。当用户出现消息时,将对新消息进行更改。当您阅读消息时,将其更改为0。这样,您正在阅读一个非常小的领域,该领域很有可能已经进入缓存。

工作流程准备好了。如果是1,请从消息表获取消息。如果是0,什么都不做。

在ASP.NET 4.0中,您可以 使用JavaScript对象和数组的观察者模式 IE:Ajax Json致电JQuery和 /或Pagemethods。

您将始终必须点击数据库,以分析是否有任何数据要返回。诀窍将是使这些调用小,仅在需要时返回数据。

SQL Server 2005内置了两个相关的解决方案,但仍在SQL Server 2008中使用:

1) 服务经纪人, ,这允许订阅者在队列上发布读取(带有等待的接收命令。)。在您的情况下,您需要通过使用这些队列中的服务代理服务来通过数据库发送消息,然后可以由等待客户端拾取。没有投票,等待的客户只会在收到消息时被激活。

2) 查询通知, ,这允许订户定义查询,以及当执行查询会更改的数据集时,接收通知。建立在服务经纪人的基础上,查询通知更容易使用,但效率也可能降低。 (并非查询通知及其兄弟姐妹,事件通知经常被误认为通知服务(NS),这引起了人们的关注,因为NS在2008年在2008年退役,但是,查询和事件通知仍然完全可用,甚至在SQL Server 2008中得到了增强)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top