Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 了解后端文件种子设定以提供快速客户端下载_Java_File Upload_Client Server_Download_Backend - Fatal编程技术网

Java 了解后端文件种子设定以提供快速客户端下载

Java 了解后端文件种子设定以提供快速客户端下载,java,file-upload,client-server,download,backend,Java,File Upload,Client Server,Download,Backend,我的项目的主题是实现一个分布式服务器,它为多个客户端提供多个文件供下载。服务器托管了几个文件,我们希望服务器能够实现一些最好的算法,让客户端能够从中快速下载数据 我对项目实施的想法: 与客户端通常使用一些下载管理器下载文件一样,必须存在一些服务器端管理器/代码/算法,这些管理器/代码/算法可以快速上传/种子文件,以便客户端下载文件。除选择要下载的文件外,客户端不得执行任何操作 我应该如何在后端为这样的服务器编写代码,类似于在前端为客户机编写基于多线程的下载管理器 如果客户端仅将路径作为字符串发送

我的项目的主题是实现一个分布式服务器,它为多个客户端提供多个文件供下载。服务器托管了几个文件,我们希望服务器能够实现一些最好的算法,让客户端能够从中快速下载数据

我对项目实施的想法:

与客户端通常使用一些下载管理器下载文件一样,必须存在一些服务器端管理器/代码/算法,这些管理器/代码/算法可以快速上传/种子文件,以便客户端下载文件。除选择要下载的文件外,客户端不得执行任何操作

我应该如何在后端为这样的服务器编写代码,类似于在前端为客户机编写基于多线程的下载管理器

如果客户端仅将路径作为字符串发送到Java中的服务器进行下载,服务器应如何为客户端种子/使文件可用


或者,如果我遗漏了什么/我的想法完全错了,请用我必须在服务器端实现的替代流程/算法来启发我。请记住,询问此问题的全部目的是后端服务器种子算法或等效的算法/方法。

我假设,您的此服务器与广泛的上游服务器有良好的internet连接。如果是这种情况,那么当只有少数客户端下载很少的文件时,限制因素是这些客户端的带宽。因此,你最多只能和你的客户的下游带宽一样快。因此,仅仅使用一个现成的HTTP服务器库来为下载服务就足够了

后端实现真正重要并能够提高下载性能的地方是,许多用户正在连接到服务器并下载许多文件。首先,需要考虑以下几点:

  • TCP有一个启动时间。当您第一次打开连接时,下载速率开始缓慢增加,直到达到最大值。为了尽量减少此时间,在下载多个文件时,为一个文件下载打开的连接应重新用于下一个文件

  • 当带宽是一个限制因素时,一次下载多个文件(在客户端)是不合理的,因为客户端必须启动许多TCP连接,数据要么在写入磁盘时被分割,要么(在预先分配时)磁盘在扇区之间跳跃时会非常繁忙

  • 您的服务器通常应该使用非阻塞IO库(例如),并且不要为每个输入连接创建线程,因为这会导致服务器的性能再次急剧下降

如果有大量客户端同时从服务器下载,则可能达到的限制为:

  • 供应商的上游限制

  • 硬盘驱动器的读取速度(据我所知,SSD的速度约为500 MB/s)

您的服务器可以尝试将最常请求的文件保存在他的内存中,并从那里提供内容()。我怀疑您的服务器上只有很少的文件可以缓存在服务器的RAM中

因此,主要的工程任务在于巧妙地选择哪些内容应该缓存,哪些不应该缓存。这可以通过为某些文件分配更高的优先级,或者通过对单个文件在未来几分钟内被下载的概率进行编码的度量来实现。或者仅仅是大多数客户端在此时下载的文件

有了这些考虑因素,您就能够突破下载服务器的限制,直到某一点,通过将文件分发或复制到多个服务器上,才能实现唯一的改进

如果你正朝着同时服务数百万客户的方向发展,你应该考虑从CDNS购买这样的服务。他们擅长于快速交付,在大多数ASE中都有许多上游服务器,因此每个客户端都可以从区域CDN服务器下载其文件



我知道,我没有给出任何算法或代码示例,但我不打算完全回答这个问题。我只是想给你们一些关于这个话题的重要指导方针和想法。我希望,您至少可以在您的项目中使用这些想法。

请检查并回答---。如果满意的话,我会投票给你的答案,以后还会给你奖金!我真的不相信他们的结果。我相信他们确实衡量了这些结果,而且这些结果并不是虚构的。但是使用NIO编程要比使用普通的阻塞IO复杂得多。因为我对他们的代码没有深入了解,所以我无法验证这些测试是否公平。第二件让我感到刺痛的事情是,他们只对1700个Concurrect连接进行了精确的测量。我很确定,阻止IO在进一步升级时会出现问题,并且会进一步升级(下一条评论),所以,按照您的说法,1700个并发连接不是很有说服力吗?我和他们在一起,因为这似乎足够合法,没有人会尝试更多的联系!他们的设置非常方便,通过将并发连接限制在1700,并仅测量吞吐量,可以显示IO对NIO的输出效果。但在您的情况下,如果许多客户端将同时下载文件,并且这些文件可能很大,那么每个连接都将打开很长一段时间。正如我所说,我不知道你在为什么客户服务,但一般的互联网用户都有一个相当粗略的带宽限制,吞吐量不应该是你主要关心的问题。相反,您将不得不同时为数千个打开(缓慢)的连接提供服务,而拥有如此多的线程会影响服务器性能…@shekharsuman关于您的评论:这个数字令人信服。我不喜欢一般的说法“阻止IO是