9

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

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

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

4

2 回答 2

3

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

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

带宽很重要。

微服务系统的网络性质意味着它们很容易受到带宽限制。即使你从充足的供应开始,你也必须采取稀缺的心态。行为不端的微服务很容易导致内部产生的拒绝服务攻击。保持你的信息小而精。不要使用它们来发送大量实际数据,而是发送对大容量数据存储的引用。[...]

要在服务之间发送图像,不要发送图像二进制数据,发送指向图像的 URL。

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

于 2017-04-14T09:17:17.037 回答
3

如果您正在使用微服务架构,您应该考虑使用微服务来管理文件!如果您是微服务环境,请不要流式传输文件。例如,您可以创建一个 FileManagerService,其 API 公开用于 CRUD 实现,并且仅使用 seneca act/add 来提供重要数据...文件 URL、大小等。

于 2017-03-03T14:24:42.077 回答