【问题标题】:where to store state on server在服务器上存储状态的位置
【发布时间】:2010-09-16 15:37:14
【问题描述】:

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

场景如下: 用户可以查看哪些其他用户在线,然后挑战其中一个。另一个用户收到挑战并接受它。现在两个用户都得到了 5 个问题,并且比赛同时开始(几乎同时)。然后当用户浏览问题或解决问题时,状态也会在另一个用户屏幕上更新。

本质上,这与 Facebook 聊天等聊天系统非常相似。我可以看到谁都在线。我将聊天消息发送给我的朋友,然后他可以回复该消息,并且该回复会在我的聊天窗口中看到。

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

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

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

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

【问题讨论】:

    标签: ajax architecture chat


    【解决方案1】:

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

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

    【讨论】:

    • 好点。我已经删除了我的答案(因为你有参考)。
    • 感谢您的指点...我会阅读并尝试这些并很快在这里发布我的结果..
    • 关于将状态存储在缓存中的问题。如果服务器开始耗尽内存怎么办。缓存不会销毁对象以释放内存,在这种情况下,另一个传入的请求可能会抛出错误?这是一种可能性吗?在这种情况下我该怎么办?
    • 使用缓存来存储消息将适用于原型,并且使您不必编写“消息过期”逻辑来管理消息的生命周期。在“真正的”应用程序中,您需要管理生命周期(将它们推入队列,并将过期的从队列的另一端弹出)。 msdn.microsoft.com/en-us/library/dd267265.aspx
    猜你喜欢
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    • 2015-01-09
    • 2013-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多