`
knwang
  • 浏览: 3117 次
  • 性别: Icon_minigender_1
  • 来自: 硅谷
最近访客 更多访客>>
文章分类
社区版块
存档分类

报名了: 本周末学习用Ruby写基于事件的异步服务器

阅读更多

其实就是 ruby event based asynchronous server, 服务器/客户端用web sockets通信的

 

传统的网络服务器(Apache等)都是基于同步处理(客户端发Request,服务器处理, 返回结果)。 这样的结果是一个客户端的读写操作会占用服务器系统资源,是得其他客户端得请求要等待其结束才能被处理,或者只能多线程。 异步处理采用基于事件得方式,实现反应器得的样式(reactor pattern). 服务器接到请求后交给后台处理, 然后立刻接下一个请求, 后台处理好之后服务器受到通知,然后再以回叫(callback)的方式通知客户端。 

 

举个呼叫中心的例子: 

 

同步服务器: 

 

客户: 我要找xxx资料

接线员: 你等一下啊别挂。。 我让同事(后台服务)帮我找找看。。 (10分钟后) 找到了。。 你的资料是xxx

客户:谢谢

 

异步服务器:

客户1:我要找xxx资料

接线员: 知道了。挂电话吧, 找到我给你打回去 。 。。 那谁(后台服务),帮我找xxx

客户2:我要找yyy资料

接线员: 知道了。挂电话吧, 找到我给你打回去 。 。。 那谁(后台服务),帮我找yyy

... 

 

 

可见异步是非常有效的方式,可以是服务器能同时处理的请求大大增加。 非常适用于即时网络(real time web), 多用户互动游戏等应用上。 其具体的实现方法有很多种, Socket.io, Python有Twisted, Ruby有基于EventMachine的Coolio, 再高层的抽象有Express.js, Cramp / Goliath等等. 还有商业的应用比如Pusher

 

我做了些研究, 觉得最方便好用的还是Faye - 同时支持Node 和Ruby, 基于Rack,可做中间件, 很方便和Rails集成。 

 

讲了这么多。。 我这周末准备用Faye做一个多用户的贪吃蛇游戏, 便做边学习异步。用到的技术会有 Rails, Faye, HTML5 (drawing and web sockets), jQuery, javascript等。 如果有人想一起学习, 可以报个名,我们可以约下时间一起做, 在网上找个聊天室或者IRC即时交流。

 

新手/中手不要害怕, 只要你有Rails基础就可以来做, 我可以帮助大家。。。高手们,我们需要你们

 

一些阅读资料

 

http://www.slideshare.net/igrigorik/event-driven-architecture-meshu-ilya-grigorik

http://railscasts.com/episodes/260-messaging-with-faye

http://faye.jcoglan.com/

http://www.slideshare.net/ismasan/websockets-and-ruby-eventmachine

http://diveintohtml5.org/

 

 

 

 

 

 

 

分享到:
评论
27 楼 wmcoo 2011-06-16  
<div class="quote_title">knwang 写道</div>
<div class="quote_div">
<p> </p>
<p>异步服务器:</p>
<p>客户1:我要找xxx资料</p>
<p>接线员: 知道了。挂电话吧, 找到我给你打回去 。 。。 那谁(后台服务),帮我找xxx</p>
<p> </p>
</div>
<p> </p>
26 楼 feitian0127 2011-06-13  
不错的学习机会,希望以后多多组织。
25 楼 zhanzhan02 2011-06-06  
期待下次活动。
24 楼 witcheryne 2011-06-03  
<div class="quote_title">knwang 写道</div>
<div class="quote_div">
<div class="quote_title">HTML5确实很强大, 看这里有只用HTML5实现的网页游戏</div>
<div class="quote_title">http://playbiolab.com/</div>
<div class="quote_title"><br></div>
<div class="quote_title"><br></div>
<div class="quote_title">witcheryne 写道</div>
<div class="quote_div">
<div class="quote_title">knwang 写道</div>
<div class="quote_div">
<p> </p>
<p> </p>
<ul>
<li>Ryan Bates的Faye视频: <span>http://railscasts.com/episodes/260-messaging-with-faye</span>
</li>
<li>Mike Subelsky的HTML5教程,其中1-7是画图和动画, 8是Web Scoket: https://github.com/subelsky/html5tutorial/blob/master/tutorial.html</li>
</ul>
<p> </p>
<p> </p>
</div>
<p><span>Mike Subelsky的HTML5教程 的教程非常棒!!!</span></p>
</div>
<p> </p>
</div>
<p>恩~ 这个玩过,   开头的动画效果相当震撼!!!</p>
23 楼 knwang 2011-06-03  
<div class="quote_title">HTML5确实很强大, 看这里有只用HTML5实现的网页游戏</div>
<div class="quote_title">http://playbiolab.com/</div>
<div class="quote_title"><br></div>
<div class="quote_title"><br></div>
<div class="quote_title">witcheryne 写道</div>
<div class="quote_div">
<div class="quote_title">knwang 写道</div>
<div class="quote_div">
<p> </p>
<p> </p>
<ul>
<li>Ryan Bates的Faye视频: <span>http://railscasts.com/episodes/260-messaging-with-faye</span>
</li>
<li>Mike Subelsky的HTML5教程,其中1-7是画图和动画, 8是Web Scoket: https://github.com/subelsky/html5tutorial/blob/master/tutorial.html</li>
</ul>
<p> </p>
<p> </p>
</div>
<p><span>Mike Subelsky的HTML5教程 的教程非常棒!!!</span></p>
</div>
<p> </p>
22 楼 knwang 2011-06-03  
<p>
</p>
<p>几天没来, 没看到大家的回复。。 这个活动已经结束是在上周末(5/28)进行的。 </p>
<p> </p>
<p>我就在这里总结一下,因为大家基本上是独立开发的, 我就主要讲下我的经验</p>
<p> </p>
<p>开始的时候我花了很多时间搭配Faye的后端,按照Ryan Bates的Railscast,Faye的后台服务器是要和web server分开的, 如果一定这样的话对于Deploy在<a href="http://www.heroku.com/">Heroku</a>上面就比较麻烦, 因为Heroku是Rack结构只看config.ru文件的。 我发现其实Faye可以很方便的当作中间件(middleware)来用, 只要把这个加在Rack/Rails/Sinatra的配置文档里就好了</p>

<p> </p>
<p><span style="font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 14px; letter-spacing: 1px; line-height: 22px; white-space: pre;"><span class="n" style="font-size: 14px; vertical-align: baseline; background-color: transparent; padding: 0px; margin: 0px;">use</span> <span class="no" style="font-size: 14px; vertical-align: baseline; background-color: transparent; color: #008080; padding: 0px; margin: 0px;">Faye</span><span class="o" style="font-size: 14px; vertical-align: baseline; background-color: transparent; color: #000000; font-weight: bold; padding: 0px; margin: 0px;">::</span><span class="no" style="font-size: 14px; vertical-align: baseline; background-color: transparent; color: #008080; padding: 0px; margin: 0px;">RackAdapter</span><span class="p" style="font-size: 14px; vertical-align: baseline; background-color: transparent; padding: 0px; margin: 0px;">,</span> <span class="ss" style="font-size: 14px; vertical-align: baseline; background-color: transparent; color: #990073; padding: 0px; margin: 0px;">:mount</span> <span class="o" style="font-size: 14px; vertical-align: baseline; background-color: transparent; color: #000000; font-weight: bold; padding: 0px; margin: 0px;">=&gt;</span> <span class="s1" style="font-size: 14px; vertical-align: baseline; background-color: transparent; color: #dd1144; padding: 0px; margin: 0px;">'/faye'</span><span class="p" style="font-size: 14px; vertical-align: baseline; background-color: transparent; padding: 0px; margin: 0px;">,</span> <span class="ss" style="font-size: 14px; vertical-align: baseline; background-color: transparent; color: #990073; padding: 0px; margin: 0px;">:timeout</span> <span class="o" style="font-size: 14px; vertical-align: baseline; background-color: transparent; color: #000000; font-weight: bold; padding: 0px; margin: 0px;">=&gt;</span> <span class="mi" style="font-size: 14px; vertical-align: baseline; background-color: transparent; color: #009999; padding: 0px; margin: 0px;">45</span></span></p>
<p> </p>
<p>然后 /faye 就会被引导到faye后台。 </p>
<p> </p>
<p>有点注意的是Faye要求服务器是<a href="http://code.macournoyer.com/thin/">Thin</a>, 所以本地跑的时候不能用"Rails Server" 或者 Shotgun等等, 而要用</p>
<p> </p>
<p><span style="color: #666666; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; letter-spacing: 1px; line-height: 22px;">rackup config.ru -s thin -E production</span></p>
<p> </p>
<p>当然要装相应的gems. </p>
<p> </p>
<p>蛇的控制我是参照了<a href="https://github.com/paulbjensen/Snake">Paul Jensen的代码</a>。。 我把他的前台Javascript重新模块话了下, 建立了几个模型更好的适应多蛇的游戏。 画图用的是HTML5的Canvas. 协调同步这方面我是捕捉键盘指令后立即把本地的状态通过Faye的web client (javascript code)通过Faye后台发到各个客户端, 这些客户端通过Javascript的代码其实也是实现反应器的模式, 一旦接到更新的数据立刻本地更新重画。 我的代码里面设置了每1/10秒更新,但很容易改。 </p>
<p> </p>
<p>Faye的客户端运输协议支持其实非常强大,Faye会依照这个顺序根据你的客户端选择</p>
<p>
</p>
<ul>
<li><span style="color: #3f3f3f; font-family: FreeSans, Helvetica, Arial, sans-serif; font-size: 15px; line-height: 18px;">Persistent connections using WebSocket </span></li>
<li><span style="color: #3f3f3f; font-family: FreeSans, Helvetica, Arial, sans-serif; font-size: 15px; line-height: 18px;">Long-polling via <span class="caps">HTTP POST</span></span></li>
<li><span style="color: #3f3f3f; font-family: FreeSans, Helvetica, Arial, sans-serif; font-size: 15px; line-height: 18px;">Cross Origin Resource Sharing</span></li>
<li><span style="color: #3f3f3f; font-family: FreeSans, Helvetica, Arial, sans-serif; font-size: 15px; line-height: 18px;">Callback-polling via <span class="caps">JSON</span>-P</span></li>
</ul>
<p> </p>
<p>最后,我的代码<a href="https://github.com/knwang/faye-snake">在这里</a>。 大家可以看看,下来到本地运行。 我实现了红绿两条蛇对打。玩的时候要同时开两个窗口, 然后在一个里面点"Run my snake", 在两个窗口例可以同时看到蛇开始动了。 在另一个窗口里面也点"Run my snake"就会每个窗口里面出现第二条蛇。 当然游戏开始的程序可以做的在好点, 比如一个人坐下等待,两人都确认后游戏在开始。。 这次就没每时间弄了。 主要的代码在snake.js里面,我建立的模型应该很容易扩展到多于两条蛇的情景。欢迎继续开发。 </p>
<p> </p>
<p>因为时间有限,肯定Bug多多, 谢谢提交补丁。 有问题我会尽力回答。 </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
21 楼 witcheryne 2011-06-01  
<div class="quote_title">knwang 写道</div>
<div class="quote_div">
<p> </p>
<p> </p>
<ul>
<li>Ryan Bates的Faye视频: <span>http://railscasts.com/episodes/260-messaging-with-faye</span>
</li>
<li>Mike Subelsky的HTML5教程,其中1-7是画图和动画, 8是Web Scoket: https://github.com/subelsky/html5tutorial/blob/master/tutorial.html</li>
</ul>
<p> </p>
<p> </p>
</div>
<p><span style="">Mike Subelsky的HTML5教程 的教程非常棒!!!</span></p>
20 楼 witcheryne 2011-06-01  
报名报名!!非常感兴趣...

ruby/rails 基本都属于入门,HTML5也非常有兴趣~

Http Streaming 一直要在项目中用, 现在用的是pushlet解决方案

这回来试试 WebSocket
19 楼 zires 2011-06-01  
周末有时间,报个名
18 楼 jn615 2011-05-31  
来晚了, 早没看见, github 上地址多少?
17 楼 jordan421 2011-05-31  
氛围真棒阿~~支持,支持
16 楼 knwang 2011-05-28  
QuakeWang 写道
AI的snake challenge:

https://bitbucket.org/linjunhalida/snake-challenge

web和api是用ruby写的,不过没有用websocket,只是用ajax pool,demo room:
http://pythonvsruby.org/room/1/


ajax poll 是每隔比如半秒客户端问服务器地图么? 我想最好能引擎没半秒推状态到各个客户端上
15 楼 prettyinsight 2011-05-28  
http://webchat.freenode.net/
频道:faye
14 楼 knwang 2011-05-28  
感觉5个小时会不够, 大家做个思想准备

knwang 写道
prettyinsight 写道
到时候怎么交流


IRC:

irc.freenode.net
频道: faye

我已经开始准备了。。

13 楼 knwang 2011-05-28  
prettyinsight 写道
到时候怎么交流


IRC:

irc.freenode.net
频道: faye

我已经开始准备了。。
12 楼 prettyinsight 2011-05-28  
到时候怎么交流
11 楼 QuakeWang 2011-05-27  
AI的snake challenge:

https://bitbucket.org/linjunhalida/snake-challenge

web和api是用ruby写的,不过没有用websocket,只是用ajax pool,demo room:
http://pythonvsruby.org/room/1/
10 楼 knwang 2011-05-27  
<p>时间定在北京时间周六早10点 - 下午3点。 如果需要延长可以大家决定。 </p>
<p> </p>
<p>------</p>
<p>欢迎Jinleileiking, NCruby, prettyinsight, t0uch. Zhongji, 如果一点Ruby的基础都没有会非常困难,但取决于你的学习能力。如果你想参加, 请在一天之内尽量多的学习Ruby和Rails。 </p>
<p> </p>
<p>有点要说明的是这是一个大家一起学习讨论的机会,报名的人和我可能都对这方面经验不多, 都是准备共同摸索讨论的,所以报名人不需要在这方面有经验。我们会帮你解决些搭结构这样的问题,但总体上还是期待你能够独立的开发。 </p>
<p> </p>
<p>如果你只对相关技术感兴趣,对游戏本身没什么兴趣, 你可以Google "Programming the snake game" 网上有很多算法实现,不需要自己想。 </p>
<p> </p>
<p><strong>***开始之前请学习和完成以下两个教程***</strong></p>
<p> </p>
<p> </p>
<ul>
<li>Ryan Bates的Faye视频: <span>http://railscasts.com/episodes/260-messaging-with-faye</span>
</li>
<li>Mike Subelsky的HTML5教程,其中1-7是画图和动画, 8是Web Scoket: https://github.com/subelsky/html5tutorial/blob/master/tutorial.html</li>
</ul>
<p> </p>
<p> </p>
<p>除了基本的Ruby on Rails环境, 还要</p>
<p>
</p>
<ul>
<li>有Github帐号 (用来共享代码),</li>
<li>知道怎样用Heroku deploy (www.heroku.com) Rack / Rails app. </li>
</ul>
<ul></ul>
<p> </p>
<p>我对贪吃蛇游戏的简单定义: </p>
<p> </p>
<p>最简单:</p>
<p> </p>
<p>1。上下左右控制蛇的移动</p>
<p>2。 撞到墙,自己或者其他蛇游戏结束</p>
<p>3。 吃到豆子身体增长</p>
<p>4。 双人对打</p>
<p>5。 字符界面</p>
<p> </p>
<p>奖金:</p>
<p>4。 多人对打</p>
<p>5。 吃到豆子移动速度增快</p>
<p>6。 超炫动画界面</p>
<p> </p>
<p>大家补充吧</p>
<p> </p>
9 楼 zhongji 2011-05-26  
0 ruby 可以报名吗?
8 楼 t0uch 2011-05-26  
看起来很有意思,目前没有做过有关异步的应用,报个名

相关推荐

    Ruby-Async是基于nio4r和定时器的Ruby的可组合的异步IO框架

    2. **事件循环(Event Loop)**:Ruby-Async中的事件循环负责管理所有的异步操作,监控I/O事件,并根据需要调用相应的回调函数。事件循环是异步编程的心脏,它确保了所有任务的有序执行。 3. **组合性...

    基于Ruby编程语言基于Ruby编程语言基于Ruby编程语言基于Ruby编程语言.zip

    本资料包主要关注的是基于Ruby编程的基础知识和应用,包括如何使用Ruby进行开发和解决问题。 Ruby的设计哲学强调程序员的生产力和代码的可读性。它的语法直观,使得初学者能够快速上手。Ruby的核心特性包括: 1. ...

    叶玎玎:Real Time Solutions with Ruby

    标题“叶玎玎:Real Time Solutions with Ruby”中的“Real Time Solutions with Ruby”明确指出本演讲或文章的主题是关于如何利用Ruby编程语言来实现实时应用解决方案。“叶玎玎”则是演讲者或作者的名字。 #### ...

    Ruby-Geocoder完整的Ruby地理编码解决方案

    在实际项目中,Ruby-Geocoder常与Ruby on Rails框架结合使用,通过配置ActiveRecord模型,可以方便地将地理位置信息存储在数据库中,并实现基于位置的查询。例如,你可以在模型中添加`geocoded_by`和`acts_as_...

    基于Ruby编写的命令行注入版本.zip

    基于Ruby编写的命令行注入版本.zip基于Ruby编写的命令行注入版本.zip基于Ruby编写的命令行注入版本.zip基于Ruby编写的命令行注入版本.zip基于Ruby编写的命令行注入版本.zip基于Ruby编写的命令行注入版本.zip基于Ruby...

    异步事件驱动的RubyWeb应用框架Cramp.zip

    它建立在Ruby的EventMachine库之上,主要用于处理一些大量的开放连接 (如Comet系统或streaming APIs),整个过程都使用event-driven I/O。 Cramp使用Rails 3.0的ActiveSupport 和 ActiveModel库, 它会显示两层用于...

    Ruby-Puma一个Ruby的并发Web服务器

    2. **事件驱动**:Puma利用Ruby的事件库,如libuv或eventmachine,实现非阻塞I/O,使服务器能够高效地处理大量并发连接。 3. **热重启**:Puma支持热重启功能,这意味着在不中断服务的情况下可以更新应用程序代码。...

    ruby学习的源码

    本资料包针对Ruby学习者提供了丰富的资源,对于初学者来说是非常有价值的。 1. **Ruby基础知识**: - 变量:Ruby支持局部变量、实例变量、类变量和全局变量,它们以不同的符号开头,如`@`、`$`等。 - 类与对象:...

    Ruby/tk学习资料

    ### Ruby/tk 学习资料知识点详述 #### 核心概念:Ruby/tk简介与基本操作 ...通过学习如何引入库、创建根窗口、启动事件循环以及使用布局管理器等基本操作,开发者可以快速上手Ruby/tk并进一步探索更多高级功能。

    Ruby-Falcon用于Ruby的高性能web服务器支持HTTP2和HTTPS

    Ruby-Falcon是一个专门为Ruby语言设计的高性能Web服务器,它的出现为开发者提供了在处理高并发、低延迟场景下的优秀选择。Falcon的主要特点是其对HTTP/2协议和HTTPS的支持,这使得它在现代Web服务中具备了高效且安全...

    Ruby-agoo一个用于Ruby的高性能HTTP服务器

    1. 高性能:agoo利用异步I/O和事件驱动的机制,有效地处理大量并发请求,减少了CPU和内存的占用。 2. Websocket与SSE支持:agoo内置对WebSocket和SSE协议的支持,可以轻松构建实时通信的应用。 3. 轻量级:相比于...

    Ruby-CelluloidIO实现的Web服务器

    1. **异步事件驱动**:通过使用Celluloid::IO,Reel可以监听套接字事件,如新的连接、数据到达或连接关闭,这些事件都会触发相应的回调函数,无需等待I/O操作完成。 2. **HTTP/1.1支持**:Reel支持HTTP/1.1协议,...

    Ruby-RubyRetriever异步Web爬虫

    RubyRetriever是一款基于Ruby语言实现的异步Web爬虫工具,它被设计为一个既可以作为命令行程序运行,也可以作为框架供开发者自定义爬取逻辑的解决方案。这个项目的核心特性在于其异步处理能力,这使得它在抓取大量...

    WebServer_SourceCode_Ruby:Web服务器源代码Ruby版-服务器

    1. **事件驱动模型**:Ruby中的Web服务器通常基于事件驱动模型,如WEBrick或Puma。这些服务器使用非阻塞I/O,以高效地处理并发请求。 2. **路由系统**:Ruby on Rails的路由系统将URL映射到控制器的特定动作,是...

    Ruby语言教程.docx

    - **学习建议**:通过本教程学习Ruby的基础知识后,尝试自己编写简单的程序来加深理解。 - **极客教程**: - **链接**:[Ruby 教程 | 极客教程](https://geek-docs.com/ruby/ruby-tutorial/ruby-tutorial.html) ...

    ruby-bank:在 Rails 上学习 ruby

    Ruby on Rails(简称Rails)是一个基于Ruby语言的开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,旨在简化Web应用开发过程,提高开发效率。"ruby-bank"项目正是一个针对初学者设计的实践平台,...

    Ruby-OurPC是gRPC客户端和服务器的实验性实现

    Ruby-OurPC是一个针对gRPC框架的实验性实现,它为开发者提供了在Ruby环境中构建gRPC客户端和服务器的能力。gRPC是一个高性能、开源和通用的RPC(远程过程调用)框架,它基于HTTP/2协议设计,支持多种编程语言,包括...

    Ruby新手学习书(Ruby语言中文教程)和Rails_4_days

    Ruby是一种面向对象的编程语言,以其简洁、优雅的语法著称,被广泛应用于Web开发,尤其是与Ruby on Rails框架结合使用。"Ruby新手学习书"和"Rails_4_days"这两个资源是为初学者设计的,旨在帮助他们快速掌握Ruby语言...

    Ruby-云片短息ruby服务器端api

    "云片短息Ruby服务器端API"就是针对Ruby开发者的SDK,允许他们在服务器端通过编程方式发送短信验证码、通知或营销信息。 首先,我们需要了解如何安装这个SDK。通常,它会以Ruby gem的形式发布,可以通过`gem ...

    一个很棒的用于Ruby的异步事件驱动的React堆。-Ruby开发

    异步是基于nio4r和计时器的可组合的Ruby异步I / O框架。 “最近我一直在研究异步,因为我的一个项目tus-ruby-server会真正受益于非阻塞I / O。实际上,Async是一个基于nio4r和Ruby的可组合的Ruby异步I / O框架。 ...

Global site tag (gtag.js) - Google Analytics