面向服务架构中的业务数据查询/报告

时间:2017-04-03 08:33:41

标签: database reporting soa microservices database-replication

在去年的大部分时间里,我的公司一直在根据(微)服务架构的原则切割整体并构建新产品。这一切都很好,并且为我们提供了很大的灵活性,可以保持UI和后端逻辑的分离,并降低依赖性。

BUT!

我们的业务中有一个重要部分因此而越来越头疼,即报告。

由于我们确保服务之间没有数据复制(和业务逻辑共享),因此每个服务都知道自己的数据,如果另一个服务确实需要保留对该数据的引用,那么它们通过ID(实体)来实现。基本上连接)。虽然它很棒,但报道并不好。

我们的业务经常需要创建关于客户发生的特定实例的临时报告。在“过去的日子”中,您创建了一个简单的SQL查询,它连接了几个数据库表并查询了您需要的任何内容,但是对于解耦服务是不可能的。这是业务所看到的问题。

我个人并不是后端用于报告目的的数据复制的粉丝,因为这可能有另一种趋势变成噩梦(它甚至已经存在于我们的传统巨石中)。所以这个问题实际上并不是关于传统的单块与现代微服务,而是关于数据依赖性。

您是否遇到过这样的问题?如果是,那您是如何解决的?

修改

我们一直在讨论如何解决这个问题的几个潜在解决方案,但其中没有一个实际上是好的,我还没有得到我正在寻找的答案,但却大规模地解决了这些问题。

  1. 很好的旧复制 - 一切 - 让我们让人们想象出来的是今天仍然习惯的东西。从旧的整体时代开始,BI /数据仓库团队制作了所有数据库的副本,但是同样的做法更加不方便,但到目前为止仍然使用数据库的所有微服务都做了。由于各种原因这种情况并不好,并伴随着你可以期待的共享沙盒癌症。

  2. 构建一个单独的微服务或一组用于获取特定报告的微服务。它们中的每一个都连接到设置微服务,其中包含相关数据并按预期构建报告。然而,这会引入更紧密的耦合,并且对于大型数据集而言可能非常复杂和缓慢。

  3. 构建一个单独的微服务或一组微服务,每个服务都有从后台其他数据库复制的数据库。这是有问题的,因为团队数据库正在耦合,数据被直接复制,并且强烈依赖于正在使用的数据库技术。

  4. 让每个服务向RabbitMQ发送BI服务可以接收的事件,然后根据需要获取其他数据。这听起来对我来说是最好的,但到目前为止最复杂的实现,因为所有服务都需要开始发布相关数据。这是我个人现在所选择的,从一个非常抽象的层面,即。

2 个答案:

答案 0 :(得分:2)

所以,我不确定这会满足你的需求 - 但我将描述我们对BI的总体方法:

  1. 我们系统中的所有内容都会生成一个事件:后端中的操作,移动应用中的操作 - 我们要跟踪的所有内容都会生成包含相关数据(ids,时间,名称等)的事件。
  2. 所有活动都会发送到一些公共漏斗进行收集 - 它是一个接收事件的后端应用程序 - 确保它们有效 - 并存储它们。
  3. 您可以将事件存储在某些无sql存储(如Elasticsearch)或云端(如google的BigQuery)。
  4. 一旦进入,只需查询和交叉引用即可获得您想要的整体图片。这就是我们的BI人员所做的事情:他们从我们收集的大量事件中生成了一张图片。

答案 1 :(得分:2)

解决方案是将来自不同服务的数据聚合到一个中央报告数据库中 - 如果所收集的数据按时间版本化,这是可行的 - 即您可以转到报告数据并获取正确的时间点数据(那个时候)

将数据提供给服务可以通过各种服务发布的事件或定期导入," log"聚合或它们的组合。

我将此模式称为aggregated reporting

请注意,除此之外,您还需要从各个服务获取需要更新的内容的数据,因为聚合解决方案具有固有的延迟(降低的新鲜度)

编辑: 考虑到您所做的编辑以及您所做的评论(即席查询),我说您需要将此视为一个旅程,也就是说,您希望获得选项4所以首先从您必须回答当前临时需求的数据源中提取数据,在开发过程中转换为消息并添加更多来源。

此外,您可能想要考虑服务之间的差异(不要在它们之间共享内部数据结构并具有严格的界限)和方面(可以使用相同来源的半独立服务部分)

PS 我还写了InfoQ piece on BI & SOA汤姆在评论中提到的 - 这基本上是在谈论这个想法 - 这篇文章是从2007年开始的,即我已经成功应用了这一点十多年了(不同的技术,从在读取时写入架构的架构等但原理相同)