对于小文件的频繁上传,最快的方法是实现自己的专有协议,但这需要大量的工作——而且它也是非标准的,这意味着未来的集成将很困难,除非你能够实现您将支持的任何客户端中的协议。如果您仍然选择这样做,这是我对简单协议的建议:
- 命令:1 个字节来标识将要做什么:(0x01 表示上传请求,0x02 表示下载请求,0x11 表示上传响应,0x12 表示下载响应等)。
- 文件名:可以是固定大小或以字节为前缀长度(假设名称小于255字节)
- 校验和,例如 MD5(如果上传请求或下载响应)
- 文件大小(如果上传请求或下载响应)
- 有效载荷(如果上传请求或下载响应)
这可以在一个简单的 TCP 套接字之上实现。您也可以使用 UDP,避免建立连接的成本,但在这种情况下,您必须处理重传控制。
在决定实现你自己的协议之前,先看看像 libcurl 这样的 HTTP 库,你可以让你的服务器使用标准的 HTTP 命令,比如 GET 来下载和 POST 来上传。这将节省大量工作,您将能够使用任何 Web 浏览器测试下载。
另一个提高性能的建议是使用文件存储库而不是文件系统,而是使用 SQLite 之类的东西。您可以创建一个表,其中包含一个用于文件名的 char 列和一个用于文件内容的 blob 列。由于 SQLite 是轻量级的并且可以进行有效的缓存,因此您大部分时间都可以避免磁盘访问开销。
我假设您不需要客户端身份验证。
最后:尽管 C++ 是您的首选,可以为您提供原始本机代码速度,但这很少是此类应用程序的主要瓶颈。很可能是磁盘访问和网络带宽。我之所以提到这一点,是因为在 Java 中,您可能能够用不到 100 行代码制作一个 servlet 来做完全相同的事情(使用 HTTP GET 进行下载和 POST 进行上传)。在这种情况下使用 Derby 而不是 SQLite,将该 servlet 放入任何容器(Tomcat、Glassfish 等)中,然后就完成了。