java - 你会如何设计协作/可共享的文本编辑器 : Key points are given below

标签 java multithreading algorithm oop design-patterns

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

我能够得到以下结果,需要帮助识别类来为此构建类图:

这将是一个客户端服务器实现。

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

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

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

服务器将公开一个 API,用于 -- 获取当前文档 -- SendUpdate 请求,其响应将包含其他用户对同一文档所做的修改。我们将 try catch 增量并在客户端表示更改。

Server Stack 必须非常快(.node.js 或 golang 将适合这种要求)因为它的响应时间非常短。 数据应该存储在内存中,我们可以使用Redis来存储数据。我们可以按时间间隔或显式保存请求,将数据保存在文件系统或非内存数据库中。

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

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

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

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

Facebook 分享 我们还可以使用 FB 图形 API 在用户的时间线中发布链接,或者 Facebook 公开一个 sharer.php url,可用于在用户的时间线中分享发布/共享链接。

可扩展性 我们可以使用基于云的可扩展解决方案,如 Mmazon AWS EC2 实例来实现该解决方案。我们可以将网络服务器放在负载均衡器后面。 我们必须将 redis 保持为单独的(大型)ec2 实例。负载均衡器后面可以有多个网络服务器。 他们都将与 Redis 实例进行通信。 我们可以将 css 和 js 等静态数据保存在 CDN 中(S3 后面的 AWS CloudFront)

最佳答案

这将是一个客户端服务器实现。
服务器将在何处公开用于
的API -- 获取当前文档
-- SendUpdate 请求,其响应将包含其他用户对同一文档所做的修改

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

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

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

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

关于java - 你会如何设计协作/可共享的文本编辑器 : Key points are given below,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22846484/

相关文章:

C++11 线程 boost 容器

python - Python套接字对象是线程安全的吗?

algorithm - 包含每个节点的最小子图数?

algorithm - KMP模式查找算法

java - 使用 BerkeleyDB 替换 java.util.List

java - 访问应用程序的密码

java - 这个(无锁)队列实现是线程安全的吗?

java - 在二维数组中查找邻居

java - Wicket:我可以安全地忽略可序列化的警告吗?

java - 插入排序,比较次数