26

我需要向我的 Rails 应用程序添加实时通知。这是我发现的不同的可能架构。

1. Rails + Socket.io + Redis:正如本文所建议,具有以下架构:

Rails + Socket.io + Redis

  • Pro:干净,如果 Socket.io 关闭,不会丢失数据
  • 缺点:引入了几种技术(增强了可维护性)

2. Rails + Socket.io:让 Rails 成为 Socket.io 客户端,就像这个 repo 所做的那样:https ://github.com/lyondhill/socket.io-ruby-client

Rails + Socket.io

  • 优点:直截了当
  • 缺点:依赖一个冷门的库

3. Ruby Faye: http: //faye.jcoglan.com/ruby.html

  • :100% 红宝石
  • 缺点:由于需要外部应用程序,因此Socket.io现在比 Faye 更像是一个行业标准。

4. ActionController::Live: http://edgeapi.rubyonrails.org/classes/ActionController/Live.html

  • Pro : 应用程序中的 Rails
  • 缺点:太不成熟

问题:

  • 现在有标准的方法(我会错过)吗?
  • 对我的比较有什么想法(希望这不会关闭)?
4

3 回答 3

4

看看 eventmachine 和 websockets。还有第三方服务,例如 Pusher 和 PubNub,它们将通过 HTTP API 为您处理 websocket 部分。

https://github.com/igrigorik/em-websocket

Rails 5 还将添加 ActionCable,它将在 rails 中执行此操作,但它还没有推出。

我想说这些方法的优点是您不需要单独的 node.js 应用程序。这些服务非常易于使用,但不是免费的。

于 2015-08-27T13:16:34.970 回答
2

你绝对应该看看https://github.com/rails/actioncable

Action Cable 将 websockets 与 Rails 应用程序的其余部分无缝集成。它允许以与 Rails 应用程序的其余部分相同的样式和形式用 Ruby 编写实时功能,同时仍然具有高性能和可扩展性。它是一个提供客户端 JavaScript 框架和服务器端 Ruby 框架的全栈产品。您可以访问使用 ActiveRecord 或您选择的 ORM 编写的完整域模型。

于 2015-09-10T12:44:00.230 回答
0

看看Plezi(这是我自己的宠物项目,所以我可能会有偏见)。

虽然它也可以用作一个独立的框架,但很容易将其设置为 Rails 插件或 Redis 的 socket.io 替代品。

如果您将服务器切换到 Plezi 的首选服务器(只需从 gemfile 中删除对其他服务器的引用),您可以编写一个 Plezi websocket 控制器并让它与您的 Rails 应用程序在同一进程(相同的 ip:port)上运行。

另一种选择是将 Plezi 作为独立进程运行(在不同的端口上)并使用 Redis 同步它们(使用 Plezi 的 Placebo API)。

在 Plezi 的文档中有一节标题为:“将 Plezi 与我们现有的 Rack 应用程序一起使用

Pro:使用本机 websocket 实现(服务器端 websockets)和快速 C 扩展服务器(碘)。可以与您的 Rails 应用程序完全集成(在同一域/进程/ip/端口上同时提供 websockets 和 HTTP);轻松扩展(自动 redis 支持)。

缺点:年轻;需要 C 扩展支持(Ruby MRI)和 Linux / BSD / OS X 机器(无 windows);共享代码需要是线程安全的(websocket 可能与 HTTP 或其他连接并行运行)。

祝你好运!

于 2015-08-27T17:34:55.657 回答