2011-11-22 71 views
5

我正在写Rails 3.1中的一个简单的聊天室应用程序 - 用于学习目的。 对于初学者来说,我拥有所有需要的模型(消息,用户,房间等)和事物。 客户端每分钟轮询一次服务器(例如),如果有任何消息,则会获得新消息。使用EventMachine的Rails应用程序是否可以进行长时间轮询?

我想简单的轮询更改为长轮询和无法弄清楚这是否可以在同一应用程序做或做我必须创造一个长轮询其他一些Push服务器。

我读了很多关于EventMachine的和改变了我的Rails应用程序用户的它,因为我想用EventMachine的为事件驱动机制。我认为EventMachine频道会派上用场。 客户端会连接并等待聊天室中的消息,并且只有在发送到房间时才会收到消息。

我无法弄清楚什么是我可以分享我的所有客户端连接之间的EventMachine的:: Channel实例。 这种方法甚至有可能,或者我以错误的方式去做?

如果可能的话,我想可以作为托管在Heroku上一个Rails应用程序运行的解决方案。

+0

我不是活动机器的专家,但我认为这是可能的。而且你不分享你的客户之间的渠道,但你有一个客户端,你需要在EM之上建立一些东西,以便在不同的用户之间发送消息。 – Augusto

+0

是的,说我有一个渠道为每个客户。 我可以在哪里存储所有这些通道实例,以便可以从其他人发送消息时调用的控制器访问? – Oded

回答

0

扩展我在评论中提到的内容,检查此blog文章,该文章解释了如何使用EM创建基于文本的聊天应用程序,并使用AMQP将消息广播给其他用户。

我认为你可以做同样的事情,或者在内存队列中使用一些共享消息,这绝对应该在heroku上工作,因为你没有对RabbitMQ等外部服务的依赖。 下面是关于不同的队列框架商量好了:ActiveMQ or RabbitMQ or ZeroMQ or

0

Rails会已经在版本4 流式加现在,你可以在流(长轮询)像this例如与西纳特拉和Redis的的发布/订阅功能,作为后端。您将不得不添加另一个操作来处​​理用户发送的消息,并使用PUBLISH命令将其添加到Redis。您应该使用Thin或Puma等偶数服务器。

1

是的。我只是使用事件机写了一个演示。我的情况是玩家在地图上行走,其他玩家应该能够看到它。 演示看起来像这样:

  1. 客户端建立连接,报告其自己的坐标(随机生成的)

  2. 有一个阵列保留所有的坐标为每个客户端

  3. 当客户端移动,它将其新坐标发送到服务器。然后服务器发现他附近的人(来自阵列),并将新坐标推送给这些客户端。

我测试了近5000个客户端,每秒20-30名玩家移动其位置。而且服务器进程仅占用100M内存的CPU(50%-60%)(在单个内核上)的CPU使用率不到100M。

就你而言,我认为你应该尝试一下faye。它基于事件机器,并且适用于像聊天室这样的解决方案。

相关问题