node.js - 在微服务之间共享文件

标签 node.js microservices seneca

我正在尝试将一个项目从其当前的单体状态转移到微服务架构。该项目在 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-dataapplication/octet-stream 发送,如下所示:

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

但这意味着要重新发明微服务通信的框架。总而言之,我征求有关分布式微服务之间文件共享的建议以及可能的框架。

最佳答案

如果您正在研究微服务架构,您应该想到用于管理文件的微服务!如果您是微服务环境,请不要四处传输文件。 例如,您可能会创建一个 FileManagerService,其 API 公开用于 CRUD 实现,并且仅使用 seneca act/add 来提供重要数据……文件 url、大小等。

关于node.js - 在微服务之间共享文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41609091/

相关文章:

node.js - 当我尝试使用 Axios 向 Seneca.js API 发出请求时出现内部服务器错误

node.js - 如何使用 ES6 在 NodeJS 中创建具有异步导出的模块

node.js - ImageMagick 不再在 AWS Lambda 中转换 pdf

javascript - 大型阵列上的 Node console.log 显示 "... 86 more items"

node.js - 长 POST node.js 上的套接字超时

java - Docker Compose 链接的微服务不可发现

java - 微服务中实体类之间的关系

kubernetes - Istio:我可以在每个请求到达我的应用程序之前将随机生成的唯一值作为 header 添加到它吗

redis - seneca redis pubsub 传输和 seneca redis 队列传输有什么区别?

node.js - Docker 和 Rabbitmq : ECONNREFUSED between containers