如何从rails控制器向节点服务器发送消息

时间:2016-01-06 18:41:37

标签: ruby-on-rails node.js ruby-on-rails-4

我想在创建新模型时更新节点服务器。我需要类似发布/订阅模式的东西,其中订户是node.js服务器,发布者是rails控制器。有没有办法实现这个目标?

* * * * *编辑* * * * *

感谢所有回答的人,我使用redis解决了这个问题。

On Gemfile:

...
require 'redis'
...

运行捆绑安装

在config / initializers / redis.rb上:

$redis = Redis.new(:host => 'localhost', :port=> 6379)      

On MyModel.rb:

...
class MyModel < ActiveRecord::Base
  after_create {|my_model| my_model.message 'create' }
  after_update {|my_model| my_model.message 'update' }
  after_destroy {|my_model| my_model.message 'destroy' }

  def message action
    msg = { 'type': action, 'my_model': self }
    $redis.publish 'rt-change', msg.to_json
  end
end
...

在package.json上:

...
"dependencies" : {
  ...
  "redis": "0.7.3"
},
...

运行 npm install

在node.js上:

var redis = require('redis').createClient();

redis.subscribe('rt-change');

redis.on('message', function(channel, message){
  ...
}

2 个答案:

答案 0 :(得分:2)

根据我的经验,这里有一些解决方案:

  1. 假设2个节点正在共享存储/数据库,这很简单,对吧?
  2. 假设事件不重要&amp;只有1个用户
    • 我们为node.js服务器创建一个内部api,它可以从rails controller
    • 接收更新事件
    • 对于来自Rails的每个事件,我们将其分配给webhook控制器以调用node.js api
    • 以上
  3. enter image description here

    Pros:易于实施

    Cons:如果在调用

    时出现任何问题,此事件可能会丢失

    为此,我们可能会实施一个可重复的策略,但它很复杂,因为如果有很多失败,我们会感到困惑,这将会被重试或取消。

    1. 假设事件很重要或有很多订阅者:(这是我的想法,我还没有实现)

      • 每当rails有事件并希望将其多播到订阅者时,我们会将此事件推送到消息队列
      • 所有订阅者都将从消息队列中提取上述消息并运行更新。

      AWS SNS支持我们这样做,以防我们熟悉AWS,但外面有很多其他选择。

    2. Pros:易于发布给多个订阅者

      Cons:实施耗时

      对于所有这些解决方案,security至关重要且必须考虑,订阅者可能会收到陌生人的活动?是的,在制定解决方案时也要设置安全性

答案 1 :(得分:2)

帮助您实现这一目标的几个步骤:

  1. 创建一个消息队列。您可以使用Amazon SQS
  2. 在Rails应用程序中创建一个控制器,只要创建模型实例,该控制器就会向消息队列广播消息。要在Rails应用中广播消息,您可以使用像shoryuken这样的宝石。
  3. 在节点服务器中创建一个订阅来自消息队列的事件的工作进程。您可以将aws-sdk模块用于节点。
  4. 当工作进程收到消息时,它应该解析它并根据您的业务逻辑对其进行操作。