【问题标题】:Sharing huge data between microservices在微服务之间共享海量数据
【发布时间】:2016-08-15 00:29:58
【问题描述】:

我正在设计一个微服务架构的评论分析平台。

应用程序如下所示;

  • 从 ecommerce-site-a (site-a) 中检索到的所有产品评论作为 excel 文件
  • 评论通过excel上传到系统
  • 分析代理可以列出所有评论、编辑部分评论、删除或批准
  • 分析代理可以导出站点 a 的所有评论
  • 基于正则表达式的自动检查适用于上传和编辑的每次审核。

我有 3 个微服务。

  • 审核:负责审核 Crud 操作以及类似于批准/拒绝的操作..
  • 验证:负责定义和应用审查的验证规则。
  • 导出/导入:导出服务导出给定站点名称的大文件(如 site-a)

问题是在某些时候,验证服务需要获取站点 a 的所有评论,应用验证规则并生成错误(如果有)。我知道共享数据库架构和实体会破坏微服务架构。

一种可能的解决方案是

  • 每当验证服务需要对站点进行评论时,它都会请求网关,网关将请求重定向到评论服务并采取响应。

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

  • 验证服务了解网关?会不会带来依赖?
  • 如果我有一个网站的 1b 评论,通过休息请求获取所有评论可能是个问题。 (或者不,我可以从验证服务向网关发出分页请求..)

那么在微服务之间共享海量数据的最佳实践是什么?

  • 共享实体
  • 和复制数据

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


edit 1:不是共享实体,而是使用带有rest API的数据存储可以成为解决方案吗?假设我使用的是 mongodb,而不是在微服务之间共享我的实体对象,我可以使用 mongo (http://restheart.org/) 的 rest 接口并尽可能地查询数据。

【问题讨论】:

  • 您可以尝试企业集成模式。我不知道可以解决确切用例的模式,但应该包含在其中。

标签: microservices


【解决方案1】:

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

您不想共享实体,这排除了共享数据库、Hadoop 集群或 Redis 等数据存储之类的东西。您也不想复制数据,从而排除了纯文件复制或数据库级别基于触发器的复制。

总之,我想说你的目标应该是一个流。让验证器从评论中请求关于站点 A 的所有内容,但不是批量,而是在单个或小包评论流中。

验证器现在可以在不断消耗内存和处理器的情况下一个接一个地处理评论。为了获得性能,您可以创建多个验证器实例,它们同时拉取不同的、分离的流片段。同样,如果一个人无法足够快地响应请求,您可以创建多个评论微服务实例。

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

【讨论】:

  • 实际上我们首先实现了通过文件服务共享数据。源微服务正在导出文件并上传到文件服务,并将文件 url 发送到目标微服务。方法工作稳定,但由于它的设计很复杂,因此添加具有相同方式的新服务成为问题.. 开发和测试工作量很大.. 现在我们切换到通过队列流式传输.. 我们从 rabbit-mq 开始但计划切换也到 kafka :) 总之,我们现在正在应用您的提案..
【解决方案2】:

您的问题不是“共享海量数据”,而是您选择基于哪些边界来分离微服务。

我可以从您的要求中看出,您选择分离的 3 个微服务(评论、验证、导入/导出)实际上是在相同的上下文和业务域中运行的……这就是评论。

我鼓励您重新考虑您的设计决策,并将评论视为一个单一的微服务,它将所有评论操作和逻辑作为一个黑盒来处理。

【讨论】:

  • 是的@Bishoy,你可能是对的。但是当我开始组合在同一业务领域运行的服务时,它就变成了一个整体。对我来说,验证是完全不同的逻辑和领域。实际上,此服务不知道它是否正在验证评论,它只是在某些字段上应用正则表达式..
  • 这是一本关于如何决定微服务应该有多大的好书:ben-morris.com/how-big-is-a-microservice
  • 我真的认为验证不应该是一个不同的服务,它不是一个真正不同的域。验证规则等不是特定于域的吗?我认为试图将其分开会使事情变得过于复杂。 @ygok
  • 是的@Kaj 我同意他们可能在同一个微服务中。但是,如果我有两个需要共享大量数据的真实的、定义明确的微服务呢?我们可以限制说“如果两个微服务共享大量数据,那么它们应该是单一服务吗?”..我不这么认为..
猜你喜欢
  • 2016-07-30
  • 2017-05-29
  • 2019-01-31
  • 2017-05-27
  • 2016-11-05
  • 1970-01-01
  • 2017-09-26
  • 2016-03-28
  • 2013-02-25
相关资源
最近更新 更多