去年的大部分时间,我公司一直在根据(微)服务架构的原则开发一个庞然大物并构建新产品。这一切都很好,并使我们在保持UI和后端逻辑分离并降低依赖关系方面具有很大的灵活性。面向服务架构中的业务数据查询/报表
但是!
由于这一点,我们的业务中有一个重要部分越来越令人头痛,即报告。
由于我们确保服务之间不存在数据复制(和业务逻辑共享),因此每个服务都知道它自己的数据,如果另一个服务确实需要为该数据保留一个引用,他们通过ID(实体链接,基本上)。虽然其他方面很好,但报告并不好。
我们的业务通常需要创建关于与我们的客户发生的特定情况的临时报告。在'过去的日子'中,您做了一个简单的SQL查询,它加入了一些数据库表并查询您需要的任何内容,但这对于解耦服务来说是不可能的。这是业务看到的问题。
我个人不喜欢数据复制用于报告目的的后端,因为这可能会有另一种趋势发展成恶梦(它甚至已经在我们的传统巨石中)。所以这个问题实际上不是关于遗留巨石与现代微服务的关系,而是关于一般数据依赖关系。
你有没有遇到这样的问题,如果是的话,那么你是如何解决的?
编辑:
我们内部一直在讨论一些可能的解决方案如何解决这个问题,但他们都不是真正好的,我没有得到我要的答案又可以解决大规模的问题。
良好的旧复制一切,让我们的人数字它是今天仍然使用的。从旧的庞然大物时代开始,BI /数据仓库团队重复了所有数据库,但同样的做法更加不方便,但对于所有使用数据库的微服务来说,至今仍是如此。由于各种原因,这种情况并不好,并且伴随着您所期望的共享沙箱癌症。
构建一个单独的微服务或一组微服务,用于提取特定报告。他们中的每一个都连接到设置携带相关数据的微服务并按预期构建报告。这引入了更紧密的耦合,但对于大型数据集来说,这可能会非常复杂并且速度很慢。
构建一个单独的微服务或一组微服务,每个微服务都具有从其他数据库在后台复制的数据库。随着团队数据库的耦合以及数据的直接复制,以及对正在使用的数据库技术的强烈依赖,这是个问题。
让每个服务都向RabbitMQ发送一个事件,BI服务会启动,然后获取额外的数据(如果需要)。这听起来对我来说是最好的,但是到目前为止,实施起来最复杂,因为所有服务都需要开始发布相关数据。这是我目前亲自选择的,从非常抽象的层面来看,就是说。
*保持UI和后端逻辑分离* - 这不是你做SOA的原因。 –
https://www.infoq.com/articles/BI-and-SOA - 可能会帮助 –
[SOA(商业智能和面向服务的体系结构)中的报告](http://stackoverflow.com/questions/9538710/reports-in-soa-business-intelligence-service-oriented-architecture) –