2015-07-03 40 views
2

我们正在开发文档管理Web应用程序,现在我们正在考虑如何处理多个文档上的操作。例如,假设用户多选择100个文档并且想要删除所有文档。到目前为止(我们不支持多选),deleteDoc动作根据docIddeleteDocument服务请求ajax。该服务依次调用相应的实用程序功能,该功能执行所需的权限检查并继续从数据库中删除文档。当涉及到多次删除时,我们不确定最好的处理方式是什么。我们已经找到了很多解决方案,但不知道哪一个最好(实践),我正在寻求建议。你要知道,我们热衷于保持后端代码完整地:优化调用同一服务的异步多请求操作

  1. 创建一个新的multipleDeleteDocument服务,调用单个文档根据我们要删除的文件的数量删除效用函数的次数(在我看来是丑陋的,与现代实践相反的直觉)。
  2. 使后端代码保持原样,对于每个文档,请在服务上发出ajax请求。
  3. 不知何故(我不知道这是甚至可能)将请求批量化为一个,但仍然让服务器执行deleteDocument服务X次。
  4. 使用WebSockets为多删除行动本质上减少通信开销和时间。我们的应用程序通常运行在低延迟的网络上(当网络套接字倾向于匹配http请求速度时),这是网络套接字的最佳选择。
  5. 我们还没有想到的东西?
+0

在删除过程中,您想向用户提供什么样的反馈?我想你应该在找到最佳解决方案时考虑到这一点。如果它是'删除n - xyz.doc的文档1',那么选项'2'应该没问题。我甚至会去重构前端删除请求代码,以便即使对于单个文档也使用多重删除,这样您将有一个前端代码来处理它,并且后​​端代码保持不变。 – A4L

+0

这是一个很好的想法,可以在做出多个请求时保持最终用户的占有率......但是,无论用户体验如何,我仍然在寻找最佳性能(很酷,看到每个动作的进度条,但如果它每个请求需要1秒钟就会变得太多)。 – Konstantine

回答

0

当所有数据可以合并为一个呼叫或消息时,发送N个Ajax呼叫或N个webSocket消息永远不是最优化的解决方案,因此选项2和4肯定不理想。我没有看到通过Ajax调用使用webSocket的特殊原因。如果你已经有一个webSocket连接,那么你当然可以通过webSocket发送一个带有文档ID列表的单个删除消息,但是如果Ajax调用可以正常工作,那么我不会为此创建一个webSocket连接目的。

选项1和3都需要一个新的服务端点,使您可以通过一次调用删除多个文档。这将被推荐。


如果我设计了这样一个API,我想设计一个删除端点接受一个或多个文档ID。这样可以使用相同的API调用,无论是删除单个文档还是多个文档。

然后,从客户端任何时候你有多个文件要删除,总是把它们收集在一起,使一个API调用一次删除所有的文件。

服务器内部,您如何实现该API取决于您的数据存储。如果您的数据存储也允许发送多个文档以进行删除,那么您也可以通过这种方式调用数据存储。如果它只支持单个删除,那么你只需循环并单独删除每一个。

+0

有没有办法让一个服务接受一个docId参数或一个docIds列表?现在从我看到的是其中一个或另一个,我想避免必须将单个docIds放入数组中,以符合服务支持多个ID的需要。 – Konstantine

+0

@Konstantine - 当然 - 这一切都取决于你如何将你的参数发送到你的服务。如果您使用查询参数,则单个删除可能如下所示:'http; // mydomain.com/api/delete?id = 12'并且多次删除可能如下所示:'http; // mydomain.com/ API /删除?ID = 12,17,29' – jfriend00

0

做选项3将是我最优雅的解决方案。

假设您发送POST /deleteDocument这样的请求,其中docId作为参数,您可以传递一个文件标识数组来删除。

然后在后端,您只需遍历id列表并执行删除。你应该能够保持相对完整的删除代码。

+0

这种解决方案不会强制前端'deleteDoc'动作发送docIds数组到文件服务器,即使它只有一个文件吗?我真的不喜欢为了符合后端服务支持多个ID的需要而将一个'id'放入数组中。这就是为什么选项3实际上是一种“批处理”的方式,例如10个具有10个单独的docIds的http请求,每个docId都由自己调用服务。我只是不知道这是否可行,以及如何实现它。 – Konstantine