一个优雅的异步解决方案,用于在Java中从Vertx worker verticle将文件从S3发送到客户端

一个优雅的异步解决方案,用于在Java中从Vertx worker verticle将文件从S3发送到客户端,java,amazon-s3,vert.x,file-transfer,Java,Amazon S3,Vert.x,File Transfer,我有一个垂直工作的Vertx服务器,可以异步处理S3操作的请求。我们需要一个解决方案,通过服务器将文件从S3传输到客户端。tsegismont回答了前面的一个问题,但该建议似乎会阻止Vertx线程。文件传输属于单独的垂直路径。由于RoutingContext没有按照推荐的方式通过总线发送,因此推荐的解决方案无法在工作线程垂直模式下工作。注意,这里推荐的解决方案(创建一个特殊的编解码器)似乎不起作用,因为worker垂直中需要RoutingContext 另一个解决方案是从S3获取对象。保存到文件

我有一个垂直工作的Vertx服务器,可以异步处理S3操作的请求。我们需要一个解决方案,通过服务器将文件从S3传输到客户端。tsegismont回答了前面的一个问题,但该建议似乎会阻止Vertx线程。文件传输属于单独的垂直路径。由于RoutingContext没有按照推荐的方式通过总线发送,因此推荐的解决方案无法在工作线程垂直模式下工作。注意,这里推荐的解决方案(创建一个特殊的编解码器)似乎不起作用,因为worker垂直中需要RoutingContext

另一个解决方案是从S3获取对象。保存到文件中。然后使用WebClient API中的fileSend方法发送到客户端。这这不是一个优雅的解决方案


第三种解决方案是放弃WorkerVertical,在Main垂直中使用blockingHandler方法。这不是一个异步调用。该线程可能在几秒钟内不会释放,并且比以前的解决方案更糟糕。

我不知道这是否是您的选项,但您可以使用预先签名的url-

我大部分时间所做的是使用vertx服务器处理协调,并生成预先签名的url,以从s3获取/上传文件

客户端获得预先签名的URL,可以直接下载/上传到s3,同时通过后端保护实际凭证


预签名的URL可能具有有限的生存期,您可以获得AWS的所有可扩展性,而无需处理文件流/内存不足异常等。

这将是一个更好的解决方案,我们就是从这里开始的。我们对S3的大部分工作都是通过预签名完成的。由于某些原因,我们可以成功上载和下载较大的文件,但4k到10k字节之间的较小文件无法正确下载。我们当前的解决方案是避免对较小文件进行预签名。生成URL的成本与上传和下载较小的文件到s3一样昂贵,这是一个有效的解决方案,尽管没有我们希望的那么优雅。
blockingHandler
方法的工作原理几乎与worker verticle相同,并且不可能比它“更糟”,除非它阻塞几秒钟。请参阅blockinghandler下的文档。如果操作阻塞超过几秒钟,则应使用垂直辅助线。