我正在为我的体系结构中的以下问题寻找解决方案:
我有一个丰富的前端应用程序(React、RxJS、socket.io等)和一个在netty socketio之上编写的web服务层,我目前只是作为netty应用程序运行。这个想法是,服务器充当API层,任何实现socket.io协议的客户端都可以使用它,我的前端应用程序就是其中之一。我真的可以在任何地方主持它,可能是cdn。
我遇到的问题是文件,更具体地说是图像处理。经典的用例是上传用户头像。我的普通socket.io协议不支持它,所以我提出了几个理论解决方案:
-
通过socket.io API将图像作为二进制文件上传,将图像存储在服务器的文件系统中,并将其作为二进制文件访问。我对这个的问题是我必须进行序列化/反序列化,而且不同的文件扩展名等似乎很容易出错。
-
在Netty中实现一个HTTP解析器,就像这个例子一样,在不同端口的同一个实例中运行它。我已经测试过了,它很有效,但它确实是低级别的,我不是Netty的专家。
-
创建一个单独的HTTP文件服务器,可能使用servlets并使用它来存储和引用图像,让前端直接上传到该服务器,然后只发送一个对socket.io API的引用以保存在DB中。我不确定的是,API通过这种方式基本上希望UI处理自己的图像存储,只报告引用,这似乎是不安全和不可控的。
-
对于(3)中描述的行为,请改用CDN。这将是一个很好的生产就绪的解决方案,但在我的非生产系统中可能有些过头了。
注意,在情况(3)和(4)中,我可以在同一个地方托管前端,现在我正在使用本地node.js http服务器。
有什么我没有考虑过的建议、意见或解决方案吗?
为了分享知识,我将回答我的问题。我选择了选项二,因为我不想将图像存储逻辑与应用程序的其他部分分开。图像上传现在是一个两阶段的过程:用户在不同的端口上用图像主体向同一个ip发起HTTPPOST请求。Netty处理程序捕获消息,并解析HTTPPOST,就像参考的例子一样。然后,图像作为字节缓冲区存储在内存中(在有限的时间内),并在HTTP响应中返回唯一的UUID。在此之后,客户端的责任是通过websocket连接调用相关的API,发送相关的文本数据和包括上述UUID作为对上传数据的引用。套接字处理程序然后验证此请求,从临时存储中读取基于哈希的字节缓冲区,并将其写入磁盘。这样做的好处是临时缓冲区,因此在写入磁盘之前可以正确验证请求。