将同步http请求/响应模型与基于异步队列的模型连接起来的好方法是什么?
当用户的HTTP请求到来时,它会生成一个进入队列的工作请求(在本例中为beanstalkd).其中一名工人接受请求,完成工作并准备回复.
队列模型不是请求/响应 - 只有请求,而不是响应.所以问题是,我们如何才能最好地将响应反馈回HTTP世界并返回给用户?
思路:
Beanstalkd支持轻量级主题或队列(他们称之为管).我们可以为每个请求创建一个管,让工作人员在该管上创建一条消息,让http进程坐下并等待管的响应.不要特别喜欢这个,因为它有apache进程坐着记忆.
让http客户端轮询响应.用户的初始HTTP请求将启动队列上的作业并立即返回.客户端(用户的浏览器)定期轮询响应.在后端,工作人员将其响应放入memcached,我们将nginx连接到memcached,因此轮询很轻.
使用Comet.类似于第二个选项,但与更高级的http通信,以避免轮询.
我倾向于2,因为它很容易且很清楚(我还没有用过彗星).我猜我可能还有一个更好的模型,我没有想过.你怎么看?
我正在尝试使用WCF实现彗星式服务器推送到ajax Web应用程序.
在我的WCF服务中,我实现了一个WaitForEvents方法,该方法调用Monitor.Wait来挂起线程,直到新数据到达.此时,监视器发出脉冲,并且该方法返回关闭彗星样式请求的新数据.
发生这种情况时会再次发出请求.
目前,这工作正常,但我注意到WCF需要为每个连接的用户创建一个新线程.这可能是因为在数据进入之前线程无法返回到线程池,因此每个连接的用户都需要一个新线程.
我想通过让一个线程服务多个连接来使这个实现更有效.如果我要使用套接字,可以通过保持套接字打开并首先将线程返回到线程池来完成.当新数据到达时,它将由另一个线程传递,我们可以将新数据直接写入套接字并关闭它.
有谁知道如何通过WCF完成这项工作?
我一直在看"Push-Style Streaming" http://msdn.microsoft.com/en-us/library/bb472551.aspx,他们提到"WCF实现了一个"拉"模型,其中应用程序代码(该服务) )返回Stream的一个实例,并依赖于较低级别的基础架构从该流中提取数据并将其写入网络." 但是我找不到这个网站的任何例子.
提前谢谢了!
我的情况似乎符合Async Servlet 3.0/Comet情况,但我需要做的就是在接受传入参数后返回200响应代码(或其他).
有没有办法让HttpServlet完成http请求/响应握手并继续处理?
就像是...
doPost( req, response ) {
// verify input params...
response.setStatus( SC_OK );
response.close();
// execute long query
}
Run Code Online (Sandbox Code Playgroud)
编辑:看看javax.servlet包 - 我的问题的正确措辞是
我如何提交回复?
在Servlet.isCommitted()中
我需要创建像Facebook聊天这样的聊天.
使用Comet我需要更多内存来保持连接.
使用Ajax轮询,如果我每3-4秒发送一次请求,就会出现延迟问题.
所以...如果延迟(3-4秒)无关紧要,Ajax Polling对我的情况更好吗?
我需要在Web应用程序中构建一些非常激进的"自动刷新"功能.它是一种照片库,图像存储在AmazonS3上,但有关图像的数据存储在我们自己的数据库中.我玩过轮询服务器并发送ajax调用以获取更新的数据.我真的很担心这种方法对服务器的负载.有时,页面需要每15到30秒更新一次.
我一直在读Comet,我只是没有卖掉这个"黑客"是个好主意.WebSockets可能会有所帮助,但我担心它们太新而且太不受支持了.那么,话虽这么说,是否有人建议如何构建一个需要经常刷新并有可能拥有非常高的用户群的系统?
我并不认为只是为问题投入更多的服务器,但不相信这也是最好的方法.在其他人建议之前,我不能做Flex,因为网络应用程序必须在iPad上运行.
我想知道是否有任何代码引用,我可以遵循写一个非常简单的例子.许多帖子或网站只是谈论这项技术.
是否可以让Web服务器在没有Comet的情况下向Web浏览器发送消息?
像Facebook和谷歌这样的每个主要网络公司都使用Comet来实现这个目的,如果为主流浏览器启用了tcp连接,它就像是一个丑陋的黑客等待消失.
我有一台运行node.js(v0.1.32)的机器,带有tcp服务器(tcp.createServer)和http服务器(http.createServer).http服务器受到来自端口80上的基于彗星的应用程序的长轮询请求(每个持续50秒)的影响.并且在i80应用程序的端口8080上存在用于相同目的的tcp套接字连接.
发现服务器无法处理更多连接(特别是tcp连接,而http连接看起来很好!! ??)一段时间后才恢复正常.
对于负载测试连接,我创建了一个tcp服务器并生成了2000个请求,并发现在达到机器上的最大文件描述符限制后连接开始失败(默认为1024).这是一个非常小的数字.
所以,这里有一个新手问题:如何扩展我的应用程序以处理node.js上更多的连接以及我如何处理这个问题.
有没有办法找出目前有多少活动连接?
谢谢Sharief
我正在使用play框架开发一个浏览器游戏,我肯定需要longpolling,但我不太明白如何使用它.WebSockets对于它来说是完美的,但它还没有得到那么多浏览器的支持.
这就是我想要做的事情:当用户登录并导航到游戏控制器时,我想开始连接并保持打开状态.我想为所有在线用户执行此操作,因此我可以在网站上显示这些用户的列表,以便他们可以互相玩耍.我查看了文档,但我不明白如何在我的情况下实现它.因为根本没有我想要计算的东西(在示例中他们正在生成pdf)我只想让连接保持打开状态.
我还想知道的是,我应该如何跟踪所有这些开放的连接?现在,我online在数据库的users表中只有一个列,我更新了.每次有人连接时我都要更新数据库.有没有更好的方法来做到这一点,还是这样好吗?
最后,假设以上所有工作.当玩家A选择玩家B玩时:如何通知玩家B?我只是发送一些JSON代码,并在播放器B的一侧用javascript更改页面,还是将他发送到一个完全不同的页面?当两个连接建立并且游戏已经开始时,我不确定如何通信.
我正在研究AJAX,因为我正在使用Javascript和PHP制作实时应用程序.它需要能够在不刷新页面的情况下进行更新并实时更新.
我尝试使用setInterval()轮询服务器但是为了快速我必须每秒都有它.它似乎使用了大量的带宽.它确实有效,我有一个计划与我的托管服务提供商'无限带宽'.虽然网站上有很多压力,但我想使用Push技术.
学习如何设置Push非常困难.从我设法弄清楚,你必须托管某种类型的推送服务器或彗星服务器.我也研究过websockets,但你也必须自己主持它.当我没有服务器计算机时,我不明白该怎么做,我的托管服务提供商网站上没有关于此的文档.
特定主机提供商是否为您托管推送服务器?有没有办法获得服务器而不必托管它?这似乎是一个比投票更好的选择,但同时它似乎非常令人困惑.
comet ×10
ajax ×4
http ×2
java ×2
javascript ×2
long-polling ×2
polling ×2
reverse-ajax ×2
websocket ×2
ajax-polling ×1
beanstalkd ×1
c# ×1
chat ×1
evented-io ×1
node.js ×1
performance ×1
queue ×1
real-time ×1
servlets ×1
tcp ×1