gpt4 book ai didi

ruby-on-rails - 如何从 Rails Controller 向 Node 服务器发送消息

转载 作者:太空宇宙 更新时间:2023-11-04 03:07:45 24 4
gpt4 key购买 nike

我想在创建新模型时更新 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){
...
}

最佳答案

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

  1. 假设 2 个 Node 共享存储/数据库,这很简单,对吧?
  2. 假设该事件不重要并且只有 1 个订阅者
    • 我们为node.js服务器创建一个内部API,它可以接收来自rails Controller 的更新事件
    • 对于来自 Rails 的每个事件,我们将其分配给一个 Webhook Controller 来调用上面的 Node.js api

enter image description here

优点:易于实现

缺点:如果调用时出现任何问题,此事件可能会丢失

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

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

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

    AWS SNS支持我们这样做,如果我们熟悉 AWS,但外面有很多替代方案。

  • 优点:易于发布给多个订阅者

    缺点:实现起来很耗时

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

    关于ruby-on-rails - 如何从 Rails Controller 向 Node 服务器发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34640384/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com