微服务和 PubSub:如何确保服务使用正确的事件

Posted

技术标签:

【中文标题】微服务和 PubSub:如何确保服务使用正确的事件【英文标题】:Micro services and PubSub: how to make sure a service consumes the right events 【发布时间】:2021-06-25 08:13:42 【问题描述】:

我有一个应用程序的微服务架构。 我有一个服务 S1 可以获取数据并将其存储在某处。然后是 2 个服务,S2 和 S3,它们都运行非常不同的 ML 任务。 当 S2 或 S3 需要数据时,它们会在名为 fetch_request 的主题上向 PubSub 发布消息。 获取数据的服务不断地从这个主题中拉取数据。当它完成一项任务时,它会在名为“fetch_done”的主题上发布一条消息,让发出请求的服务知道数据已被提取。

我的问题是:如何确保 S2 和 S3 不使用来自“fetch_done”的不应该使用的消息? 我想过解决方案,但我不确定:

可能是在尝试从“fetch_done”中提取时,我可以添加一个过滤器以仅在它们包含我会在初始请求消息中写入的 UUID 时提取消息?这样,只有知道 ID 的情况下才能拉消息。当然,获取数据的服务需要将 id 放入响应中。

有点相同的想法,但可能只是在初始请求中添加请求服务的名称而不是 id ?这个问题是,最终,如果我是正确的,一个服务可以模拟另一个服务,而且我可能不会是应用程序中每个服务的唯一开发者,我认为 UUID 是一个更好的主意。

我完全错过了什么明显的东西?

【问题讨论】:

每个服务 S2 和 S3 是否有 1 个订阅? 好吧,我不确定,我想我必须为每个服务使用 1 个子服务,这样他们才能接收消息并过滤它们吗? 【参考方案1】:

您可以实现多种模式。 IMO 最好为每项服务订阅 1 个。像这样,S1 在一个主题中发布一条消息,并且该消息在每个订阅中都重复。

现在,您可以:

在 S2/S3 发送并由 S1 接收的消息中放置一个属性。根据这个属性,S1 在主题中为 S2 发帖,或者在主题中为 S3 发帖。我不太喜欢这种解决方案,因为 S1 服务方面的责任太多 在 S2/S3 发送并由 S1 接收的消息中放置一个属性。这一次,S1 只是将消息中的属性镜像到了唯一一个主题中作为响应发送的响应。创建 S2 和 S3 订阅时,您添加一个过滤器以仅接收具有相应属性的消息。例如,像这样,只有 S2 的消息在 S2 订阅中被过滤和传递。 在 S2/S3 发送并由 S1 接收的消息中放置一个属性。此信息在 S1 服务发布时反映在正文或消息的属性中。 PubSub 订阅上没有过滤器,S2 和 S3 服务接收到所有消息并检查消息是否适合他们(并继续处理)(并丢弃消息 -> 正确确认但不执行任何操作)。

无论如何,由于通信是异步的,您需要一个元素来区分消息的正确接收者。使用 pubsub 过滤器的第二个解决方案是最有效的(我认为)。

【讨论】:

以上是关于微服务和 PubSub:如何确保服务使用正确的事件的主要内容,如果未能解决你的问题,请参考以下文章

小团队如何以“正确的方式”设计微服务架构?

如何通过本地化事件正确实现微服务内部强一致性,事件总线跨微服务间最终一致性

在 GCP 上使用 Pubsub 时如何解决身份验证范围不足的问题

Cloud Run PubSub 高延迟

JavaScript 中 PubSub / 过多事件和事件处理程序的性能成本?

如何使用 Spring Cloud Stream Kafka 和每个服务的数据库实现微服务事件驱动架构