【问题标题】:How to design a microservice that needs to communicate with others如何设计需要与他人通信的微服务
【发布时间】:2021-02-23 14:02:15
【问题描述】:

我正在开发一个微(或宏)服务架构。由于团队规模较小,一些服务没有分解成完整的小型微服务,而是稍大一些,但从领域设计的角度来看仍然有很好的界限。我们现在正忙于实施一项服务,该服务负责用户分析,并能够根据这些分析创建用户细分列表。然后这些段可以触发应用程序中的操作,例如解锁 CMS 微服务中的内容等。

我的痛苦是,这个用户细分服务现在处于必须“了解”许多其他服务才能执行这些操作的情况,这感觉像是一种反模式并且倾向于分布式单体设计。这种方法的最大损失是现在其他服务与此服务紧密耦合,并且如果不先测试/更新此用户列表服务本身就无法更新。

我可以使用 protobufs 作为消息类型来实现和使用异步通信(不是 GRPC,因为 lambda 不支持这一点)。我知道这比同步通信要好,因为可能会出现超时问题等,但这真的是我能做的减少耦合的全部吗?还是我错过了一些关键的服务设计思想。

帮助!

【问题讨论】:

    标签: microservices


    【解决方案1】:

    我的痛苦是这个用户细分服务现在处于一种情况 它必须“意识到”许多其他服务才能执行这些 感觉像反模式并倾向于 分布式单体设计。

    这是每个人在围绕微服务架构设计系统时都会面临的问题。请记住,服务并没有 100% 的分离(除了在某些真正评分的情况下,例如数据收集器服务或类似的情况,但即便如此,它还是会以某种方式意识到正在为其提供事件的服务)。他们必须以某种方式进行交流并相互了解,但关键是多少以及如何? 对此的解决方案是根据您的业务运营混合通信方法(请参阅Answer)。我的意思是有时调用微服务比将事件发布到队列更好。这实际上取决于您的业务运营。

    这种方法的最大损失是现在其他服务紧 与此服务耦合,未经测试/更新无法更新 此用户首先列出服务本身。

    • 紧密耦合。如果您的意思是如果在其他服务中未执行/执行某个操作而停止的业务操作,那么在大多数情况下应该避免这种情况。我说在大多数情况下,有时这是不可能的(例如,如果您有身份/身份验证微服务或其他一些服务,例如为您提供一些基本功能的云服务,您必须依赖它;)) .如何避免这种情况?例如,在没有依赖微服务的结果的情况下完成操作,然后更新您的聚合(最终一致性)。考虑在这种情况下使用 Saga。如果这不可能,请考虑将这 2 个微服务合并为 1 个,或者接受您拥有 2 个高度耦合的微服务的事实(至少对于这一业务操作而言)。另一种选择是将微服务A的数据复制到微服务B中,这样微服务B就不需要在每次需要一些数据时都调用微服务A。同样,这不是所有场景的解决方案。更多信息请查看this 答案。
    • 测试。出于测试目的,您应该模拟所有跨微服务调用,而不是阻止其他服务的单元/集成测试。这是微服务系统中的常用方法。这样您的测试就不会依赖于其他微服务。

    我可以使用 protobufs 实现并使用异步通信 作为消息类型(不是 GRPC,因为 lambda 不支持此)。我明白了 这比同步通信要好,因为 可能的超时问题等,但这真的是我能做的吗 减少耦合?

    是的,您是对的,这不会解决您的问题,因为您的操作仍将被阻止,但通过队列提供异步通信选项将有助于您处理其他情况。

    【讨论】:

      猜你喜欢
      • 2017-12-31
      • 2017-06-25
      • 2021-06-20
      • 2020-12-27
      • 1970-01-01
      • 2020-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多