优化调用相同服务的异步多请求操作
Optimizing async multi-request operations calling the same service
我们正在开发一个文档管理 Web 应用程序,现在我们正在考虑如何处理对多个文档的操作。例如,假设用户多选了 100 个文档并希望将其全部删除。直到现在(我们不支持多选)deleteDoc
操作根据 docId
向 deleteDocument
服务发出 ajax
请求。该服务依次调用相应的实用程序函数,该函数执行所需的权限检查并继续从数据库中删除文档。当谈到多重删除时,我们不确定什么是最好的处理方法。我们已经找到了许多解决方案,但不知道哪一个是最好的(实践),我正在寻求建议。请注意,我们热衷于保持后端代码尽可能完整:
- 创建一个新的
multipleDeleteDocument
服务,该服务根据我们要删除的文档数量多次调用单个文档删除实用程序函数(在我看来很丑陋并且与现代实践有悖常理)。
- 保持后端代码不变,而是针对每个文档,对服务发出
ajax
请求。
- 不知何故(我不知道这是否可能)将请求分批处理,但仍然让服务器执行
deleteDocument
服务 X 次。
- 使用
WebSockets
进行多次删除操作,从根本上减少了通信开销和时间。我们的应用程序通常运行在具有低延迟的 lan
网络上,这对于 websockets 是最佳的(当引入延迟时,web sockets 往往与 http 请求速度相匹配)。
- 有什么我们没有想到的?
选择 3
对我来说是最优雅的解决方案。
假设您发送像 POST /deleteDocument
这样的请求,其中您将 docId
作为参数,您可以改为传递要删除的文档 ID 数组。
然后在后端您只需遍历 id 列表并执行删除。你应该可以保持删除代码相对完整。
发送 N Ajax 调用或 N 条 webSocket 消息,当所有数据都可以合并到一个调用或消息中时,这绝不是最佳解决方案,因此选项 2 和 4 肯定不理想。我认为没有特别的理由在 Ajax 调用上使用 webSocket。如果您已经有一个 webSocket 连接,那么您当然可以通过 webSocket 发送一个包含文档 ID 列表的删除消息,但是如果 Ajax 调用也能正常工作,那么我不会创建 webSocket连接只是为了这个目的。
选项 1 和 3 都需要一个新的服务端点,使您可以通过一次调用来删除多个文档。推荐这个。
如果我设计这样的 API,我会设计一个采用一个或多个文档 ID 的删除端点。这样,无论是删除单个文档还是多个文档,都可以使用相同的 API 调用。
然后,无论何时您有多个文档要删除,始终从客户端收集它们并进行一次 API 调用以一次删除所有文档。
在服务器内部,如何实现 API 取决于您的数据存储。如果您的数据存储还允许发送多个文档进行删除,那么您同样可以这样调用数据存储。如果它只支持单个删除,那么你只需循环并逐个删除。
我们正在开发一个文档管理 Web 应用程序,现在我们正在考虑如何处理对多个文档的操作。例如,假设用户多选了 100 个文档并希望将其全部删除。直到现在(我们不支持多选)deleteDoc
操作根据 docId
向 deleteDocument
服务发出 ajax
请求。该服务依次调用相应的实用程序函数,该函数执行所需的权限检查并继续从数据库中删除文档。当谈到多重删除时,我们不确定什么是最好的处理方法。我们已经找到了许多解决方案,但不知道哪一个是最好的(实践),我正在寻求建议。请注意,我们热衷于保持后端代码尽可能完整:
- 创建一个新的
multipleDeleteDocument
服务,该服务根据我们要删除的文档数量多次调用单个文档删除实用程序函数(在我看来很丑陋并且与现代实践有悖常理)。 - 保持后端代码不变,而是针对每个文档,对服务发出
ajax
请求。 - 不知何故(我不知道这是否可能)将请求分批处理,但仍然让服务器执行
deleteDocument
服务 X 次。 - 使用
WebSockets
进行多次删除操作,从根本上减少了通信开销和时间。我们的应用程序通常运行在具有低延迟的lan
网络上,这对于 websockets 是最佳的(当引入延迟时,web sockets 往往与 http 请求速度相匹配)。 - 有什么我们没有想到的?
选择 3
对我来说是最优雅的解决方案。
假设您发送像 POST /deleteDocument
这样的请求,其中您将 docId
作为参数,您可以改为传递要删除的文档 ID 数组。
然后在后端您只需遍历 id 列表并执行删除。你应该可以保持删除代码相对完整。
发送 N Ajax 调用或 N 条 webSocket 消息,当所有数据都可以合并到一个调用或消息中时,这绝不是最佳解决方案,因此选项 2 和 4 肯定不理想。我认为没有特别的理由在 Ajax 调用上使用 webSocket。如果您已经有一个 webSocket 连接,那么您当然可以通过 webSocket 发送一个包含文档 ID 列表的删除消息,但是如果 Ajax 调用也能正常工作,那么我不会创建 webSocket连接只是为了这个目的。
选项 1 和 3 都需要一个新的服务端点,使您可以通过一次调用来删除多个文档。推荐这个。
如果我设计这样的 API,我会设计一个采用一个或多个文档 ID 的删除端点。这样,无论是删除单个文档还是多个文档,都可以使用相同的 API 调用。
然后,无论何时您有多个文档要删除,始终从客户端收集它们并进行一次 API 调用以一次删除所有文档。
在服务器内部,如何实现 API 取决于您的数据存储。如果您的数据存储还允许发送多个文档进行删除,那么您同样可以这样调用数据存储。如果它只支持单个删除,那么你只需循环并逐个删除。