我有一个Firebase云功能,由onCreate
我的实时数据库中的路径触发.昨天,在做了一些基本测试后,我开始在云功能日志中出现"超出配额"错误.令人不安的是,错误不断发生,首先每2秒左右,然后每8秒左右加速,持续约1.5小时.
这是麻烦的一小部分:
我看了一下有关重试异步函数的文档,很明显,在大多数情况下,函数将停止执行,如果发生错误,事件将被丢弃.在我的情况下,触发事件似乎没有被清除,可能是因为我得到的错误来自我的功能之外.这是完整的错误文本:
错误:超出配额(DNS解析:每100秒); 要增加配额,请通过https://console.cloud.google.com/billing?project=myproject在项目中启用结算功能.功能无法执行.
是的,我意识到配额问题很容易通过转移到Blaze计划来解决,我将很快做到这一点,但在此之前,我想了解如何处理这种情况,如果将来发生的话.我不得不重新部署我的函数以使错误停止发生.在研究了文档后,听起来好像我也可以删除停止错误的功能,但是一旦我的应用程序到达生产状态,重新部署或删除功能似乎都不是一条很好的途径.
我的想法是,我必须陷入Firebase Cloud功能服务内部的重试循环中.我的日志记录都没有被击中(其中一些会在函数启动时发生,有些会在函数运行期间发生),加上消息显示"函数无法执行",这对我来说意味着错误发生在我的代码被执行之前.由同一事件触发的另一个函数是记录相同的错误.
所以,对于知情人士,我的问题如下:
最后,还有一些注意事项可以解决一些可能有的后续问题:
是的,重复错误确实阻止了对相关函数的任何新调用.除了由同一事件触发的另一个函数外,其他函数仍然可以执行.
是的,我可以在一定程度上重新创建行为.如果我将每100秒的DNS解决方案配额设置为较低的值(例如5),并执行一些执行,我会得到相同的错误,每8秒左右重复一次.奇怪的是,当我以这种方式再现时,它在大约10-20次投掷后自行恢复,似乎在100秒已经过去的时间,这是有道理的.在原始事件的情况下,错误重复了一个多小时,此时我决定重新部署,停止它们.
是的,Function execution took ### ms, finished with status 'ok'
在错误开始滚动之前,我确实在日志中看到了最新的消息.错误完成后,我确实看到函数成功处理了最后一次触发数据.这就是让我想知道是否是导致云功能继续尝试的触发事件的原因.
不,我的功能不会写入会重新触发的位置.
是的,我意识到我可以通过转向Blaze计划以获得更高的配额来轻松解决这个问题.我会这样做的.首先,我想了解出错的机制,以便我可以进行任何改进.
我有一个Google API的API密钥,我想在我的所有请求中使用它.其中一些请求将来自Google App Engine(Python 2.7)应用程序.我原计划使用UrlFetch库来完成POST请求,基本如下:
headers = {'Content-Type': 'application/json'}
payload = {'longUrl': request.long_url}
result = urlfetch.fetch([API_REQUEST_URL],
method=urlfetch.POST,
payload=json.dumps(payload),
headers=headers)
json_result = json.loads(result.content)
Run Code Online (Sandbox Code Playgroud)
我已经为我的API密钥设置了一个引荐来源限制,*.[my-app].appspot.com/*
希望这可以保护我的API密钥免受未经授权的使用,并且无需更新基于IP的密钥限制(因为App Engine IP一直在变化).
这种方法虽然让我失望,因为看起来urlfetch本身并没有为referrer指定值.我假设我可以添加自己的推荐人,但其他人也可以.这种方法不是很安全.
什么是最佳做法?鉴于我在App Engine中使用urlfetch,我应该如何限制密钥?如果我使用HTTP Referrer限制,我使用哪个地址?
非常感谢.
python google-app-engine google-cloud-storage google-cloud-endpoints
对于知情人士来说,这可能是一个简单的问题......
我正在阅读 Firebase Cloud Functions 和 GCP Cloud Functions 的文档,我注意到处理错误的推荐方法有所不同。这让我感到惊讶,因为我的理解是 Firebase Cloud Functions 与 GCP Cloud Functions 密切相关。
在有关错误报告的Firebase 文档中,它表示可能会抛出错误以将其放入 StackDriver,如下所示:
throw new Error('Fail!');
同时,关于错误报告的GCP Cloud Function 文档指出,未捕获的异常会强制在未来的调用中冷启动。相反,建议如下:
console.error(new Error('Fail!'));
直接抛出错误是否也会导致 Firebase Cloud Functions 冷启动?在 Firebase 上,将错误发送到控制台是否可以避免此问题?
谢谢。
根据Google的文档,我似乎有两个使用Python连接到Datastore的主要选项:App Engine的NDB数据存储库和用于Python的Google Cloud Datastore API.
我目前正在使用App Engine(标准版),但我想构建我的应用程序,以便它可以在需要时增长,可能是通过迁移到Compute Engine.考虑到这一点,我应该使用哪个库?App引擎的文档说明可以使用NDB,但它似乎不再是非常活跃的开发.在撰写本文时,最后一次提交是在6个月之前,尽管看起来他们之前可能已经计划进行一些扩展.一切都会转而使用Google Cloud Datastore API吗?如果NDB正在逐步淘汰,我真的不想开发依赖它.
我还没有尝试过,但似乎在App Engine中使用完整的Google Cloud Datastore API 可能会出现问题.
如果有人有在App Engine - Standard上使用Google Cloud Datastore API的经验,我会很高兴听到您的想法.
编辑 - 2016-11-30 - 独特性
这个问题被标记为与此类似.虽然有一些相似之处,但我特别提到想要选择一种能够在App Engine之外轻松实现增长的解决方案.此时我假设NDB库仅适用于App Engine,因此如果我超越App Engine,它将无法工作.但是,我认识到在App Engine上使用NDB可能仍然有优势,然后如果我超越,则交换到Cloud Datastore API.我有一些相关的,更具体的问题包括:
谢谢.
如果我的文档保存在/recordTypeX/{autoKey}
,结构如下:
memberUserIds [object]
hjfjkh32390u09j: true
kjsklfjkslfklj3: true
....
skfksdjk2249fks: true
someStringField: "Bork, bork, bork!"
someNumericField: 88
Run Code Online (Sandbox Code Playgroud)
如何编写安全规则以检查是否存在memberUserIds?我尝试了以下操作,但是CLI不喜欢该语法。
allow read if resource.data.memberUserIds.$(request.auth.uid) == true;
我知道变量可以在get()
和的路径中使用exists()
,因此我认为也可以使用变量寻址字段,但是我无法克服语法错误。这可能吗?
在某些背景下,我试图在集合中的每个文档上维护一个(小)userId列表,以便我可以进行查询,以使我可以检索当前用户所属的集合中的所有文档。
我在阅读了Firebase文档中曾经使用过的指南(称为列表,集合和数组)后,采用了这种方法。
感谢您的任何想法。
我在从Firebase Hosting提供一些动态内容时遇到了一些麻烦。
我编写了一个http.onRequest()
云函数,它返回一个图像(内容类型:图像/jpeg)作为其响应。如果我直接在其 url 上访问该函数,该函数将按预期工作:
https://us-central1-my-project-id.cloudfunctions.net/hosting-getPartnerImg
根据文档,我正在使用该us-central1
地区。
我也希望能够使用 Firebase Hosting 调用此函数,我已对其进行了如下配置:
firebase.json(片段)
"rewrites" : [
{
"source" : "/pimg",
"function" : "hosting-getPartnerImage"
}
],
"headers": [
{
"source": "/pimg",
"headers": [ {
"key": "Cache-Control",
"value": "max-age=60"
},
{
"key": "Access-Control-Allow-Origin",
"value": "*"
}
]
}]
Run Code Online (Sandbox Code Playgroud)
index.js(片段)
"rewrites" : [
{
"source" : "/pimg",
"function" : "hosting-getPartnerImage"
}
],
"headers": [
{
"source": "/pimg",
"headers": [ {
"key": "Cache-Control",
"value": "max-age=60"
},
{
"key": "Access-Control-Allow-Origin", …
Run Code Online (Sandbox Code Playgroud)