Java 了解后端文件种子设定以提供快速客户端下载
我的项目的主题是实现一个分布式服务器,它为多个客户端提供多个文件供下载。服务器托管了几个文件,我们希望服务器能够实现一些最好的算法,让客户端能够从中快速下载数据 我对项目实施的想法: 与客户端通常使用一些下载管理器下载文件一样,必须存在一些服务器端管理器/代码/算法,这些管理器/代码/算法可以快速上传/种子文件,以便客户端下载文件。除选择要下载的文件外,客户端不得执行任何操作 我应该如何在后端为这样的服务器编写代码,类似于在前端为客户机编写基于多线程的下载管理器 如果客户端仅将路径作为字符串发送到Java中的服务器进行下载,服务器应如何为客户端种子/使文件可用Java 了解后端文件种子设定以提供快速客户端下载,java,file-upload,client-server,download,backend,Java,File Upload,Client Server,Download,Backend,我的项目的主题是实现一个分布式服务器,它为多个客户端提供多个文件供下载。服务器托管了几个文件,我们希望服务器能够实现一些最好的算法,让客户端能够从中快速下载数据 我对项目实施的想法: 与客户端通常使用一些下载管理器下载文件一样,必须存在一些服务器端管理器/代码/算法,这些管理器/代码/算法可以快速上传/种子文件,以便客户端下载文件。除选择要下载的文件外,客户端不得执行任何操作 我应该如何在后端为这样的服务器编写代码,类似于在前端为客户机编写基于多线程的下载管理器 如果客户端仅将路径作为字符串发送
或者,如果我遗漏了什么/我的想法完全错了,请用我必须在服务器端实现的替代流程/算法来启发我。请记住,询问此问题的全部目的是后端服务器种子算法或等效的算法/方法。我假设,您的此服务器与广泛的上游服务器有良好的internet连接。如果是这种情况,那么当只有少数客户端下载很少的文件时,限制因素是这些客户端的带宽。因此,你最多只能和你的客户的下游带宽一样快。因此,仅仅使用一个现成的HTTP服务器库来为下载服务就足够了 后端实现真正重要并能够提高下载性能的地方是,许多用户正在连接到服务器并下载许多文件。首先,需要考虑以下几点:
- TCP有一个启动时间。当您第一次打开连接时,下载速率开始缓慢增加,直到达到最大值。为了尽量减少此时间,在下载多个文件时,为一个文件下载打开的连接应重新用于下一个文件
- 当带宽是一个限制因素时,一次下载多个文件(在客户端)是不合理的,因为客户端必须启动许多TCP连接,数据要么在写入磁盘时被分割,要么(在预先分配时)磁盘在扇区之间跳跃时会非常繁忙
- 您的服务器通常应该使用非阻塞IO库(例如),并且不要为每个输入连接创建线程,因为这会导致服务器的性能再次急剧下降
- 供应商的上游限制
- 硬盘驱动器的读取速度(据我所知,SSD的速度约为500 MB/s)
我知道,我没有给出任何算法或代码示例,但我不打算完全回答这个问题。我只是想给你们一些关于这个话题的重要指导方针和想法。我希望,您至少可以在您的项目中使用这些想法。请检查并回答---。如果满意的话,我会投票给你的答案,以后还会给你奖金!我真的不相信他们的结果。我相信他们确实衡量了这些结果,而且这些结果并不是虚构的。但是使用NIO编程要比使用普通的阻塞IO复杂得多。因为我对他们的代码没有深入了解,所以我无法验证这些测试是否公平。第二件让我感到刺痛的事情是,他们只对1700个Concurrect连接进行了精确的测量。我很确定,阻止IO在进一步升级时会出现问题,并且会进一步升级(下一条评论),所以,按照您的说法,1700个并发连接不是很有说服力吗?我和他们在一起,因为这似乎足够合法,没有人会尝试更多的联系!他们的设置非常方便,通过将并发连接限制在1700,并仅测量吞吐量,可以显示IO对NIO的输出效果。但在您的情况下,如果许多客户端将同时下载文件,并且这些文件可能很大,那么每个连接都将打开很长一段时间。正如我所说,我不知道你在为什么客户服务,但一般的互联网用户都有一个相当粗略的带宽限制,吞吐量不应该是你主要关心的问题。相反,您将不得不同时为数千个打开(缓慢)的连接提供服务,而拥有如此多的线程会影响服务器性能…@shekharsuman关于您的评论:这个数字令人信服。我不喜欢一般的说法“阻止IO是