Ant*_*rov 6 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' });
});
Run Code Online (Sandbox Code Playgroud)
并分块接收:
seneca.add({ role: 'file', cmd: 'chunk' }, writeToFileCb);
seneca.add({ role: 'file', cmd: 'end' }, endFileWriteCb);
Run Code Online (Sandbox Code Playgroud)
但是这种方法看起来很丑陋,而且是轮回式的。
另一种方法是使用一些 HTTP 服务器并将文件发送为multipart/form-dataor application/octet-stream,如下所示:
fs.createReadStream('file.json')
.pipe(request.post('http://image-manipulator'))
Run Code Online (Sandbox Code Playgroud)
但这意味着重塑微服务通信框架。总而言之,我就分布式微服务和可能的框架之间的文件共享寻求建议。
如果您使用 Seneca,我强烈建议您阅读Seneca 的作者Richard Rodger所著的《微服务之道》 。
他这样直接回答你的问题(第 3 章第 15 节):
带宽很重要。
微服务系统的网络性质意味着它们非常容易受到带宽限制。即使一开始供应充足,也必须采取稀缺心态。行为不当的微服务很容易导致内部生成的拒绝服务攻击。保持你的信息小而精。不要使用它们发送大量实际数据,而是发送对批量数据存储的引用。[...]
要在服务之间发送图像,不要发送图像二进制数据,而是发送指向图像的 URL。
回到您的具体情况,您应该使用允许您存储/检索文件的服务,并仅在 Seneca 服务之间的消息中传递文件的 URL。以纯分布式方式构建这样一个系统并不简单,因此我宁愿使用 AWS S3 或同等产品。
如果您正在接近微服务架构,您应该考虑用于管理文件的微服务!如果您处于微服务环境,请勿传输文件。例如,您可以创建一个 FileManagerService,其中公开了用于 CRUD 实现的 API,并且仅使用 seneca act/add 来提供重要数据...文件 URL、大小等。
| 归档时间: |
|
| 查看次数: |
10032 次 |
| 最近记录: |