我正在开发一个微(或宏)服务架构。由于团队规模较小,一些服务稍微大一些,但从域设计的角度来看,仍然很好地绑定在一起,而不是分解为完整的小微服务。我们现在正忙于实现一项服务,该服务负责用户分析,并能够基于这些分析创建用户细分列表。然后,这些段可以触发应用程序中的动作,例如解锁CMS微服务中的内容等。
我在这里的痛苦是,这个用户细分服务现在的情况是,它必须“意识到”许多其他服务才能执行这些操作,这感觉像是一种反模式,并倾向于分布式整体设计。这种方法的最大损失是现在其他服务与此服务紧密耦合,如果不先测试/更新此用户列表服务本身,则无法更新。
我可以使用protobufs作为消息类型来实现并使用异步通信(而不是GRPC,因为lambda不支持这个)。我知道这比同步通信更好,因为可能会出现超时问题,等等,但这真的是我能做的减少耦合的唯一方法吗?或者我错过了一些关键的服务设计思想。
帮助!
发布于 2020-11-17 00:40:03
我在这里的痛苦是,这个用户细分服务现在所处的情况是,它必须“意识到”许多其他服务才能执行这些操作,这感觉像是一种反模式,并倾向于分布式整体设计。
这是每个人在围绕微服务架构设计系统时都要面对的问题。请记住,服务并不是100%分离的(除了在一些真实的情况下,比如数据收集器服务或类似的情况,但即使这样,它也会以某种方式意识到向其提供事件的服务)。他们必须以某种方式相互沟通和了解对方,但关键是有多少和如何?解决方案是基于您的业务操作的混合通信方法(请参阅此Answer)。我的意思是,有时调用微服务比将事件发布到队列更好。这真的取决于你的业务运营。
在这种方法上最大的损失是现在其他服务与此服务紧密耦合,如果不首先测试/更新此用户列表服务本身,则无法更新。
如果你的意思是一个业务操作,如果一个操作没有在另一个服务中执行/执行,那么在大多数情况下应该避免这种情况。我说在大多数情况下,因为有时这是不可能的(例如,如果你有一个身份/身份验证微服务或一些其他服务,比如为你提供一些基本功能的云服务,你必须依赖于它;)。如何避免这种情况?例如,让操作在没有依赖微服务结果的情况下完成,然后更新您的聚合(最终一致性)。考虑在这种情况下使用Saga。如果这是不可能的,请考虑将这两个微服务合并为1,或者接受这样一个事实,即您有两个高度耦合的微服务(至少对于这一个业务操作)。另一种选择是将来自微服务A的数据复制到微服务B中,以便微服务B不需要每次需要某些数据时都调用微服务A。同样,这并不是所有场景的解决方案。查看information.
GRPC可以实现并使用protobufs作为消息类型的异步通信(而不是
,因为lambda不支持这一点)。我知道这比同步通信更好,因为可能会出现超时问题,等等,但这真的是我能做的减少耦合的唯一方法吗?
是的,你是对的,这不会解决你的问题,因为你的操作仍然会被阻塞,但通过队列的异步通信选项将帮助你在其他情况下。
https://stackoverflow.com/questions/64789123
复制相似问题