Cloud Functions 位置

Cloud Functions 是地区级的,这意味着运行 Cloud Functions 函数的基础架构位于特定地区并由 Google 代管,从而可以在这些地区内的所有区域以冗余方式提供。

选择在哪些地区中运行您的函数时,应主要考虑延迟时间和可用性。通常,您可以选择离您的用户较近的地区,但除此之外,还应该考虑您的应用使用的其他产品和服务的位置。在多个地区使用服务可能会影响应用的延迟和价格

Cloud Functions 可在采用层级 1 价格的以下地区使用:

  • us-central1(爱荷华)
  • us-east1(南卡罗来纳)
  • us-east4(北弗吉尼亚)
  • europe-west1(比利时)
  • europe-west2(伦敦)
  • asia-east2(香港)
  • asia-northeast1(东京)
  • asia-northeast2(大阪)

Cloud Functions 可在采用层级 1 价格的以下地区使用:

  • us-west2(洛杉矶)
  • us-west3(盐湖城)
  • us-west4(拉斯维加斯)
  • europe-west3(法兰克福)
  • europe-west6(苏黎世)
  • northamerica-northeast1(蒙特利尔)
  • southamerica-east1(圣保罗)
  • australia-southeast1(悉尼)
  • asia-south1(孟买)
  • asia-southeast2(雅加达)
  • asia-northeast3(首尔)

在一个给定地区内,单个项目中的函数的名称必须独一无二(不区分大小写),但不同地区或不同项目的函数可以重名。

更改地区的最佳做法

默认情况下,函数在 us-central1 地区中运行。请注意,这可能不同于事件来源(例如存储分区)的地区。如果需要更改运行函数的地区,请按照本部分中针对每种函数触发器类型的建议进行操作。

如需设置运行函数的地区,请在函数定义中设置 region 参数,如下所示:

exports.myStorageFunction = functions
    .region('europe-west1')
    .storage
    .object()
    .onFinalize((object) => {
      // ...
    });

您可以通过在 functions.region() 中传递多个以英文逗号分隔的地区字符串来指定多个地区。要详细了解推荐的操作程序,请参阅更改函数的地区

HTTP 和客户端可调用函数

对于 HTTP 和可调用函数,我们建议您首先将函数设到目标地区(或离大多数预期客户所在位置最近的位置),然后更改原始函数以将其 HTTP 请求重定向到新函数(函数名称可以相同)。如果 HTTP 函数的客户端支持重定向,那么您只需更改原始函数,使其返回 HTTP 重定向状态 (301) 以及新函数的网址即可。如果您的客户端无法很好地处理重定向,您可以从原始函数发起指向新函数的新请求,以便将请求从原始函数(代理)转发到新函数。最后一步是确保所有客户端都会调用新函数。

在客户端为可调用函数选择位置

对于可调用函数,客户端的相应设置应遵循与 HTTP 函数相同的准则。客户端也可以指定地区,如果该函数在 us-central1 以外的地区中运行,则必须这样做。

如需在客户端上设置地区,请在初始化时指定所需的地区:

Swift

lazy var functions = Functions.functions(region:"us-central1")

Objective-C

@property(strong, nonatomic) FIRFunctions *functions;
// ...
self.functions = [FIRFunctions functionsWithRegion:@"us-central1"];

Web


var functions = firebase.app().functions('us-central1');

Android

private FirebaseFunctions mFunctions;
// ...
mFunctions = FirebaseFunctions.getInstance("us-central1");

C++

firebase::functions::Functions* functions;
// ...
functions = firebase::functions::Functions::GetInstance("us-central1");

Unity

firebase.Functions.FirebaseFunctions functions;

functions = Firebase.Functions.FirebaseFunctions.GetInstance("us-central1");

后台函数

后台函数采用“至少传送一次事件”语义,这意味着在某些情况下它们可能会收到重复事件。因此,在实现此类函数时应遵循幂等原则。如果您的函数已遵循幂等原则,那么您可以采用相同的事件触发器在新地区中重新部署该函数,并在验证新函数能正确接收流量后移除旧函数。在此过渡期间,两个函数都将收到事件。请参阅更改函数的地区,了解更改函数地区的推荐命令。

如果您的函数目前不遵循幂等原则,或者它的幂等性只在其所在地区内有效,我们建议您在移动该函数之前先实现幂等性。

推荐的最佳地区因事件触发器类型而异:

触发器类型 推荐地区
Cloud Firestore 离 Cloud Firestore 实例位置最近的地区(参阅下一部分)
实时数据库 始终 us-central1
存储 离 Cloud Storage 存储分区位置最近的地区(参阅下一部分)
其他 如果您在函数内与 Realtime Database 实例、Cloud Firestore 实例或 Cloud Storage 存储分区交互,则推荐的地区等同于您在由其中某项资源触发函数时会选择的地区。否则,请使用默认地区 us-central1。 另请注意,关联到 Firebase Hosting 的函数必须位于 us-central1 中。

根据 Cloud Firestore 和 Storage 位置选择地区

函数的可用地区与 Cloud Firestore 数据库和 Cloud Storage 存储分区的可用地区并不完全相同。

请注意,如果您的函数与您的资源(数据库实例或 Storage 存储分区)位于不同的位置,那么延迟时间和结算费用可能会增加。

对于不支持同一地区的情况,可参考以下 Cloud Firestore 和 Cloud Storage 支持的最近函数之间的对应关系

Cloud Firestore 和 Cloud Storage 的地区/多地区 最近的函数地区
nam5us-central(多地区) us-central1
eur3europe-west(多地区) europe-west1
asia-south1(孟买) asia-east2