我正在尝试将项目从当前的单片状态转移到微服务架构。该项目在Node.js中,所以我开始研究Seneca.js,尤其是seneca-mesh模块。将图像处理(裁剪,调整大小等)移动到微服务中似乎是最明智的第一步,因为它现在大大减慢了我的应用程序。
当应用程序是单片时,将某些文件传递到文件操作逻辑没有问题 - 只需从本地存储磁盘读取它。但是,使用微服务,如果我们牢记可伸缩性,它就会变得更加困难。当然,我可以构建一个图像处理微服务,在同一主机中扩展,并在它之间共享我需要的目录,因此它们也可以从本地磁盘读取。
如果我想要一个真正可扩展的微服务,可以在具有不同IP地址的不同计算机上运行和扩展不共享相同的文件系统,该怎么办?我想也许我可以利用Node的流API并通过HTTP或TCP或套接字来回发送这些文件,或者你命名它。
据我所知,Seneca.js不能正确的方式。当然,我可以通过Seneca.js将主文件中的文件发送到图像处理服务,如下所示:
fs.createReadStream('/files/hello.jpg')
.on('data', function(data) {
seneca.act({ role: 'file', cmd: 'chunk', data: data }, cb);
})
.on('end', function(err) {
seneca.act({ role: 'file', cmd: 'end' });
})
.on('error', function(err) {
seneca.act({ role: 'test', cmd: 'error' });
});
然后收到它:
seneca.add({ role: 'file', cmd: 'chunk' }, writeToFileCb);
seneca.add({ role: 'file', cmd: 'end' }, endFileWriteCb);
但是这种做法看起来很丑陋而且重新发明了。
另一种方法是提出一些HTTP服务器并以multipart/form-data
或application/octet-stream
发送文件,如下所示:
fs.createReadStream('file.json')
.pipe(request.post('http://image-manipulator'))
但这意味着重新构建微服务通信框架。总而言之,我要求就分布式微服务和可能的框架之间的文件共享提出建议。
答案 0 :(得分:3)
如果您正在接近微服务架构,您应该考虑使用微服务来管理文件!如果您是微服务环境,请不要流式传输文件。 例如,您可以使用为CRUD实现公开的API创建FileManagerService,并仅使用seneca act / add来提供重要数据... file-url,size等。
答案 1 :(得分:1)
如果您使用Seneca,我强烈建议您阅读Seneca本人的作者The Tao of Microservices阅读Richard Rodger。
他用这种方式直接解决你的问题(第3章第15节):
Bandwith很重要。
微服务系统的网络特性意味着它们非常容易受到带宽限制。即使你从充足的供应开始,你也必须采取稀缺的心态。行为不端的微服务很容易导致内部产生的拒绝服务攻击。 保持信息小而精简。请勿使用它们发送大量实际数据,发送对批量数据存储的引用。 [...]
要在服务之间发送图像,请不要发送图像二进制数据,发送指向图像的URL。
回到您的具体情况,您应该使用允许您存储/检索文件的服务,并仅传递Seneca服务之间的消息中的文件的URL。以纯粹的分布式方式构建这样的系统并非易事,因此我宁愿使用AWS S3或同等产品。