使用Rails实现实时通知的架构设计

26

我需要为我的Rails应用添加实时通知。以下是我发现的不同可能的架构。

1. Rails + Socket.io + Redis: 如此结构建议如下文章:

Rails + Socket.io + Redis

  • 优点: 简洁,如果Socket.io宕机,不会丢失任何数据
  • 缺点: 引入了多种技术(加强可维护性)

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

Rails + Socket.io

  • 优点: 直观易懂
  • 缺点: 依赖一个不太受欢迎的库

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

  • 优点: 100%的Ruby
  • 缺点: 由于需要外部应用,Socket.io现在比Faye更成为行业标准。

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

  • 优点: Rails中的应用程序方式
  • 缺点: 太不成熟

问题:

  • 现在是否有标准方法(我可能错过了)来做到这一点?
  • 对于我的比较有什么想法(希望这不会被关闭)?
3个回答

4

看一下eventmachine和websockets。还有第三方服务,如Pusher和PubNub,可以通过HTTP API为您处理websocket部分。

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

Rails 5 还将添加 ActionCable,它将在 Rails 中实现此功能,但尚未发布。
我认为这些方法的优点是您不需要单独的 node.js 应用程序。这些服务非常易于使用,但并非免费。

2
你一定应该看看 https://github.com/rails/actioncable
Action Cable 无缝地将 WebSocket 与你的 Rails 应用程序集成。它允许以 Ruby 的方式编写实时特性,与你的 Rails 应用程序的其余部分相同,同时仍然具有高性能和可伸缩性。它是一个全栈解决方案,提供了客户端 JavaScript 框架和服务器端 Ruby 框架。你可以访问使用 ActiveRecord 或其他 ORM 编写的完整域模型。

Action Cable 目前被认为是 alpha 版本软件。 - Sergei Struk

0

看看Plezi(这是我的个人项目,所以我可能有偏见)。

虽然它也可以作为独立框架使用,但很容易将其设置为Rails附加组件或使用Redis替换socket.io。

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

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

Plezi文档中有一个标题为“在现有Rack应用程序中使用Plezi”的部分

优点:使用本地websocket实现(服务器端websocket)和快速的C扩展服务器(Iodine)。完全集成您的Rails应用程序是可能的(在同一域/进程/ip/port上提供Websockets和HTTP);易于扩展(自动redis支持)。

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

祝你好运!


我会看一下,但你应该事先提到你是这个项目的开发者! - Augustin Riedinger
@AugustinRiedinger - 抱歉,有时候我会忘记提到这是我的个人项目...我现在会修正我的回答。 - Myst

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接