HTTP GET请求是否正常出现响应状态代码204 - No Content
?就像,这对于HTTP GET应该完成的内容来说,这在语义上是否正确?我知道一个HTTP POST请求204 - No Content
是可以的.对于GET请求,如果没有数据要发回,204状态代码是否合适?我应该使用404,还是仅仅坚持200以获得成功但是空洞的回答?
此问题的用例是我为Google App Engine编写的Java应用程序.我正在向servlet发送请求,但要发送回客户端的数据将通过Channel API套接字而不是HTTP Response传输.目前,我的客户端在请求正文中发送没有内容的POST,并在轮询Channel API套接字之前等待来自servlet的204响应.因为我没有在请求正文中发送数据,所以我在辩论发送GET而不是POST是否更有意义.
我正在尝试使用Channel API中的Presence来处理断开/连接状态.
这是我的一些代码.
的app.yaml
handlers:
- url: /(.*\.(gif|png|jpg|ico|js|css))
static_files: \1
upload: (.*\.(gif|png|jpg|ico|js|css))
- url: .*
script: main.py
inbound_services:
- channel_presence
Run Code Online (Sandbox Code Playgroud)
main.py
class onConnect(webapp.RequestHandler):
def post(self):
for user in users:
users = User.all().fetch(1000)
client = client_id = self.request.get('from')
channel.send_message(user.channel,' connected');
class onDisconnect(webapp.RequestHandler):
def post(self):
Mainpage()
for user in users:
users = User.all().fetch(1000)
client = client_id = self.request.get('from')
channel.send_message(user.channel, ' disconnected');
application = webapp.WSGIApplication(
[('/', MainPage),
('/_ah/channel/connected/',onConnect),
('/_ah/channel/disconnected/',onDisconnect),
('/chat',handleChat)],
debug=True)
Run Code Online (Sandbox Code Playgroud)
使用Javascript
<script>
openChannel = function(){
var token = '{{ token }}';
var …
Run Code Online (Sandbox Code Playgroud) 如何在Python中使用Google App Engine实现Comet/Server推送?
我已经使用谷歌应用程序引擎约2年了,并喜欢它.我的任务是制作游戏,我想用GAE作为后端.根据我的理解,Channels API适用于此类应用程序.我得到了tic-tac-toe演示,并注意到每个客户都有自己的频道.在仔细阅读文档之后,我注意到这就是系统的使用方式.然后,我检查了文档中的配额和限制,并且......被毁坏了.GAE将让我每分钟创造60个新频道.这意味着我每分钟只能有60个新用户.这是限制我无法使用此API.
所以我的问题是:
我们需要开发一款具有实时性能的多人游戏.这需要在全球范围内运行(美国,欧洲,亚洲的服务器),并支持巨大的流量.使用Google Cloud服务进行托管.
我们正在考虑使用Jam with Chrome,Chrome Maze或Cube Slam等参考文献.
我们显然会在AppEngine上主持网站,自动扩展,但正在考虑为实时服务器提供2种解决方案:
使用带有计算引擎的websocket服务器
就像他们为Jam with Chrome,Maze等所做的那样.
开发我们自己的websocket服务器(技术TBD),部署在欧洲,美国,亚洲的数据中心,处理扩展,在它们之间同步,计算服务器上的延迟问题和客户端等,
但它是非常技术上的挑战,因为我们的时间很短,和失踪管理员SYS和网络家伙现在.
或使用Channel API
我们知道它不是websocket平台,实时性能较低.
但对我们和我们拥有的时间来说,这将更加简单和安全.
所以,我们也希望了解更多相关信息.
在任何情况下,我们认为我们可以在前端使用一些图形技巧,使其看起来像实时,但它确实取决于我们有100~500ms或500ms~10s的延迟.
感谢您的任何帮助评论!
编辑:
google-app-engine websocket channel-api google-compute-engine
似乎使GAE Channel API具有财务可行性的唯一方法是实现某种池化机制(其中一位高级应用程序引擎产品经理甚至告诉我这一点,当我通过电子邮件向他们发送关于价格过高的价格时)来重用尚未使用的渠道过期.
我一直在集思广益,以实现渠道池,但我认为每种方法都有一些非常严重的缺点.
Servlet的静态内存 - 很好,但是当新VM实例打开和/或客户端从一个VM传递到另一个VM时,会丢弃相当多的开放通道.
Memcache - 至少可以从所有VM全局访问内存,但现在由于不活动和内存压力,可能会丢弃一个非常可行的通道.
后端实例 - 可能性是可靠性方面的最佳选择,但现在运行后端的费用将耗尽首先实现池的所有节省!
是否有更好的地方/方式在虚拟机上实现我缺少的通道池,或者我是否不必要地在这里选择我的选项的缺点?我真的希望有,或者看起来我的应用程序将不得不恢复到轮询(在我的初步指标中看起来略微便宜).
我在我的python项目中使用App Engine模块.(https://developers.google.com/appengine/docs/python/modules/#Python_Background_threads)
我也在m项目中使用频道:https://developers.google.com/appengine/docs/python/channel/
我想将连接/断开的帖子消息('/ _ah/channel/connected /','/ _ah/channel/disconnected /')指向我的api模块.现在我无法让它们显示在任何模块中(默认或api)
的app.yaml
api_version: 1
application: integrate
version: 1-0-0
runtime: python27
threadsafe: true
builtins:
- deferred: on
libraries:
- name: pycrypto
version: "2.6"
handlers:
- url: /favicon\.ico
static_files: static/favicon.ico
upload: static/favicon\.ico
- url: /admin/.+
script: src.default.main.app
login: admin
- url: /.*
script: src.default.main.app
Run Code Online (Sandbox Code Playgroud)
api.yaml
api_version: 1
application: integrate
module: api
version: 1-0-0
runtime: python27
threadsafe: true
inbound_services:
- channel_presence
builtins:
- deferred: on
libraries:
- name: pycrypto
version: "2.6" …
Run Code Online (Sandbox Code Playgroud) 我正在使用Google App Engine(Python)构建一个多用户实时应用程序,它看起来像Facebook livestream插件:https://developers.facebook.com/docs/reference/plugins/live-stream/
这意味着:同一网页上的1到1 000 000个用户可以执行立即通知其他人的操作.这就像群聊,但有很多人......
我的问题:
- App Engine 能够扩展到那种数字吗?
- 如果是的话,你会如何设计它?
- 如果不是,你的建议是什么?
现在,这是我的设计:
- 我正在使用App Engine Channel API
- 我将每个连接在memcache中的用户存储起来
- 每次执行操作时,都会向任务队列添加一个通知任务
- 任务包括检索所有用户来自memcache并向他们发送通知.
我知道我的瓶颈在于任务.通过相同的任务/请求通知每个人.目前,对于连接的30个用户,它持续约1秒,因此对于10万用户,您可以想象可以花多长时间.
你怎么纠正这个?
非常感谢
我已在我的应用程序中实现了Google App Engine的Channel API功能.一切顺利.我为每个用户每隔一小时创建一个新频道.我设法在每个会话中维护一个通道(浏览器中不同选项卡的通道相同).我已经实现了onerror和onclose方法,每次调用它们时,都会向服务器发出一个请求有效令牌的调用.
有时,在频道活了一段时间后,它会断开连接.我可以在JavaScript控制台上看到对talkgadget.google.com的HTTP调用失败.URL是这样的:
https://129.talkgadget.google.com/talkgadget/dch/bind?VER=8&clid= .....
这些调用具有诸如"401(令牌超时)"或"401(令牌无效)"之类的响应.确实如此,客户端使用的令牌无效.它应该使用新令牌进行更新,但不会调用onerror或onclose方法.我怎么知道这会发生什么时候或如何处理呢?除了onerror或onclose方法之外,没有真正的方法可以说明客户端是否断开连接.如果我刷新页面,则会解决此问题(每次用户刷新时,我都会从数据库中获取有效令牌).
我检查了套接字对象的"readyState"属性,它的值为1.有许多人面临这个问题,截至目前,GAE的人们似乎没有提供有效的解决方案.
编辑:我是高级帐户持有人,此问题阻碍了我们的部署.
编辑2:每个标签有一个频道可以减少发生这种情况的频率.但它并没有完全解决问题.
最新的Android Wear更新支持ChannelApi,可用于向/从可穿戴设备或手持设备发送文件.问题是我找不到如何使用此功能的单个示例.Android示例不包含此功能.因此,如果有人知道如何使用sendFile/receiveFile并且可以在这里给出一个快速示例,那将不胜感激.
channel-api ×10
python ×2
channel ×1
comet ×1
gae-module ×1
get ×1
http ×1
module ×1
multi-user ×1
pooling ×1
python-2.7 ×1
real-time ×1
server-push ×1
wear-os ×1
websocket ×1