我遵循了 App Engine 灵活环境上的 Nodejs 教程: https://cloud.google.com/appengine/docs/flexible/nodejs/create-app
在成功部署并测试了本教程后,我更改了代码以进行一些实验并成功部署它......然后让它运行,因为这是一个测试环境(不公开)。
一个月后,我收到了来自 Google 的超过 370 美元的帐单!
在交易详情中,我看到以下内容:
Oct 1 – 31, 2017 App Engine Flex Instance RAM: 5948.774 Gibibyte-hours ([MYPROJECT]) $42.24
Oct 1 – 31, 2017 App Engine Flex Instance Core Hours: 5948.774 Hours ([MYPROJECT]) $312.91
这个几乎有 0 个请求的测试环境如何需要大约 6,000 小时的资源?在最坏的情况下,我会假设 720 小时全职运行一个月 @ 每小时 0.05 美元将花费我约 40 美元。 https://cloud.google.com/appengine/pricing
有人可以帮忙解释一下吗?我一直无法弄清楚为什么需要这么多资源?
感谢您的帮助!
更新: 请注意,我确实对 package.json 进行了一项修改:我将 nodemon 添加为依赖项,并将其添加为我的“nmp start”脚本的一部分。虽然我怀疑这解释了 6000 小时的资源:
"scripts": {
"deploy": "gcloud app deploy",
"start": "nodemon app.js",
"dev": "nodemon app js",
"lint": "samples lint",
"pretest": "npm run lint",
"system-test": "samples test app",
"test": "npm run system-test",
"e2e-test": "samples test deploy"
},
App.yaml(默认-教程没有变化)
runtime: nodejs
env: flex
最佳答案
在与 Google 多次来回交流、阅读博客和查看报告数小时后,我终于找到了对所发生事情的解释。我会在此处发布我的建议,以免其他人也成为此问题的受害者。
注意,这对某些人来说似乎很明显,但作为一个 GAE 新用户,所有这些对我来说都是全新的。
简而言之,当部署到 GAE 并使用以下命令“$ gcloud app deploy”时,它会创建一个新版本并将其设置为默认版本,但更重要的是,它不会删除之前部署的版本。
关于版本和实例的更多信息可以在这里找到:https://cloud.google.com/appengine/docs/standard/python/an-overview-of-app-engine
因此,就我而言,在不知情的情况下,我创建了我的简单 Node 应用程序的多个版本。这些版本仍在运行,以防出现错误后需要切换。但是这些版本也需要实例,除非在 app.yaml 中说明,否则默认为 2 个实例。
谷歌说:
App Engine by default scales the number of instances running up and down to match the load, thus providing consistent performance for your app at all times while minimizing idle instances and thus reducing cost.
但是,根据我的经验,情况并非如此。正如我之前所说,我使用 nodemon 推送了我的 Node 应用程序,这似乎导致了错误。
最后,按照教程并没有关闭项目,我有 4 个版本,每个版本有 2 个实例,全时运行 1.5 个月,服务 0 个请求并生成大量错误消息,我花了 500 美元。
如果您仍想使用 GAE FLEX ENV 的建议:
首先,设置一个计费预算和提醒,这样您就不会对自动记入您的 CC 的昂贵发票感到惊讶:https://cloud.google.com/billing/docs/how-to/budgets
在测试环境中,您很可能不需要多个版本,因此在部署时使用以下命令:
$ gcloud app deploy --version v1
更新您的 app.yaml 以强制使用最少的资源仅使用 1 个实例:
runtime: nodejs env: flex # This sample incurs costs to run on the App Engine flexible environment. # The settings below are to reduce costs during testing and are not appropriate # for production use. For more information, see: # https://cloud.google.com/appengine/docs/flexible/nodejs/configuring-your-app-with-app-yaml manual_scaling: instances: 1 resources: cpu: 1 memory_gb: 0.5 disk_size_gb: 10
我希望教程中包含其中一些步骤,以保护那些尝试学习和实验的人,但事实并非如此。
如果不了解所有这些细节,Google App Engine Flex 环境可能会很棘手。一位 friend 向我介绍了 Heroku,它既有固定价格,也有免费/爱好优惠。我能够在那里快速推送一个新的 Node 应用程序,它就像魅力一样! https://www.heroku.com/pricing
学习这一课“只”花了我 500 美元,但我希望这对其他关注 Google App Engine Flex Env 的人有所帮助。
关于node.js - Google App Engine Flexible env 的定价,500 美元的类(class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47125661/
假设我有一个FireNinja我的数据库中的对象,使用单表继承存储。后来才知道他真的是WaterNinja.将他更改为不同的子类的最干净的方法是什么?更好的是,我很想创建一个新的WaterNinja对象并替换旧的FireNinja在数据库中,保留ID。编辑我知道如何创建新的WaterNinja来self现有FireNinja的对象,我也知道我可以删除旧的并保存新的。我想做的是改变现有项目的类别。我是通过创建一个新对象并执行一些ActiveRecord魔法来替换行,还是通过对对象本身做一些疯狂的事情,或者甚至通过删除它并使用相同的ID重新插入来做到这一点,这是问题的一部分。
以太坊价格分析表明横盘整理,偏向中性。价格从前一交易日的高点1,791美元回落后正在盘整。但是,有趣的是,多头在1,680美元附近持有重要支撑。多头在1,700美元的心理水平附近聚集动能,并准备在接下来的几个交易日推向1,800美元。以太坊价格显示出盘整迹象,因为它形成了多个连续的顶部形态。这种回撤可能是第二大加密货币下一轮上涨的基石。以太坊连续第二个交易日走低。过去10天,价格在1,590-1,760美元的短期区间内盘整。每日烛台高于1,800美元将维持ETH的进一步上涨。ETH价格走低日线图上,以太坊价格在上升趋势线附近获得一轮支撑。来自879.80美元低点的看涨趋势线为ETH买家提供了支
假设您编写了一个类Sup,我决定将其扩展为SubSup。我不仅需要了解你发布的接口(interface),还需要了解你的私有(private)字段。见证这次失败:classSupdefinitialize@privateField="fromsup"enddefgetXreturn@privateFieldendendclassSub问题是,解决这个问题的正确方法是什么?看起来子类应该能够使用它想要的任何字段而不会弄乱父类(superclass)。编辑:equivalentexampleinJava返回"fromSup",这也是它应该产生的答案。 最佳答案
我了解instance_eval和class_eval之间的基本区别。我在玩弄时发现的是一些涉及attr_accessor的奇怪东西。这是一个例子:A=Class.newA.class_eval{attr_accessor:x}a=A.newa.x="x"a.x=>"x"#...expectedA.instance_eval{attr_accessor:y}A.y="y"=>NoMethodError:undefinedmethod`y='forA:Classa.y="y"=>"y"#WHATTT?这是怎么回事:instance_eval没有访问我们的A类(对象)然后它实际上将它添加到
由于匿名block和散列block看起来大致相同。我正在玩它。我做了一些严肃的观察,如下所示:{}.class#=>Hash好的,这很酷。空block被视为Hash。print{}.class#=>NilClassputs{}.class#=>NilClass为什么上面的代码和NilClass一样,下面的代码又显示了Hash?puts({}.class)#Hash#=>nilprint({}.class)#Hash=>nil谁能帮我理解上面发生了什么?我完全不同意@Lindydancer的观点你如何解释下面几行:print{}.class#NilClassprint[].class#A
在这段Ruby代码中:ModuleMClassC当我尝试运行时出现“'M:Module'的未定义方法'helper'”错误c=M::C.new("world")c.work但直接从另一个类调用M::helper("world")工作正常。类不能调用在定义它们的同一模块中定义的模块函数吗?除了将类移出模块外,还有其他解决方法吗? 最佳答案 为了调用M::helper,你需要将它定义为defself.helper;结束为了进行比较,请查看以下修改后的代码段中的helper和helper2moduleMclassC
我已经使用Stripe一年多了,基于RyanBates的RailsCast插曲发现here.但是,我的错误处理最近停止工作,而且我以前从未见过此错误。我最近开始在Ruby2.1上运行我的应用程序,据我所知,这就是问题所在。这是我的订阅模型中的一个实例方法:beginsave_with_stripe_paymentrescueStripe::InvalidRequestError=>elogger.error"Stripeerrorwhilecreatingcustomer:#{e.message}"logger.errore.backtrace.join("\n")errors.add
是否有可能以某种方式访问Class.new范围内的a?a=5Class.new{defb;aend}.new.b#NameError:undefinedlocalvariableormethod`a'for#:0x007fa8b15e9af0>#:in`b' 最佳答案 即使@MarekLipka的回答是正确的——改变变量范围总是有风险的。这是可行的,因为每个block都带有创建它的上下文,因此您的局部变量a突然变得不那么局部了——它变成了一个“隐藏的”全局变量:a=5object=Class.new{define_method(
参见下面的示例,我想最好使用第二种方法,但第一种也可以。哪种方法最好,使用另一种的后果是什么?classTestdefstartp"started"endtest=Test.newtest.startendclassTest2defstartp"started"endendtest2=Test2.newtest2.start 最佳答案 我肯定会说第二种变体更有意义。第一个不会导致错误,但对象实例化完全过时且毫无意义。外部变量在类的范围内不可见:var="string"classAvar=A.newendputsvar#=>strin
我看到我可以使用获取目录中的文件列表Dir["*"]我应该如何准确阅读该语法?据我所知,您可以使用[]从数组或散列中获取值。[]如何处理通话? 最佳答案 []只是一个方法,如#to_s、#object_id。等你可以在任何对象上定义它:classCoolClassdef[](v)puts"hello#{v}"endendCoolClass.new["John"]#=>"helloJohn"在你的情况下,它被定义为单例方法,以这种方式:classDirdefself.[](v)...endend