Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

Cloud Functions 位置

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

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

Cloud Functions 函数在采用层级 1 价格的以下区域提供:

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

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

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

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

更改地区的最佳做法

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

如需设置运行函数的区域,请在函数定义中设置 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:"europe-west1")

Objective-C

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

Web


var functions = firebase.app().functions('europe-west1');

Android

private FirebaseFunctions mFunctions;
// ...
mFunctions = FirebaseFunctions.getInstance("europe-west1");

C++

firebase::functions::Functions* functions;
// ...
functions = firebase::functions::Functions::GetInstance("europe-west1");

Unity

firebase.Functions.FirebaseFunctions functions;

functions = Firebase.Functions.FirebaseFunctions.GetInstance("europe-west1");

后台函数

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

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

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

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

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

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

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

对于不支持同一区域的情况,Cloud Firestore 和 Cloud Storage 支持函数的最近区域分别如下

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