Netty和socket.io

时间:2016-08-03 12:29:32

标签: java http websocket netty

我正在为我的架构中的以下问题寻找解决方案:

我有一个丰富的前端应用程序(React,RxJS,socket.io等)和一个在netty-socketio之上编写的Web服务层,我目前正在运行Netty应用程序。这个想法是服务器充当API层,任何实现socket.io协议的客户端都可以使用它,我的前端应用程序就是其中之一。我可以在任何地方托管它,可能是一个cdn。

我遇到的问题是文件,更具体地说是图像处理。经典用例是上传用户头像。我的普通socket.io协议不支持它,所以我提出了几个理论解决方案:

  1. 通过socket.io API将图像上传为二进制文件,将图像存储在服务器的文件系统中,也可以将它们作为二进制文件访问。我的问题是我必须做的序列化/反序列化,并且它似乎容易出错,不同的文件扩展名等等。

  2. 在Netty中实现HTTP解析器,如this example,在不同端口的同一实例中运行它。我已经对此进行了测试,但它确实有效,但它确实很低,而且我不是Netty的专家。

  3. 创建一个单独的HTTP文件服务器,可能使用servlet并使用它来存储和引用图像,将前端直接上传到此,只需发送一个对socket.io API的引用以保留在DB中。我不确定的事实是,这种方式API基本上要求UI-s处理他们自己的图像存储并只报告引用,这似乎是不安全和无法控制的。

  4. 使用CDN代替(3)中描述的行为。这将是一个很好的生产就绪解决方案,但在我的非生产系统中可能有点过分。

  5. 注意,在情况(3)和(4)中,我可以将前端托管在同一个地方,现在我正在使用本地node.js http-server。

    我没有考虑任何建议,意见和解决方案?

1 个答案:

答案 0 :(得分:0)

为了知识共享目的,我会回答我的问题。我选择了第二个选项,因为我不想将图像存储逻辑与应用程序的其余部分分开。图像上传现在是一个两阶段过程:用户在不同的端口上向图像主体发起HTTP POST请求到同一个ip。 Netty处理程序捕获消息,并解析HTTP POST,就像引用的示例一样。然后将图像作为字节缓冲区(在有限的时间内)存储在存储器中,并在HTTP响应中返回唯一的UUID。在此之后,客户负责通过websocket连接调用相关API,发送相关文本数据包括上述UUID作为上载数据的参考。套接字处理程序验证此请求,根据临时存储中的哈希读取字节缓冲区,将其写入磁盘。关于这一点的好处是临时缓冲区,因此可以在写入磁盘之前正确验证请求。