在微服务之间共享巨大的数据
我正在设计微服务体系结构中的审阅分析平台。在微服务之间共享巨大的数据
应用程序是像下面的作品;从电子商务站点-A(站点一)检索为Excel
- 所有产品意见文件
- 评论上传到系统与Excel
- 分析代理可以列出所有的评论,编辑其中的一些,删除或批准
- 分析代理可以导出网站的所有评论-a
- 基于自动正则表达式的检查应用于每次上传和编辑评论。
我有3个微服务。
- 点评:负责类似批准/拒绝评论CRUD操作以及操作方法。
- 验证:负责制定和审核应用验证规则。
- 导出/导入:出口服务出口给定站点的名称(如网站-A)
问题是在某些时候大文件,验证服务需要获得所有评论网站一,应用验证规则并且如果有的话会产生错误。我知道共享数据库模式和实体会破坏微服务架构。
一个可能的解决方案是
- 每当验证服务需要一个现场审查,它要求网关,网关重定向请求评论服务和响应服用。
两个这种方法的缺点可能是
- 验证服务知道有关网关?它是否会带来依赖性?
- 万一我有一个网站的1b评论,通过休息请求获得所有评论可能是一个问题。 (或没有,我可以从验证服务,使分页请求的网关。)
那么,什么是分享微服务之间的巨大数据的最佳实践,而不
- 共享实体
- 和dublicating的数据
我读了很多关于使用消息队列,但我认为在我的情况下,使用消息队列共享千兆字节的数据并不好。
编辑1:而不是共享实体,使用数据存储与其余API可以解决?假设我使用的是mongodb,而不是在微服务之间共享我的实体对象,我可以使用mongo的休息界面(http://restheart.org/)并尽可能查询数据。
我认为评论是相互独立的,因此验证评论只需要评论,而不需要其他评论。
你不想共享实体,这就排除了共享数据库,Hadoop集群或像Redis这样的数据存储。您也不想复制数据,从而在数据库级别排除纯文本副本或基于触发器的复制。
总之,我会说你的目标应该是一个流。让Validator请求关于站点A的评论的所有内容,但不是一个批量,而是包含一个或多个评论包。
Validator现在可以在恒定的内存和处理器消耗下一个接一个地处理评论。为了获得性能,可以让Validator的多个实例同时提取不同的,不相交的流片段。同样,如果单独一个人无法足够快地回复拉动,您可以创建多个评论微服务实例。
验证器不保留这个流,它只产生错误并将它们存储或发送到某个地方;这应该满足您的不分享的重复要求。
实际上,我们首先实现通过文件服务共享数据。源微服务正在导出文件并上传到文件服务并将文件url发送到目标微服务。方法工作稳定,但因为它的设计是复杂的,它成为一个问题,以添加一个新的服务相同的时尚..开发和测试努力是高.. 现在我们切换到队列流.. ..我们开始与兔子mq,但规划切换到kafka也:) 总之,我们现在正在应用您的建议.. – ygk
这里的问题不是“共享大量数据”,而是您选择分离微服务的界限。
我可以从您的要求中了解到,您选择分开的3个微服务(评估,验证,导入/导出)实际上是在相同的上下文和业务域上运行的。
我鼓励您重新考虑您的设计决策,并将评论视为一项单一的微服务,将所有评论操作和逻辑视为黑匣子。
您可以尝试企业集成模式。我不知道哪种模式可以解决确切的用例,但应该包含它们。 – k1133