在去年的大部分时间里,我的公司一直在根据(微)服务架构的原则切割整体并构建新产品。这一切都很好,并且为我们提供了很大的灵活性,可以保持UI和后端逻辑的分离,并降低依赖性。
BUT!
我们的业务中有一个重要部分因此而越来越头疼,即报告。
由于我们确保服务之间没有数据复制(和业务逻辑共享),因此每个服务都知道自己的数据,如果另一个服务确实需要保留对该数据的引用,那么它们通过ID(实体)来实现。基本上连接)。虽然它很棒,但报道并不好。
我们的业务经常需要创建关于客户发生的特定实例的临时报告。在“过去的日子”中,您创建了一个简单的SQL查询,它连接了几个数据库表并查询了您需要的任何内容,但是对于解耦服务是不可能的。这是业务所看到的问题。
我个人并不是后端用于报告目的的数据复制的粉丝,因为这可能有另一种趋势变成噩梦(它甚至已经存在于我们的传统巨石中)。所以这个问题实际上并不是关于传统的单块与现代微服务,而是关于数据依赖性。
您是否遇到过这样的问题?如果是,那您是如何解决的?
修改
我们一直在讨论如何解决这个问题的几个潜在解决方案,但其中没有一个实际上是好的,我还没有得到我正在寻找的答案,但却大规模地解决了这些问题。
很好的旧复制 - 一切 - 让我们让人们想象出来的是今天仍然习惯的东西。从旧的整体时代开始,BI /数据仓库团队制作了所有数据库的副本,但是同样的做法更加不方便,但到目前为止仍然使用数据库的所有微服务都做了。由于各种原因这种情况并不好,并伴随着你可以期待的共享沙盒癌症。
构建一个单独的微服务或一组用于获取特定报告的微服务。它们中的每一个都连接到设置微服务,其中包含相关数据并按预期构建报告。然而,这会引入更紧密的耦合,并且对于大型数据集而言可能非常复杂和缓慢。
构建一个单独的微服务或一组微服务,每个服务都有从后台其他数据库复制的数据库。这是有问题的,因为团队数据库正在耦合,数据被直接复制,并且强烈依赖于正在使用的数据库技术。
让每个服务向RabbitMQ发送BI服务可以接收的事件,然后根据需要获取其他数据。这听起来对我来说是最好的,但到目前为止最复杂的实现,因为所有服务都需要开始发布相关数据。这是我个人现在所选择的,从一个非常抽象的层面,即。
答案 0 :(得分:2)
所以,我不确定这会满足你的需求 - 但我将描述我们对BI的总体方法:
答案 1 :(得分:2)
解决方案是将来自不同服务的数据聚合到一个中央报告数据库中 - 如果所收集的数据按时间版本化,这是可行的 - 即您可以转到报告数据并获取正确的时间点数据(那个时候)
将数据提供给服务可以通过各种服务发布的事件或定期导入," log"聚合或它们的组合。
我将此模式称为aggregated reporting
请注意,除此之外,您还需要从各个服务获取需要更新的内容的数据,因为聚合解决方案具有固有的延迟(降低的新鲜度)
编辑: 考虑到您所做的编辑以及您所做的评论(即席查询),我说您需要将此视为一个旅程,也就是说,您希望获得选项4所以首先从您必须回答当前临时需求的数据源中提取数据,在开发过程中转换为消息并添加更多来源。
此外,您可能想要考虑服务之间的差异(不要在它们之间共享内部数据结构并具有严格的界限)和方面(可以使用相同来源的半独立服务部分)
PS 我还写了InfoQ piece on BI & SOA汤姆在评论中提到的 - 这基本上是在谈论这个想法 - 这篇文章是从2007年开始的,即我已经成功应用了这一点十多年了(不同的技术,从在读取时写入架构的架构等但原理相同)