【发布时间】:2017-05-27 07:39:32
【问题描述】:
我正在尝试将项目从其当前的单体状态转移到微服务架构。该项目位于 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'))
但这意味着重新发明微服务通信的框架。总而言之,我就分布式微服务之间的文件共享以及可能的框架寻求建议。
【问题讨论】:
-
不错的形容词 - wheel-reinventive。我会记住的。
-
安东,您对此有何决定?我正在做类似的事情。
-
@JoshC.,我最终将我的逻辑从直接图像处理转移到图像处理代理,例如github.com/imazen/imageflow。 API 接收文件,执行检查(mime 类型等)并将文件上传到 S3 之类的东西。当图像显示给最终用户时,他们会收到一个类似
https://images.example.org/some-image.jpg?width=300&quality=80的 URL。 Imageflow(在这个域上运行)被设置为从这个 S3 中提取图像(如果没有缓存),处理它,发送给用户并缓存它。 -
如果您正在处理其他文件(图像除外),我想这种方法也有效。 API 接收文件,将其上传到 S3 并将对它的引用存储在数据库中。然后,如果您需要访问此文件,只需下载它¯\_(ツ)_/¯ 我想这是最简单的方法。
-
@AntonEgorov 我正朝着类似的方向发展。在微服务之间何时应该和不应该共享数据是很棘手的。共享数据库表可能是一个禁忌,但发布的文件可以吗??? ¯\_(ツ)_/¯
标签: node.js microservices seneca