微服务新手 - 重构整体“市场”数据库

时间:2017-02-04 23:20:58

标签: oop microservices

我是微服务的新手,并一直在努力将我的大脑包裹起来。从表面上看,它们听起来是个好主意,但从实际的角度来看,我无法摆脱我的集中式数据库背景。举个例子,我有这个真实的市场示例,我无法弄清楚微服务是否会有所帮助或受到伤害。这个网站运作良好,直到PO要求“私人产品”。现在它很脆弱,所以我需要做一个重要的重构。实现微服务的好时机。我觉得很多系统都有这种类型的耦合,因此解构这个例子非常有启发性。

当前状态

这是一个b2b市场,用户属于彼此购买产品的公司。目前,存在一个单一的数据库:用户,公司,目录,产品和订单。 (这是一种简化,实际情况要复杂得多,用户有角色,订单有标题/详细信息,产品有库存等)。

  • 用户属于公司
  • 公司有产品目录
  • 公司有其他公司的产品订单

到目前为止一切顺利。我可以看到将应用程序分解为主要实体边界上的微服务。

新要求

不幸的是,对于我的架构愿望,产品所有者需要更多功能。在这种情况下:私人产品。

  • 产品为公共或私人
  • 公司向其他公司的用户发送有时限的产品或目录邀请

这个看似简单的请求突然使一切变得复杂。

用例 - 用户显示产品列表

例如,列出或搜索产品曾经只是要求产品列出/搜索自己的简单案例。它是系统上最热门的查询之一。不幸的是,现在一个简单的用例就变得混乱了。

  • 用户应该能够看到所有公共产品(简单)
  • 用户应该能够看到他们自己公司的所有私人产品(并不可怕)
  • 用户可以看到他们公司过去订购的任何产品,无论隐私是什么(哦,现在产品需要了解用户公司的订单历史记录)
  • 用户可以看到他们有活跃邀请的任何私人产品(哦,现在产品需要了解与时间相关的用户产品或目录邀请)

初始单片方法

这可以在数据库级别解决,但SQL基本上将所有表连接在一起(而不仅仅是主数据表,所有事务也是如此。)虽然它比以前慢很多,因为DBMS是设计用于大型连接似乎是合适的工具。所以我可以开始优化查询。但是,正如我所说,由于这个原因和其他原因,系统感觉很脆弱。

初步设计思想......最终我的问题

因此,考虑到微服务架构是一个潜在的新方向,我开始思考如何开始。数据冗余似乎是必要的因为,如果我将我的主要实体转换为服务,要求获得没有数据冗余的产品列表,就会让所有服务相互调用并且速度很慢。

从创建“产品和目录”作为自己的微服务的想法开始。由于目录只是产品的集合,它们似乎属于一体 - 我只是把整个事情称为“产品服务”。该服务将具有用于管理产品和目录的API,最重要的是,用于搜索和列出它们。

作为一项单独的服务,执行产品搜索需要大量冗余数据,因为它必须订阅任何影响产品隐私的事件,例如:

  • 收听订单并至少保留所购买产品与采购公司之间关系的摘要
  • 收听邀请并维护有效用户/产品/时间关系列表
  • 收听用户和公司活动以维护用户与公司的关系

我开始担心保持全部同步。

最后,产品服务将复制当前架构的很大一部分。所以我开始想,也许微服务不会适用于这种情况。或者我是戏剧性的,架构会更简单,更容易管理,更快,所以值得吗?

总的来说,我是否正确地考虑了整个方法?这是基于微服务的设计是如何被考虑的?如果没有,有人可以向我推动另一个方向吗?

1 个答案:

答案 0 :(得分:1)

尝试将系统一次又一次地分解为服务直到有意义为止。用你的直觉。阅读更多书籍,文章,论坛,其他人描述他们是如何做到的。

您已经提到将ProductService拆分为Product和ProductSearch没有意义 - 公平,尝试实现它。如果由于某种原因或性能瓶颈而最终会出现相当复杂的架构 - 这是继续进一步分裂的好兆头。如果没有 - 对于您的特定域名来说就好了。

并非所有产品服务都是平等的。在某些情况下,您必须每天能够创建数百万甚至数十亿的产品。在这种情况下,您最有可能考虑分离产品目录和产品搜索。原因是性能:要使搜索执行速度更快(索引),您必须减慢插入速度。这是两个相互排斥的目标,如果不将数据分成不同的微服务(这也将导致数据重复),很难实现这两个目标。