gpt4 book ai didi

google-app-engine - Google App Engine 中 channel 池的最佳方法

转载 作者:太空宇宙 更新时间:2023-11-03 15:18:26 25 4
gpt4 key购买 nike

似乎使 GAE Channel API 在财务上可行的唯一方法是实现某种池机制(一位高级应用程序引擎产品经理甚至在我向他们发送过高价格的电子邮件时告诉我这一点)以重用 channel 还没有过期。

我一直在集思广益地想出实现 channel 池的方法(地点),但我想到的每种方法都有一些非常严重的缺点。

Servlet 的静态内存 -- 很好,但当新的 VM 实例打开和/或客户端从一个 VM 传递到另一个 VM 时,会丢弃相当多的开放 channel 。

Memcache -- 至少内存可以从所有 VM 全局访问,但现在由于不活动和内存压力,丢弃非常可行的 channel 的可能性可能更大。

后端实例 -- 可能是可靠性方面的最佳选择,但现在运行后端的费用将首先耗尽实现池的所有节省!

是否有更好的地方/方式来实现我所缺少的跨 VM 的 channel 池,或者我是否不必要地挂断了我的选择的缺点?我真的希望有,否则看起来我的应用程序将不得不恢复到轮询(根据我的初步指标,这看起来稍微便宜一些)。

最佳答案

这就是我要做的(实际上我在看到你的问题后正在考虑编写这个库。我也需要它):

使用以下 API 创建一个 taskpool 模块。

client_id, token = taskpool.get()

# Setup a heartbeat in the client JS, maybe every minute.
# Also call this every time the client indicates presence
taskpool.ping(client_id)

taskpool.release(client_id)

实现:

  • client_idtoken 存储在一个实体中,状态指示它是否正在使用、最后 ping 时间和创建时间。让 client_id 成为关键。也可以考虑使用 NDB .免费内存缓存。

get() 检查是否有未使用的标记,如果找到则返回一个。否则创建一个新的,存储并返回它。

ping() 更新该 token 的最后一次 ping 时间。不是轮询,而是让客户端每隔 [heartbeat] 时间发送一次 ping。

release() 将 token 标记为未使用。

每隔 [heartbeat] 秒运行一个任务/cron 以查找一段时间内未收到 ping 的 token - 并将它们设置为未使用。

当客户端报告一个关闭的 token 时,执行一个get()

不过请记住,安全性损失是任何一种 token 池的副产品。如果恶意客户端持有 token 并停止发送心跳,一旦 token 被重新利用,它可能稍后能够监听传递给新客户端的消息。如果您访问的是完全公开的站点,这不是问题,但无论如何请记住这一点。

如果我把它写成一个库,我会更新这个答案。

关于google-app-engine - Google App Engine 中 channel 池的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8147221/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com