Java 优化调用同一服务的异步多请求操作
我们正在开发一个文档管理web应用程序,现在我们正在考虑如何处理多个文档上的操作。例如,假设用户多次选择100个文档,并希望删除所有文档。到目前为止(我们不支持多选),Java 优化调用同一服务的异步多请求操作,java,ajax,websocket,Java,Ajax,Websocket,我们正在开发一个文档管理web应用程序,现在我们正在考虑如何处理多个文档上的操作。例如,假设用户多次选择100个文档,并希望删除所有文档。到目前为止(我们不支持多选),deleteDoc操作根据docId向deleteDocument服务发出ajax请求。服务依次调用相应的实用程序函数,该函数执行所需的权限检查,并继续从数据库中删除文档。当涉及到多次删除时,我们不确定什么是进行删除的最佳方式。我们已经找到了很多解决方案,但不知道哪一个是最佳的(-practice),我正在寻求建议。请注意,我们希
deleteDoc
操作根据docId
向deleteDocument
服务发出ajax
请求。服务依次调用相应的实用程序函数,该函数执行所需的权限检查,并继续从数据库中删除文档。当涉及到多次删除时,我们不确定什么是进行删除的最佳方式。我们已经找到了很多解决方案,但不知道哪一个是最佳的(-practice),我正在寻求建议。请注意,我们希望尽可能完整地保存后端代码:
multipleDeleteDocument
服务,根据要删除的文档数量多次调用single doc delete实用程序函数(我认为这很难看,而且与现代实践背道而驰)ajax
请求deleteDocument
服务X次WebSockets
执行多重删除操作,可以大大减少通信开销和时间。我们的应用程序通常运行在低延迟的lan
网络上,这是WebSocket的最佳选择(当引入延迟时,web套接字往往与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取决于您的数据存储。如果您的数据存储还允许发送多个要删除的文档,那么您也可以这样调用数据存储。如果它只支持单次删除,那么您只需循环并单独删除每一次。在删除过程中,您希望向用户提供什么样的反馈?我认为你在寻找最佳解决方案时应该考虑到这一点。如果类似于
删除n-xyz.doc的文档1
,那么选项2
应该可以。我甚至会去重构前端删除请求代码,以便在一个文档中使用multi-delete,这样一来,您将拥有一个前端代码来处理所有文档,而后端代码保持不变。这是一个好主意,可以让最终用户在发出多个请求时保持占用状态。。。然而,不管用户体验如何,我仍然在这里寻找最佳性能(看到每个操作的进度条很酷,但如果每个请求都需要1秒,那就太多了)。此解决方案是否会强制前端deleteDoc
操作向服务器发送文档ID的数组
,即使它只是一个文档?我真的不喜欢为了满足后端服务支持多个id的需要而将单个id
放入一个数组中。这就是为什么选项3实际上是一种批处理的方法,例如10个http请求和10个单独的docid,每个docid都自己调用服务。我只是不知道这是否可能,以及如何实现它。有没有办法让服务同时接受单个docId参数或docId列表?现在,从我所看到的情况来看,它是一个或另一个,我希望避免为了满足服务支持多个ID的需要而将单个docID放入数组。@Konstantine-当然-这一切都取决于您如何将参数发送到服务。如果您使用的是查询参数,则单个删除可能如下所示:http//mydomain.com/api/delete?id=12
多重删除可能如下所示:http//mydomain.com/api/delete?id=12,17,29