在服务器上存储状态的位置

时间:2010-09-16 03:41:31

标签: ajax architecture chat

我正在我的应用程序中开发一个功能,我需要在两个用户之间存储特定系列操作的状态,就像基于ajax的聊天服务一样。

方案如下: 用户可以看到哪些其他用户在线,然后挑战其中一个。其他用户收到挑战并接受。现在两个用户都被给予5个问题并且匹配同时开始(几乎同时)然后当用户通过问题导航或解决它时,状态也在另一个用户屏幕上更新。

基本上这与聊天系统非常相似,比如说facebook聊天。我能够看到谁都在线。我发送聊天消息给我的朋友,然后他可以回复那个消息并在我的聊天窗口看到该消息。

我相信所有这一切都可以通过使用ajax来实现。我可以轻松地对.asmx webservices进行ajax调用,并为特定用户检索对象,因为可以在那里访问Session。但是,我想知道在哪里维护状态,因为会话是针对特定用户的,我希望我的特定对象可供两个特定用户访问。

我在哪里存储州?或者以基于Ajax的聊天为例,我应该在哪里存储User1输入的消息以及Uer1何时输入如何向user2显示?

我正在考虑应用程序对象,但读取它不予推荐。

你对这样的事情有什么建议?

1 个答案:

答案 0 :(得分:1)

如果您尝试“接近实时”消息传递,您可能需要查看HTTP轮询(a.k.a.长轮询)。我不会像过去看到的那样使用SQL进行时间消息传递和短期状态转换。如果在单个Web服务器上运行,只需将状态保持在会话中或ASP.NET缓存中。如果在多个Web服务器上运行,请查看分布式缓存,如memcached,Velocity(Win 2008)或NCache。然后将缓存的数据提供给坐着和等待的AJAX请求(因为长轮询)。关键的设计问题是缓存密钥的设计(没有双关语),需要包含用户特定事件数据的用户ID。

P.S。存在用于大规模,近实时消息分发的框架,其解决了当数百个客户端同时参与长轮询时遇到的扩展问题。这些框架的广义名称是“Comet”,它们在向许多客户广播相同的消息时最有用。