在这篇文章中,我们将为您详细介绍在GoogleAppEngine上处理并发请求的内容,并且讨论关于chrome并发请求的相关问题。此外,我们还会涉及一些关于GoogleCloud函数调用托管在Goog
在这篇文章中,我们将为您详细介绍在Google App Engine上处理并发请求的内容,并且讨论关于chrome 并发请求的相关问题。此外,我们还会涉及一些关于Google Cloud函数调用托管在Google App Engine上的URL、Go如何处理Google App Engine上的并发请求、linux – ‘BUG:无法在Google Compute Engine上处理’内核NULL指针取消引用’、node.js – Google Cloud函数调用Google App Engine上托管的URL的知识,以帮助您更全面地了解这个主题。
本文目录一览:- 在Google App Engine上处理并发请求(chrome 并发请求)
- Google Cloud函数调用托管在Google App Engine上的URL
- Go如何处理Google App Engine上的并发请求
- linux – ‘BUG:无法在Google Compute Engine上处理’内核NULL指针取消引用’
- node.js – Google Cloud函数调用Google App Engine上托管的URL
在Google App Engine上处理并发请求(chrome 并发请求)
我正在几个平台上尝试并发请求处理。
实验的目的是对某些选定技术的能力范围进行 广泛的 测量。
我成立了一个Linux VM我的机器上有一个基本的围棋http服务器(香草http.HandleFunc
中的http
默认包)。然后,服务器将计算
fasta
算法的修改版本,该版本将线程和进程限制为1,并返回结果。N设置为100000。该算法运行大约2秒钟。我在Google App Engine项目上使用了
相同的 算法和逻辑。
该算法使用相同的代码编写,只是完成了处理程序设置,init()
而不是main()
按照GAE要求进行。
在另一端,Android客户端产生了500个线程,每个线程并行GET
向 fasta 计算服务器发出请求,请求超时为5000毫秒。
我期望GAE应用程序能够扩展并响应每个请求,而本地Go服务器在500个请求中失败,但是结果却相反:本地服务器正确地在超时范围内答复了每个请求,而GAE应用程序却是只能处理600个请求中的160个。其余请求超时。
我检查了Cloud Console,并确认产生了18个GAE实例,但绝大多数请求仍然失败。
我以为他们中的大多数人都因为每个GAE实例的启动时间而失败了,所以我之后立即重复了实验,但结果却是相同的:大多数请求都超时了。
我期望GAE能够扩展以适应所有请求,并相信如果单个本地VM可以成功回复500个并发请求,GAE也会这样做,但是事实并非如此。
GAE控制台未显示任何错误,并正确报告了传入请求的数量。
这可能是什么原因? 此外,如果单个实例仅可以通过goroutine来处理我计算机上的所有传入请求,那么GAE为何需要这么大扩展?
答案1
小编典典感谢大家的帮助。我对此主题的回答已经提出了许多有趣的观点和见解。
Cloud Console没有报告错误的事实使我相信瓶颈是在实际请求处理之后发生的。
我发现了结果不如预期的原因:带宽。
每个响应的有效负载大约为1MB,因此响应来自同一客户端的500个同时连接会阻塞线路,从而导致超时。向带宽大得多的VM请求时,显然没有发生这种情况。
现在,GAE缩放比例符合我的预期:它可以成功缩放以适应每个传入的请求。
Google Cloud函数调用托管在Google App Engine上的URL
我有一个firebase数据库,我希望创建一个云函数,该函数将在将子节点添加到父节点时触发,该函数应使用在父节点中添加的子节点的参数来调用url。
该网址将称为Google App Engine中托管的NodeJS Express应用程序。
如果可能的话,我该怎么办?
Go如何处理Google App Engine上的并发请求
我对Go如何处理Google App Engine上的并发请求感到困惑。所以我希望有人可以提供一些清晰度。
这是我收集的事实:
1.Goroutine被多路复用到多个OS线程上,因此,如果一个应阻塞,例如在等待I / O时,其他将继续运行。
- [[App Engine]的并发限制为10个[通过每个运行时的并发线程限制来实施]。
如果Go在App Engine上是单线程的,则第3点没有意义。剩下的1和2。如果Go on App Engine是单线程的,并且要求线程在阻止I /
O时继续执行,那么看来App Engine Go实例将在等待I / O时阻止所有goroutine。
这样对吗?如果不是,那么Go的并发在App Engine上如何真正起作用?
帮助量化事物。如果我要保持连接打开30秒钟。单个AE Go实例如何维护并发连接?
谢谢。
编辑:这是功能请求,它将允许Go
Instance处理超过10个并发请求允许每个实例的并发请求的可配置限制。请加注星标。
答案1
小编典典我一直在寻找答案,并且偶然发现了这个问题,但最终还是找到了关于此事的更多官方文档。根据Andrew Gerrand和Johan
Euphrosine的帖子,可以对此进行显式配置。
从该帖子:
这会将应用程序的每个实例配置为最多可同时处理100个请求(默认值为10)。您可以将Go实例配置为最多服务500个并发请求。
linux – ‘BUG:无法在Google Compute Engine上处理’内核NULL指针取消引用’
g[1375589.784755] BUG: unable to handle kernel NULL pointer dereference at 0000000000000078 g[1375589.786206] IP: [<ffffffff810a67d9>] check_preempt_wakeup+0xd9/0x1d0 g[1375589.787341] PGD 5da04067 PUD db83067 PMD 0 g[1375589.788607] Oops: 0000 [#1] SMP g[1375589.788705] Modules linked in: veth xt_addrtype xt_conntrack iptable_filter ipt_MASQUERADE iptable_nat nf_conntrack_ipv4 nf_defrag_ipv4 nf_nat_ipv4 ip_tables x_tables nf_nat nf_conntrack bridge stp llc aufs(C) softdog crct10dif_pclmul crc32_pclmul crc32c_intel ghash_clmulni_intel aesni_intel aes_x86_64 processor psmouse parport_pc parport i2c_piix4 i2c_core thermal_sys lrw virtio_net evdev pcspkr serio_raw gf128mul glue_helper ablk_helper cryptd button ext4 crc16 mbcache jbd2 sd_mod crc_t10dif crct10dif_common virtio_scsi scsi_mod virtio_pci virtio virtio_ring g[1375589.788705] cpu: 1 PID: 1515 Comm: docker Tainted: G C 3.16.0-0.bpo.4-amd64 #1 Debian 3.16.7-ckt9-3~deb8u1~bpo70+1 g[1375589.788705] Hardware name: Google Google,BIOS Google 01/01/2011 g[1375589.788705] task: ffff88006fffc110 ti: ffff880003ac4000 task.ti: ffff880003ac4000 g[1375589.788705] RIP: 0010:[<ffffffff810a67d9>] [<ffffffff810a67d9>] check_preempt_wakeup+0xd9/0x1d0 g[1375589.788705] RSP: 0018:ffff880003ac7e30 EFLAGS: 00010002 g[1375589.788705] RAX: 0000000000000001 RBX: ffff880073112ec0 RCX: 0000000000000002 g[1375589.788705] RDX: 0000000000000001 RSI: ffff880009156d20 RDI: ffff880073112f38 g[1375589.788705] RBP: 0000000000000000 R08: 0000000000000000 R09: 0000000000000000 g[1375589.788705] R10: ffffffffffffffe0 R11: 0000000000000000 R12: ffff88006d2dcd00 g[1375589.788705] R13: ffff88006fffc110 R14: 0000000000000000 R15: 0000000000000000 g[1375589.788705] FS: 000000000323a880(0063) GS:ffff880073100000(0000) knlGS:0000000000000000 g[1375589.788705] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 g[1375589.788705] CR2: 0000000000000078 CR3: 0000000034bff000 CR4: 00000000000406e0 g[1375589.788705] Stack: g[1375589.788705] 0000000000000000 ffffffff00000000 ffff88000000006e ffff880073112ec0 g[1375589.788705] ffff8800091573a4 0000000000000286 0000000000012ec0 ffff880073112ec0 g[1375589.788705] 0000000000000002 ffffffff8109cef4 ffff880009156d20 ffffffff810a01a4 g[1375589.788705] Call Trace: g[1375589.788705] [<ffffffff8109cef4>] ? check_preempt_curr+0x84/0xa0 g[1375589.788705] [<ffffffff810a01a4>] ? wake_up_new_task+0xf4/0x1b0 g[1375589.788705] [<ffffffff8118516d>] ? mprotect_fixup+0x15d/0x250 g[1375589.788705] [<ffffffff8106d10f>] ? do_fork+0xcf/0x340 g[1375589.788705] [<ffffffff8154b779>] ? stub_clone+0x69/0x90 g[1375589.788705] [<ffffffff8154b40d>] ? system_call_fast_compare_end+0x10/0x15 g[1375589.788705] Code: 00 00 83 e8 01 4d 8b 64 24 70 39 d0 7f f4 48 8b 7d 78 49 3b 7c 24 78 74 1d 66 0f 1f 84 00 00 00 00 00 48 8b 6d 70 4d 8b 64 24 70 <48> 8b 7d 78 49 3b 7c 24 78 75 ec 48 85 ff 74 e7 e8 f2 f9 ff ff g[1375589.788705] RIP [<ffffffff810a67d9>] check_preempt_wakeup+0xd9/0x1d0 g[1375589.788705] RSP <ffff880003ac7e30> g[1375589.788705] CR2: 0000000000000078 g[1375589.788705] ---[ end trace 5fab7713cb2d171f ]---
我能够恢复它们的唯一方法是登录Web界面并手动重置它们.不用说,它不会扩展.
我已经尝试过设置看门狗设备并设置kernel.panic = 10,理论上应该重新启动VM.
对于这些虚拟机,我使用’container-vm’作为操作系统风格(即Debian预装了Docker或多或少).
有没有人见过这个?
解决方法
我有同样的问题.我检查了互联网上的错误报告,发现几乎每个内核输出都包含do_fork()函数.
之后我发现:
http://www.serverphorums.com/read.php?12,1053418
并在这里更新版本:
https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/commit/kernel/sched/core.c?id=ea86cb4b7621e1298a37197005bf0abcc86348d4
我希望它对某人有帮助.
我想在我的发行版中修复此问题,但我不知道如何推动发行版的人将这个补丁放到默认的内核中.
node.js – Google Cloud函数调用Google App Engine上托管的URL
将被调用的URL是在Google App Engine中托管的NodeJS Express应用程序.
如果可能的话,我该怎么做?
解决方法
因为,在您的Cloud Function中,您必须在执行异步任务时返回Promise,您需要使用接口包装器来处理请求,例如request-promise.
你可以沿着这些方向做点什么:
..... var rp = require('request-promise'); ..... exports.yourCloudFucntion = functions.database.ref('/parent/{childId}') .onCreate((snapshot,context) => { // Grab the current value of what was written to the Realtime Database. const createdData = snapshot.val(); var options = { url: 'https://.......',method: 'POST',body: .... json: true // Automatically stringifies the body to JSON }; return rp(options); });
如果要将参数传递给正在调用的HTTP(S)服务/端点,可以通过请求正文执行,例如:
..... const createdData = snapshot.val(); var options = { url: 'https://.......',body: { some: createdData.someFieldName },json: true // Automatically stringifies the body to JSON }; .....
或者通过一些查询字符串键值对,如:
..... const createdData = snapshot.val(); const queryStringObject = { some: createdData.someFieldName,another: createdData.anotherFieldName }; var options = { url: 'https://.......',qs: queryStringObject }; .....
关于在Google App Engine上处理并发请求和chrome 并发请求的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Google Cloud函数调用托管在Google App Engine上的URL、Go如何处理Google App Engine上的并发请求、linux – ‘BUG:无法在Google Compute Engine上处理’内核NULL指针取消引用’、node.js – Google Cloud函数调用Google App Engine上托管的URL等相关知识的信息别忘了在本站进行查找喔。
本文标签: