在微服务之间共享巨大的数据

问题描述:

我正在设计微服务体系结构中的审阅分析平台。在微服务之间共享巨大的数据

应用程序是像下面的作品;从电子商务站点-A(站点一)检索为Excel

  • 所有产品意见文件
  • 评论上传到系统与Excel
  • 分析代理可以列出所有的评论,编辑其中的一些,删除或批准
  • 分析代理可以导出网站的所有评论-a
  • 基于自动正则表达式的检查应用于每次上传和编辑评论。

我有3个微服务。

  • 点评:负责类似批准/拒绝评论CRUD操作以及操作方法。
  • 验证:负责制定和审核应用验证规则。
  • 导出/导入:出口服务出口给定站点的名称(如网站-A)

问题是在某些时候大文件,验证服务需要获得所有评论网站一,应用验证规则并且如果有的话会产生错误。我知道共享数据库模式和实体会破坏微服务架构。

一个可能的解决方案是

  • 每当验证服务需要一个现场审查,它要求网关,网关重定向请求评论服务和响应服用。

两个这种方法的缺点可能是

  • 验证服务知道有关网关?它是否会带来依赖性?
  • 万一我有一个网站的1b评论,通过休息请求获得所有评论可能是一个问题。 (或没有,我可以从验证服务,使分页请求的网关。)

那么,什么是分享微服务之间的巨大数据的最佳实践,而不

  • 共享实体
  • 和dublicating的数据

我读了很多关于使用消息队列,但我认为在我的情况下,使用消息队列共享千兆字节的数据并不好。


编辑1:而不是共享实体,使用数据存储与其余API可以解决?假设我使用的是mongodb,而不是在微服务之间共享我的实体对象,我可以使用mongo的休息界面(http://restheart.org/)并尽可能查询数据。

+0

您可以尝试企业集成模式。我不知道哪种模式可以解决确切的用例,但应该包含它们。 – k1133

我认为评论是相互独立的,因此验证评论只需要评论,而不需要其他评论。

你不想共享实体,这就排除了共享数据库,Hadoop集群或像Redis这样的数据存储。您也不想复制数据,从而在数据库级别排除纯文本副本或基于触发器的复制。

总之,我会说你的目标应该是一个流。让Validator请求关于站点A的评论的所有内容,但不是一个批量,而是包含一个或多个评论包。

Validator现在可以在恒定的内存和处理器消耗下一个接一个地处理评论。为了获得性能,可以让Validator的多个实例同时提取不同的,不相交的流片段。同样,如果单独一个人无法足够快地回复拉动,您可以创建多个评论微服务实例。

验证器不保留这个流,它只产生错误并将它们存储或发送到某个地方;这应该满足您的不分享的重复要求。

+0

实际上,我们首先实现通过文件服务共享数据。源微服务正在导出文件并上传到文件服务并将文件url发送到目标微服务。方法工作稳定,但因为它的设计是复杂的,它成为一个问题,以添加一个新的服务相同的时尚..开发和测试努力是高.. 现在我们切换到队列流.. ..我们开始与兔子mq,但规划切换到kafka也:) 总之,我们现在正在应用您的建议.. – ygk

这里的问题不是“共享大量数据”,而是您选择分离微服务的界限。

我可以从您的要求中了解到,您选择分开的3个微服务(评估,验证,导入/导出)实际上是在相同的上下文和业务域上运行的。

我鼓励您重新考虑您的设计决策,并将评论视为一项单一的微服务,将所有评论操作和逻辑视为黑匣子。

+0

是的@Bishoy你可能是对的..但是当我开始合并在同一业务领域运行的服务时,它就变成了一个庞然大物。对我来说,验证是完全不同的逻辑和领域。其实这个服务不知道它是否验证审查或不只是在一些领域适用正则表达式.. – ygk

+0

这是一个很好的阅读如何决定一个微服务应该是多大:http://www.ben- morris.com/how-big-is-a-microservice/ – Bishoy

+0

我真的认为验证不应该是一个不同的服务,它不是一个真正不同的域。是不是域特定的验证规则是什么等?我认为试图分裂这一点使得它非常复杂。 @ygok – Kaj