删除对象时的微服务通信

Posted

技术标签:

【中文标题】删除对象时的微服务通信【英文标题】:Communication of microservices at deleting an object 【发布时间】:2019-06-20 00:24:50 【问题描述】:

我们的应用程序由微服务组成。在我这边,在删除某个东西之前,它可能会在另一个微服务中使用。因此,我需要询问另一个微服务,该东西在您身边使用。为此,我使用 spring-cloud-event-bus 发送一个事件,我需要等到响应到来,所以我无法返回任何响应 tu UI。另外,我可以在侦听器类中进行响应。如何将消息转发给控制器。如何管理流程。

我有一个想法,但我认为它不明智,当删除请求到来时,我将事件发送到另一个微服务,我正在等待响应。我将其他微服务的响应保存到 mongodb 中,对象的 id 将被删除。顺便说一句,控制器检查数据库以获取响应

【问题讨论】:

您还可以向您的其他微服务发送同步 http 请求,并在执行删除例程之前查询远程控制器中是否存在此类方法的现有关系。我不知道公共汽车是否是解决这个问题的正确方法。 不幸的是,我们的团队负责人希望使用事件总线在微服务之间进行通信:( 【参考方案1】:

您有一个更大的问题:一个微服务必须根据它不拥有的数据做出决定。

该数据最终是一致的。例如,微服务 A 会从微服务 B 获得删除某些内容的权限,但与此同时,微服务 B 的情况会发生变化:您将根据过期信息删除某些内容。

我建议你从整体上看一下你的设计,也许你错过了一些重要的概念,或者将单体拆分成错误的微服务。

如果您仍想保留当前架构,那么我建议保留远程资源使用情况的本地缓存。您将在删除资源之前询问此本地缓存,而无需与其他微服务同步通信。这将使您的系统更简单,也更有弹性。

本地缓存可以使用事件保持最新。每当微服务 B 开始使用资源时,它都会通知微服务 A;当它不再使用该资源时也是如此。使用事件是首选方式。在这里您可以使用您的事件总线。

或者您可以使用定期运行的后台任务;这样做的优点是微服务 B 保持不变,但缺点是同步之间可能存在很大的时间间隔。

【讨论】:

以上是关于删除对象时的微服务通信的主要内容,如果未能解决你的问题,请参考以下文章

相互通信的微服务 - 如何?

使用 REST & PUB/SUB 的微服务间通信

你可以使用 gRPC/gRPC-Web 在 Azure 上托管的微服务之间进行通信吗?

利用gRPC,Ballerina和Go建立有效的「微服务」

微服务如何在异步通信中做授权?

精通springcloud:消息驱动的微服务,发布/订阅模型