我想在创建新模型时更新 Node 服务器。我需要类似发布/订阅模式的东西,其中订阅者是node.js 服务器,发布者是rails Controller 。有什么办法可以实现这一点吗?
* * * * * 编辑 * * * * *
感谢大家的回答,我使用redis解决了这个问题。
在 Gemfile 上:
...
require 'redis'
...
运行捆绑安装
在 config/initializers/redis.rb 上:
$redis = Redis.new(:host => 'localhost', :port=> 6379)
在 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 个 Node 共享存储/数据库,这很简单,对吧?
- 假设该事件不重要并且只有 1 个订阅者
- 我们为node.js服务器创建一个内部API,它可以接收来自rails Controller 的更新事件
- 对于来自 Rails 的每个事件,我们将其分配给一个 Webhook Controller 来调用上面的 Node.js api
优点
:易于实现
缺点
:如果调用时出现任何问题,此事件可能会丢失
为此,我们可以实现一个可重试的策略,但这很复杂,因为如果有这么多失败,我们会感到困惑,这些失败将被重试或取消。
假设事件很重要或者有很多订阅者:(这是我的想法,我还没有实现)
- 每当 Rails 有事件并希望将其多播给订阅者时,我们都会将此事件推送到消息队列
- 所有订阅者将从消息队列中提取上述消息并运行更新。
AWS SNS支持我们这样做,如果我们熟悉 AWS,但外面有很多替代方案。
优点
:易于发布给多个订阅者
缺点
:实现起来很耗时
对于所有这些解决方案,安全性
至关重要且必须考虑,订阅者可能会收到来自陌生人的事件?是的,在制定解决方案时也设置安全性
我是一名优秀的程序员,十分优秀!