【问题标题】:How to implement "other users viewing this object"如何实现“其他用户查看此对象”
【发布时间】:2012-02-10 01:02:25
【问题描述】:

例如,Zendesk 有一个名为 Agent Collision Notification 的功能 - 当您编辑工单时,如果其他人编辑此工单,您会收到一条注释。

支持此类功能的基础架构是什么? This question 的目标似乎是相同的,但水平要低得多。

为了使系统完全动态(也通知第一个查看者)和合理的快速,可能需要一些类似彗星或 websocket 的东西。但与聊天系统(一个主要的彗星示例)不同的是,票务系统中的用户会不断地切换页面。

这样的程序流程和服务器基础架构是什么?

【问题讨论】:

  • 如何在客户端(comet、websockets、AJAX 等)实现这一点取决于您,但系统的根通常基于在表中有一个或两个额外的列保存您要执行此操作的记录。这种事情通常被称为“记录锁定”。您要么在记录上有一个布尔“锁定”列(简单)或两列,“lockwho”保存拥有记录的用户引用,“lockwhen”保存时间戳,以允许您解锁过期锁(复杂)。生成锁定消息时,只需检查这些列。
  • 感谢您的指点。但我更多的是考虑不锁定的非正式警告行。对于锁定,我们使用时间戳和乐观锁定。

标签: http websocket comet


【解决方案1】:

如果您想允许实时协作,那么您会感兴趣的this question 也提到了操作转换。还有a question about operational transformation libraries

这样的程序流程和服务器基础架构是什么?

我为 Pusher 工作,所以我可以告诉您一种使用我们技术的解决方案。

  1. 用户 A 打开可能存在“冲突”的页面。在页面内订阅该页面的channel
  2. 用户 A 开始编辑页面。向服务器发送一个 AJAX 请求,以便有一些关于页面正在编辑的事实的持久状态。在频道上触发一个事件,表明用户正在编辑页面。
  3. 用户 B 打开页面。页面加载并可以显示来自正在编辑页面的持久状态的信息。
  4. 用户 A 完成编辑并向服务器发出更新页面状态的请求。触发一个事件,表明没有人在编辑页面。此事件将分发给用户 B(更新后的页面也可以通过事件内或在收到事件时通过 AJAX 请求分发)。
  5. 用户 B 现在知道他/她可以编辑页面。他们开始编辑(参见第 2 步。)并通知用户 A,用户 B 现在正在编辑页面。

使用presence 也很酷,这样您就可以看到还有谁在查看该页面,并允许用户在发生更改时讨论更改。

【讨论】:

  • “Presence”正是 Zendesk 实现的:“Joe 和 Jim 也在查看此页面”。谢谢指点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
  • 2015-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-23
  • 1970-01-01
相关资源
最近更新 更多