Ray*_*nos 94 javascript ajax web-applications multi-user
我有一个网页,显示来自服务器的大量数据.通信是通过ajax完成的.
每次用户交互并更改此数据(假设用户A重命名某些内容)时,它都会告诉服务器执行操作,服务器返回新更改的数据.
如果用户B同时访问该页面并创建一个新的数据对象,它将再次通过ajax告诉服务器,服务器将返回该用户的新对象.
在A的页面上,我们有一个带有重命名对象的数据.在B的页面上,我们有一个新对象的数据.在服务器上,数据具有重命名的对象和新对象.
当多个用户同时使用该页面时,我有什么选择让页面与服务器保持同步?
可以避免在每次更改时锁定整个页面或将整个状态转储给用户等选项.
如果有帮助,在此特定示例中,网页调用静态web方法,该方法在数据库上运行存储过程.存储过程将返回它已更改的所有数据,而不再返回.然后静态web方法将存储过程的返回转发给客户端.
赏金编辑:
您如何设计一个多用户Web应用程序,它使用Ajax与服务器通信,但避免了并发问题?
即对数据库的功能和数据进行并发访问,而不存在数据或状态损坏的风险
Chr*_*sen 157
概述:
嗨雷诺斯,
我不会在这里讨论任何特定的产品.其他人提到的是一个很好的工具集(可能已经将node.js添加到该列表中).
从架构的角度来看,您似乎遇到了版本控制软件中可以看到的相同问题.一个用户检查对象的更改,另一个用户想要以另一种方式更改同一个对象=>冲突.您必须将用户更改集成到对象,同时能够及时有效地提供更新,检测和解决上述冲突.
如果我在你的鞋子里,我会开发这样的东西:
确定一个合理的级别,你可以定义我所谓的"原子工件"(页面?页面上的对象?对象内部的值?).这取决于您的Web服务器,数据库和缓存硬件,用户数量,对象数量等.这不是一个简单的决定.
对于每个原子工件都有:
服务器或伪服务器组件,能够有效地向相关用户提供相关的更改日志.观察者模式是你的朋友.
一个javascript客户端,它能够与上面的服务器进行长时间运行的HTTP连接,或者使用轻量级轮询.
一个javascript artifact-updater组件,当连接的javascript客户端通知被监视的工件历史记录中的更改时刷新站点内容.(再次观察者模式可能是一个不错的选择)
一个javascript artifact-committer组件,可能会请求更改原子工件,尝试获取互斥锁.它将通过比较已知的clientside artifact-version-id和当前的serverside artifact-version-id来检测工件的状态是否在几秒钟之前被另一个用户更改(javascript客户端和提交进程因素的延迟).
一个javascript冲突解决方案,允许人类改变是正确的决定.你可能不想只告诉用户"有人比你快.我删除了你的改变.去哭吧." 很多选择来自相当技术的差异或更加用户友好的解决方案似乎是可能的.
那怎么滚...
我希望这可以成为你自己想法的开始.我相信还有更多的可能性.我非常欢迎任何批评或改进此帖子,维基启用.
Christoph Strasen
vic*_*ooi 13
我知道这是一个老问题,但我想我只是想进来.
OT(操作转换)似乎非常适合您对并发和一致的多用户编辑的要求.这是Google Docs中使用的一种技术(也用于Google Wave):
有一个基于JS的库使用操作变换 - ShareJS(http://sharejs.org/),由Google Wave团队的成员编写.
如果你愿意,还有一个完整的MVC网络框架 - 基于ShareJS的DerbyJS(http://derbyjs.com/)可以为你完成所有工作.
它使用BrowserChannel进行服务器和客户端之间的通信(我相信WebSockets支持应该在工作中 - 它之前是通过Socket.IO,但是由于开发人员的Socket.io问题而被取出)初学者文档是一个但是,此刻有点稀疏.
我会考虑为每个数据集添加基于时间的修改图章.因此,如果要更新数据库表,则应相应地更改已修改的时间戳.使用AJAX,您可以将客户端的修改时间戳与数据源的时间戳进行比较 - 如果用户落后,则更新显示.与此网站定期检查问题的方式类似,以确定在您输入答案时是否有其他人已回答.
| 归档时间: |
|
| 查看次数: |
28822 次 |
| 最近记录: |