Cloud Functions 是区域性的,这意味着运行您的 Cloud Functions 的基础设施位于特定区域并由 Google 管理,以便在这些区域内的所有区域中冗余可用。
在选择在哪些区域运行您的函数时,您的主要考虑因素应该是延迟和可用性。您通常可以选择靠近您的用户的区域,但您还应该考虑您的应用程序使用的其他产品和服务的位置。跨多个区域使用服务可能会影响应用程序的延迟以及定价。
支持地区
在本部分的列表中, energy_savings_leaf图标表示该地区的电力是低碳排放生产的。有关详细信息,请参阅Google Cloud 区域的无碳能源。
Cloud Functions 在以下区域以第 1 层定价提供:
-
asia-east1
(台湾) -
asia-east2
(香港) -
asia-northeast1
(东京) -
asia-northeast2
(大阪) -
europe-west1
(比利时) energy_savings_leaf -
europe-west2
(伦敦) -
us-central1
(爱荷华州) energy_savings_leaf -
us-east1
(南卡罗来纳州) -
us-east4
(弗吉尼亚北部) -
us-west1
(俄勒冈州) energy_savings_leaf
Cloud Functions 在以下区域以第 2 层定价提供:
-
asia-northeast3
(首尔) -
asia-southeast1
(新加坡) -
asia-southeast2
(雅加达) -
asia-south1
(孟买) -
australia-southeast1
(悉尼) -
europe-central2
(华沙) -
europe-west3
(法兰克福) -
europe-west6
(苏黎世) energy_savings_leaf -
northamerica-northeast1
(蒙特利尔) energy_savings_leaf -
southamerica-east1
(圣保罗) energy_savings_leaf -
us-west2
(洛杉矶) -
us-west3
(盐湖城) -
us-west4
(拉斯维加斯)
给定项目中给定区域中的函数必须具有唯一(不区分大小写)名称,但跨区域或跨项目的函数可以共享相同的名称。
更改区域的最佳做法
默认情况下,函数在us-central1
区域中运行。请注意,这可能不同于事件源的区域,例如 Cloud Storage 存储桶。如果您需要更改函数运行的区域,请按照本节中针对每种函数触发器类型的建议进行操作。
要设置函数运行的区域,请在函数定义中设置region
参数,如下所示:
exports.myStorageFunction = functions
.region('europe-west1')
.storage
.object()
.onFinalize((object) => {
// ...
});
您可以通过在functions.region()
中传递多个以逗号分隔的区域字符串来指定多个区域。有关推荐过程的更多信息,请参阅更改函数的区域。
HTTP 和客户端可调用函数
对于 HTTP 和可调用函数,我们建议您首先将您的函数设置为目标区域,或最接近大多数预期客户所在的区域,然后更改您的原始函数以将其 HTTP 请求重定向到新函数(它们可以具有相同的名称)。如果您的 HTTP 函数的客户端支持重定向,您只需更改原始函数以返回 HTTP 重定向状态 (301) 以及新函数的 URL。如果您的客户端不能很好地处理重定向,您可以通过发起从原始函数到新函数的新请求来代理从原始函数到新函数的请求。最后一步是确保所有客户端都在调用新函数。
可调用函数的客户端位置选择
关于可调用函数,客户端可调用设置应遵循与 HTTP 函数相同的准则。客户端还可以指定一个区域,如果该函数在us-central1
以外的任何区域运行,则必须这样做。
要在客户端上设置区域,请在初始化时指定所需的区域:
迅速
lazy var functions = Functions.functions(region:"europe-west1")
目标-C
@property(strong, nonatomic) FIRFunctions *functions;
// ...
self.functions = [FIRFunctions functionsWithRegion:@"europe-west1"];
网络
var functions = firebase.app().functions('europe-west1');
安卓
private FirebaseFunctions mFunctions;
// ...
mFunctions = FirebaseFunctions.getInstance("europe-west1");
C++
firebase::functions::Functions* functions;
// ...
functions = firebase::functions::Functions::GetInstance("europe-west1");
统一
firebase.Functions.FirebaseFunctions functions;
functions = Firebase.Functions.FirebaseFunctions.GetInstance("europe-west1");
后台功能
后台函数采用至少一次事件传递语义,这意味着在某些情况下它们可能会收到重复的事件。所以,你应该实现函数是幂等的。如果您的函数已经是幂等的,那么您可以使用相同的事件触发器在新区域中重新部署该函数,并在验证新函数正确接收流量后删除旧函数。在此转换期间,两个函数都将接收事件。有关更改函数区域的推荐命令序列,请参阅更改函数区域。
如果你的函数目前不是幂等的,或者它的幂等性没有超出区域,那么我们建议你先实现幂等再移动函数。
最佳区域建议因事件触发类型而异:
触发器类型 | 区域推荐 |
---|---|
云端 Firestore | 离 Cloud Firestore 实例位置最近的区域(请参阅下一节) |
实时数据库 | 总是us-central1 |
云储存 | 离 Cloud Storage 存储桶位置最近的区域(请参阅下一节) |
其他 | 如果您在函数内部与实时数据库实例、Cloud Firestore 实例或 Cloud Storage 存储桶进行交互,则推荐的区域与您有一个由这些资源之一触发的函数一样。否则,使用默认区域us-central1 。另请注意,连接到 Firebase 托管的函数必须位于us-central1 中。 |
根据 Cloud Firestore 和 Cloud Storage 位置选择区域
函数的可用区域并不总是与您的 Cloud Firestore 数据库和 Cloud Storage 存储桶的可用区域完全匹配。
请注意,如果您的函数和您的资源(数据库实例或 Cloud Storage 存储桶)位于不同的位置,那么您可能会遇到延迟和计费成本增加的情况。
以下是 Cloud Firestore 和 Cloud Storage 最接近的功能支持区域的映射,适用于不支持同一区域的情况:
Cloud Firestore 和 Cloud Storage 的区域/多区域 | 最近的函数区域 |
---|---|
nam5 或us-central (多区域) | us-central1 |
eur3 或europe-west (多区域) | europe-west1 |
asia-south1 (孟买) | asia-east2 |
australia-southeast2 (墨尔本) | australia-southeast1 |