【问题标题】:Communicate internally between Google Cloud Functions?在 Google Cloud Functions 之间进行内部通信?
【发布时间】:2019-02-06 14:36:25
【问题描述】:

我们创建了一个 Google Cloud Function,它本质上是一个内部 API。有没有什么方法可以让其他内部 Google Cloud Functions 与 API 函数对话,而无需为该函数暴露 HTTP 端点?

我们已经查看了 PubSub,但据我们所知,您可以发送请求(按照说法!)但您无法收到响应。

理想情况下,由于额外的安全后果,我们不希望公开 HTTP 端点,并且我们正在尝试遵循微服务方法,因此每个函数都是它自己的实体。

【问题讨论】:

标签: google-cloud-platform google-cloud-functions


【解决方案1】:

我同情您的微服务方法并试图保持您的服务独立。您可以在不向 HTTP 开放所有函数的情况下完成此操作。 Chris Richardson 在他的优秀网站microservices.io 上描述了一个类似的案例:

您已经应用了每个服务的数据库模式。每个服务都有 自己的数据库。然而,一些业务交易跨越多个 服务,因此您需要一种机制来确保跨平台的数据一致性 服务。例如,假设您正在建立一个电子商务商店 客户有信用额度的地方。申请必须确保 新订单不会超过客户的信用额度。由于订单 客户在不同的数据库中,应用程序不能简单地 使用本地 ACID 事务。

他接着说:

使用这种方法的电子商务应用程序会创建一个 使用由以下组成的基于编排的传奇进行排序 步骤:

  1. Order Service 创建处于挂起状态的 Order 并发布 OrderCreated 事件。
  2. 客户服务收到事件尝试为该订单保留信用。它发布一个 Credit Reserved 事件或一个 CreditLimitExceeded 事件。
  3. Order Service 收到事件并将订单状态更改为已批准或已取消。

基本上,第一个微服务不是直接调用同步返回值的函数,而是向第二个微服务发送异步“请求事件”,第二个微服务发出第一个服务获取的“响应事件”。您将使用Cloud PubSub 来发送和接收消息。

您可以在他的网站上通过Saga pattern 阅读更多相关信息。

【讨论】:

    【解决方案2】:

    最直接的做法是将您的 API 封装到一个常规函数或对象中,并将该额外代码与需要使用它的每个函数一起部署。您甚至可能希望完全模块化代码,就像您对 npm 模块所期望的那样。

    【讨论】:

    • 谢谢,Doug,这是一个解决方案,但是,这种方法不符合我们的理想,即每个功能都是小型/微服务,特别是因为我们的 API 相对较大且相互交织,它使得它有点乱。
    • 我认为您别无选择。微服务实际上并不意味着少量的代码,它只是意味着少量的整体功能。
    • 是的,似乎没有其他选择,因此这个问题似乎很疯狂,函数不能以请求/响应的方式直接相互调用。当我在上面提到微服务时,我的意思是功能而不是大小 - 我的错是不清楚。感谢您的回复。
    • 没有什么能阻止您使用某些 HTTP 客户端库直接从另一个函数调用您的一个 HTTP 函数。您只需要为您的项目启用计费。我个人认为这不是一个好主意,因为与将代码直接包含在第一个函数中相比,它会花费更多并且性能更差。
    • 是的,这也是我们的想法,正如您所说,成本方面是一个痛点,因为一个功能等待另一个功能的响应,同时仍然向我们收费。谢谢!
    猜你喜欢
    • 2021-05-26
    • 2017-07-31
    • 2019-02-02
    • 2014-10-10
    • 2021-12-22
    • 2015-01-16
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多