2013-02-27 89 views
1

我有一个分析引擎,它定期以JSON格式打包一堆统计信息。我想将这些包发送到Rails服务器。一旦包到达,Rails服务器应该检查它,从中生成一个模型实例(用于历史目的),然后将内容显示给用户。我想到了两种方法。将数据从分析引擎发送到Rails服务器

1)有一个小应用程序驻留在同一主机Rails服务器在倾听这些包(使用ZeroMQ)上。收到包后,应用程序将通过CURL调用Rails动作,并将该包作为参数传递。我对这种方法的担心是,我的Rails服务器检查只有登录用户可以访问影响模型的操作。通过创建可用于此侦听应用程序(以及其他实体)的操作,我是否将自己暴露给一个重大的安全缺陷?

2)第二种方法是只需听音应用转储封装成一个特殊的数据库表。 Rails服务器会定期检查这个表是否有新的包。一旦检测到一个或多个,它将​​处理它们并将它们从桌面上移除。

这是我第一次做这样的事情,所以如果你有,你可以分享更好的解决方案技术或经验,我很想学习。

谢谢。

回答

0

您可以通过限制如果你希望用户看到更新,允许在routes.rb中

post "/analytics" => "analytics#create", :constraints => {:ip => /127.0.0.1/} 

请求的主机名限制访问某个呼叫,您可以使用轮询刷新页面每分钟orso。

0

1)是的,你是暴露的重大安全漏洞,除非:

  1. 你zeroMQ的应用提供所需的数据做认证和授权在铁轨上侧
  2. 你的Rails应用程序被配置为只监听在127.0.0.1的接口,因此不能从访问外部
  3. 像本杰明建议,您限制特定路由某些IP

2)本approa ch看起来很像delayed_job所做的。您可能想看看那里:https://github.com/collectiveidea/delayed_job并使用rake任务来添加新作业。

总之,你的听力应用程序将调用rake任务接收数据包时,将添加自定义delayed_job的。然后让delayed_job处理负载。你受益于delayed_job善良(不同队列,缩放......)。困难的部分是获得结果。

一个办法是将相关的每个作业一个唯一的ID,并有delayed_job的任务输出结果与结果相关的作业ID的数据存储至极。该数据存储可以是一个简单的关系表

+----+--------+ 
| ID | Result | 
+----+--------+ 

或memecache/Redis的/不管实例。您只需轮询该数据存储以查找与作业ID关联的结果。在完成向用户显示时删除所有内容。

3)你为什么不直接POST数据到轨服务器?

+0

对于选项3,我打算发布,但我需要确保该操作仅限于已批准的实体(或者我是否错过了某些内容?)。我会尝试本杰明的建议并重新报告。 – 2013-02-27 12:12:38

0

继本杰明的领导之后,我为此特定行为实施了一个过滤器。

def verify_ip 
    @ips = ['127.0.0.1'] 
    if not @ips.include? request.remote_ip 
    redirect_to root_url 
    end 
end 

在本地主机听音应用程序现在调用的动作,使从分析引擎作为PARAM接收的JSON包。谢谢。

相关问题