代码之家  ›  专栏  ›  技术社区  ›  user1578872

从单片到微服务

  •  0
  • user1578872  · 技术社区  · 4 年前

    我有一个monolothic应用程序,我正试图将其转换为基于微服务的应用程序。

    方法1:-

    1. 数据库仍然保持不变,但将有多个微服务连接到同一个数据库

    方法2:-

    不同模块的微服务不同,每个微服务都有自己的数据库。 但是,每个模块都需要用户数据(表->用户)。

    我们分成4个模块。管理模块、计费模块、预约模块、库存模块

    这里,例如:管理模块、预约模块和;计费模块需要用户数据。对于预约模块,某些预约查询需要与其他数据库中的用户表连接。

    这个怎么办?

    0 回复  |  直到 4 年前
        1
  •  3
  •   xs2tarunkukreja    4 年前

    微服务永远不应该有公共数据库。我们应该避免同样的情况。

    现在,第二种选择越来越接近微服务。但它有一个缺点,那就是共享用户数据库。理想情况下,用户数据库应由单独的服务(用户数据的主要真实来源)管理。

    现在的问题是,其他服务将如何获取用户数据。有两种选择:- A.其他服务将调用用户服务以获取用户数据。 B.其他服务将保留用户数据的副本。每当用户服务中的用户数据发生任何变化时,它都会发布一个事件,所有其他服务都会更新并复制相同的事件。

    现在的问题是,你们应该选择哪个选项。我更喜欢A选项(呼叫用户服务获取用户数据)。如果存在性能限制,并且使用缓存无法满足同样的要求,那么您应该选择选项B。

        2
  •  2
  •   JArgente    4 年前

    首先,你应该考虑你是否真的需要一个微服务架构,因为只有当微服务非常独立时,你才能从这种架构中获益,我的意思是,如果它们之间的连接很少。

    这么说,第一种方法是完全不可取的,因为微服务架构的关键是微服务应该完全解耦,如果它们共享相同的数据库+模式+表,其中一个所需的更改将触发其余部分的更改,所以你将拥有一个分布式单体(两者都是最糟糕的)。

    有两种可能的解决方案。 其中之一是每次需要用户信息时都会调用用户服务,但糟糕的是,每次需要这些信息时,你都必须拨打电话,因此你依赖于其他服务,延迟也会增加。

    另一种解决方案是在需要此信息的其他服务上复制用户表(仅需要的部分),并使用消息异步更新它。例如,有一个kafka或其他消息队列,当用户表上有任何更新时,用户服务将在特定主题中发布一条消息,其他服务将订阅该消息,这样他们就可以相应地更新他们的用户信息。

    这里的问题是最终的一致性,我的意思是,其他服务不会立即看到更新。

    正如你所看到的,这两个选项都有一些缺点,都是因为服务之间的通信,所以它们之间的通信越少,对微服务架构来说就越好