在微服务之间共享海量数据
Sharing huge data between microservices
我正在设计一个微服务架构的评论分析平台。
应用程序如下所示;
- 从 ecommerce-site-a ( site-a ) 检索的所有产品评论作为 excel 文件
- 评论上传到系统 excel
- 分析代理可以列出所有评论、编辑其中的一些评论、删除或批准
- 分析代理可以导出站点 a 的所有评论
- 对上传和编辑的每条评论应用基于正则表达式的自动检查。
我有 3 个微服务。
- Reviews:负责 Review Crud 操作以及类似于 approve/reject..
的操作
- 验证:负责定义和应用审核规则。
- Export/Import: 导出服务导出给定站点名称(如 site-a)的大文件
问题是在某些时候,验证服务需要获取站点-a 的所有评论,应用验证规则并生成错误(如果有)。我知道共享数据库模式和实体会破坏微服务架构。
一个可能的解决方案是
- 每当验证服务需要对站点进行评论时,它就会请求网关,网关将请求重定向到评论服务并做出响应。
这种方法的两个可能的缺点是
- 验证服务知道网关?是否带来了依赖性?
- 如果我对某个网站有 1b 条评论,通过休息请求获取所有评论可能是个问题。 (或者不,我可以从验证服务到网关发出分页请求..)
那么在没有
的情况下,在微服务之间共享大量数据的最佳实践是什么?
- 共享实体
- 和复制数据
我阅读了很多有关使用消息队列的信息,但我认为在我的情况下使用消息队列共享千兆字节的数据并不好。
编辑 1:除了共享实体之外,将数据存储与 rest API 结合使用是一种解决方案吗?假设我正在使用 mongodb,而不是在微服务之间共享我的实体对象,我可以使用 mongo (http://restheart.org/) 的 rest 接口并尽可能查询数据。
你的问题不是"sharing huge data",而是你选择的分离微服务所依据的边界。
我可以从您的要求中看出,您选择分离的 3 个微服务(评论、验证、Import/Export)实际上在相同的上下文和业务领域中运行......即评论。
我鼓励您重新考虑您的设计决策,并考虑将评论作为一个单独的微服务,将所有评论操作和逻辑作为黑盒处理。
我假设评论彼此独立,因此验证评论只需要该评论,不需要其他评论。
您不想共享实体,这排除了共享数据库、Hadoop 集群或 Redis 等数据存储之类的东西。您也不希望复制数据,因此排除了普通文件副本或数据库级别的基于触发器的复制。
总而言之,我想说你的目标应该是流。让验证器从有关站点 A 的评论中请求所有内容,但不是批量请求,而是以单个或小包评论流的形式请求。
验证器现在可以一个接一个地处理评论,同时消耗恒定的内存和处理器。为了获得性能,您可以创建多个 Validator 实例,它们同时拉取不同的、分离的流片段。同样,如果单独一个无法足够快地响应请求,您可以创建评论微服务的多个实例。
Validator 不会保留此流,它只会产生错误并将它们存储或发送到某处;这应该满足您的不共享不重复要求。
我正在设计一个微服务架构的评论分析平台。
应用程序如下所示;
- 从 ecommerce-site-a ( site-a ) 检索的所有产品评论作为 excel 文件
- 评论上传到系统 excel
- 分析代理可以列出所有评论、编辑其中的一些评论、删除或批准
- 分析代理可以导出站点 a 的所有评论
- 对上传和编辑的每条评论应用基于正则表达式的自动检查。
我有 3 个微服务。
- Reviews:负责 Review Crud 操作以及类似于 approve/reject.. 的操作
- 验证:负责定义和应用审核规则。
- Export/Import: 导出服务导出给定站点名称(如 site-a)的大文件
问题是在某些时候,验证服务需要获取站点-a 的所有评论,应用验证规则并生成错误(如果有)。我知道共享数据库模式和实体会破坏微服务架构。
一个可能的解决方案是
- 每当验证服务需要对站点进行评论时,它就会请求网关,网关将请求重定向到评论服务并做出响应。
这种方法的两个可能的缺点是
- 验证服务知道网关?是否带来了依赖性?
- 如果我对某个网站有 1b 条评论,通过休息请求获取所有评论可能是个问题。 (或者不,我可以从验证服务到网关发出分页请求..)
那么在没有
的情况下,在微服务之间共享大量数据的最佳实践是什么?- 共享实体
- 和复制数据
我阅读了很多有关使用消息队列的信息,但我认为在我的情况下使用消息队列共享千兆字节的数据并不好。
编辑 1:除了共享实体之外,将数据存储与 rest API 结合使用是一种解决方案吗?假设我正在使用 mongodb,而不是在微服务之间共享我的实体对象,我可以使用 mongo (http://restheart.org/) 的 rest 接口并尽可能查询数据。
你的问题不是"sharing huge data",而是你选择的分离微服务所依据的边界。
我可以从您的要求中看出,您选择分离的 3 个微服务(评论、验证、Import/Export)实际上在相同的上下文和业务领域中运行......即评论。
我鼓励您重新考虑您的设计决策,并考虑将评论作为一个单独的微服务,将所有评论操作和逻辑作为黑盒处理。
我假设评论彼此独立,因此验证评论只需要该评论,不需要其他评论。
您不想共享实体,这排除了共享数据库、Hadoop 集群或 Redis 等数据存储之类的东西。您也不希望复制数据,因此排除了普通文件副本或数据库级别的基于触发器的复制。
总而言之,我想说你的目标应该是流。让验证器从有关站点 A 的评论中请求所有内容,但不是批量请求,而是以单个或小包评论流的形式请求。
验证器现在可以一个接一个地处理评论,同时消耗恒定的内存和处理器。为了获得性能,您可以创建多个 Validator 实例,它们同时拉取不同的、分离的流片段。同样,如果单独一个无法足够快地响应请求,您可以创建评论微服务的多个实例。
Validator 不会保留此流,它只会产生错误并将它们存储或发送到某处;这应该满足您的不共享不重复要求。