首页 文章

在微服务之间共享文件

提问于
浏览
3

我开始研究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-dataapplication/octet-stream ,如下所示:

fs.createReadStream('file.json')
  .pipe(request.post('http://image-manipulator'))

但这意味着要重新构建微服务通信框架 . 总而言之,我要求就分布式微服务和可能的框架之间的文件共享提出建议 .

2 回答

  • 1

    如果您正在接近微服务架构,您应该考虑使用微服务来管理文件!如果您是微服务环境,请不要流式传输文件 . 例如,您可以使用为CRUD实现公开的API创建FileManagerService,并仅使用seneca act / add来提供重要数据... file-url,size等 .

  • 1

    如果您使用Seneca,我强烈建议您阅读The Tao of Microservices,由Seneca本人的作者Richard Rodger阅读 .

    他用这种方式直接解决你的问题(第3章第15节):

    Bandwith很重要 . 微服务系统的网络特性意味着它们非常容易受到带宽限制 . 即使你从充足的供应开始,你也必须采取稀缺的心态 . 行为不端的微服务很容易导致内部产生的拒绝服务攻击 . 保持信息小而精益 . 不要使用它们发送大量实际数据,而是发送对批量数据存储的引用 . [...]要在服务之间发送图像,请不要发送图像二进制数据,发送指向图像的URL .

    回到您的具体情况,您应该使用允许您存储/检索文件的服务,并仅传递Seneca服务之间的消息中的文件的URL . 以纯粹的分布式方式构建这样的系统并非易事,因此我宁愿使用AWS S3或同等产品 .

相关问题