您将如何设计Collaborative / Shareable Text Editor:关键点如下

时间:2014-04-03 18:54:36

标签: java multithreading algorithm oop design-patterns

多个用户的读/写操作。 用户可能能够使编辑器只读,即只有会话的创建者写入。 您应该能够共享当前会话的链接以添加更多用户同时处理。 它应该是并发(同步)并避免编辑冲突。建议这样做的方法。 请关注正确且可扩展的功能。 应该有自动保存 编辑器应保持每次保存的更改/编辑。 支持回滚任何更改。 必须具有社交媒体的共享/类似功能。

我能够提供以下内容,需要帮助识别类来为此构建类图:

它将是客户端服务器实现。

对于网站,客户端可以用HTML5和Javascript编写。我们可以使用额外的javascript框架来满足特定需求(例如angularjs)。

对于发送请求,有两种方法可用: 1.请求/响应 - 每秒发送请求 2.长池 - 向服务器发送永不停止的http请求并通过它进行通信。此方法将比之前的方法更快,因为不会发出多个http请求。

客户端的工作是以固定间隔(1秒)将更改发送到服务器。 客户的工作是了解其他用户所做的更改并将其显示给当前用户。

服务器将公开将用于的API - 获取当前文档 - SendUpdate请求,其响应将包含其他用户在同一文档上完成的修改。我们将尝试捕获增量并代表客户端的更改。

服务器堆栈必须非常快(.node.js或golang将适合此类要求),因为它的响应时间非常短。 数据应存储在内存中,我们可以使用Redis来存储数据。我们可以间隔或显式保存请求,将数据保存在文件系统上或非内存数据库中。

每个请求都将包含客户端所做的一组更改。 这些更改将与时间戳一起保存在Redis中。 我们不会将整个文件存储在数据库中,我们只会存储历史性的变化。由于redis基于内存,因此从存储的更改集中计算最终文档所需的资源非常少。

对于每个文档,都会有与之关联的唯一ID。唯一ID应该足够长。 您可以为记事本创建一个网址,例如example.com/notepad/{unique-id} 这将加载客户端,然后加载与该唯一ID相关的文档。

对于每个请求,将发送此唯一ID以标识用户正在编辑哪个文档。 保存 当每个更改都被发送到数据库时,它将被自动保存。

还原 您可以在AngularJs中保留历史数据。如果要在会话之间保持持久性,请将数据存储到文件系统。 您还可以使用API​​从服务器检索历史信息。哪个可以撤消。

Facebook分享 我们也可以使用FB graph api在用户发布链接;时间线或Facebook公开一个sharer.php网址,可用于在用户的时间线上分享帖子/共享链接。

可伸缩性 我们可以使用基于云的可扩展解决方案(如Mmazon AWS EC2实例)来实施此解决方案。我们可以将webserver放在负载均衡器之后。 我们必须将redis保持为单独的(大型)ec2实例。负载balanacer后面可以有多个webserver。 所有这些都将与Redis实例进行通信。 我们可以在CDN(S3后面的AWS CloudFront)中保留静态数据,如css和js

1 个答案:

答案 0 :(得分:1)

它将是客户端服务器实现 服务器将公开将用于的API - 获取当前文件
- SendUpdate请求,其响应将包含其他用户在同一文档上完成的修改

客户端的工作是在固定的时间间隔(例如1秒)将更改发送到服务器。 客户的工作是了解其他用户所做的更改并将其显示给当前用户。

对于网站,客户端可以用HTML5和Javascript编写。你可以使用AngularJs作为javascript框架 对于发送请求,有两种方法可供使用:
1.同步
- 每秒发送请求
2.长池 - 向服务器发送永不停止的http请求并通过它进行通信。此方法将比之前的方法更快,因为不会发出多个http请求。

服务器堆栈必须非常快。 node.js或golang将适合这种要求,因为它的响应时间非常短 数据应存储在内存中,您可以使用Redis存储数据。

每个请求都将包含客户端所做的一组更改 这些更改将与时间戳一起保存在Redis中。
您不会将整个文件存储在数据库中,您应该只存储历史更改。由于redis基于内存,因此从存储的更改集中计算最终文档所需的资源非常少。