【发布时间】:2020-04-25 19:38:59
【问题描述】:
我有多个微服务需要收到某些事件的通知。所有这些微服务都在 Cloud Run 上运行。鉴于 Cloud Run 可以缩减到 0 个实例,我假设 Push 模型更适合我们的情况。
问题在于需要将通知发送到多个端点。例如,我们有一个 OrderService、一个 InventoryService 和 PaymentService。后两者都需要监听“OrderPlaced”事件。问题是,我们如何将这条消息推送到两个服务,而不必显式调用它(例如使用任务队列)或在 OrderService 中创建依赖关系?有没有“谷歌云”的方式来解决这个问题?
我曾考虑过创建“拉动”侦听器,但问题是 Cloud Run 实例可以扩展到 0,对吧,这实际上不会接收事件?
【问题讨论】:
-
听起来好像在发布消息时,您希望您的每个服务都成为订阅者。这似乎意味着您要针对同一主题创建三个订阅。每个订阅都有与其对应的 Cloud Run 实现的推送绑定。当单个消息发布到主题时,三个订阅者中的每个订阅者都会进行自己的处理,并独立地将消息并行传递给每个实现。
-
啊,你完全正确,这正是我所缺少的。我太专注于创建侦听器,我没有意识到我可以通过 GCP 控制台为该主题创建多个子,哈哈。请将其写为答案,以便我接受。谢谢!另外,我是否只需要为每个环境重复此操作,还是有更好的方法来确定哪个消息来自哪个环境,以便推送可以正确路由,或者我应该为 dev vs prod 创建一个新项目?也许这最适合在 S.O. 上提出不同的问题
-
我不确定您所说的“对每个环境重复此操作”是什么意思……也许您可以详细说明一下不同/单独的环境是什么意思?
-
是的,所以我有两套 Cloud Run 容器。一方面,dockerfile 将环境设置为“开发”,另一方面将环境设置为“生产”。根据它所在的环境,在运行时从 GCP Secret Manager 加载不同的“秘密”。我坚持的部分是如何将开发“OrderPlaced”事件与生产“OrderPlaced”事件隔离开来。我是否需要创建单独的主题,例如“DevOrderPlaced”,还是您认为我应该完全创建完全独立的 GCP 项目?不确定使用 pub/sub 和云运行处理不同环境的正确方法
-
Dr @ara06 ...我在旅行中看到的是单独的 GCP 项目。开发、测试和生产项目在它们之间共享一个公共源代码存储库的情况并不少见。这使您可以保留一组配置、一组二进制文件,并在所有内容之间保持尽可能接近的映射,因此它们之间几乎没有/没有泄漏。这样,您可以为主题和 subcsriptions 使用一致的名称,但它们会因项目管理的上下文 (dev/test/prod) 而异。我还希望使用 Terraform 自动构建基础架构。
标签: google-cloud-pubsub google-cloud-run