1

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

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

2) 第二种方法是让监听应用程序将包转储到一个特殊的数据库表中。Rails 服务器会定期检查该表是否有新的包。一旦检测到一个或多个,它将​​处理它们并将它们从表中删除。

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

谢谢你。

4

3 回答 3

0

您可以通过限制 routes.rb 中请求允许的主机名来限制对某个调用的访问

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

如果您希望用户看到更新,您可以使用轮询每隔一分钟左右刷新一次页面。

于 2013-02-27T09:48:06.853 回答
0

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

  1. 您的 zeroMQ 应用程序提供了在 rails 端进行身份验证和授权所需的数据
  2. 您的 rails 应用程序配置为仅侦听 127.0.0.1 接口,因此无法从外部访问
  3. 就像本杰明建议的那样,您将特定路由限制为特定 IP

2) 这种方法看起来很像delayed_job 所做的。您可能想看看那里:https ://github.com/collectiveidea/delayed_job并使用 rake 任务添加新工作。

简而言之,您的监听应用程序将调用一个 rake 任务,该任务将在接收数据包时添加一个自定义的延迟作业。然后让delayed_job 处理负载。您受益于delayed_job 的优点(不同的队列、扩展......)。困难的部分是得到结果。

一种想法是将唯一的 ID 与每个作业相关联,并让 delay_job 任务将结果输出到数据存储中,该数据存储将作业 ID 与结果相关联。这个数据存储可以是一个简单的关系表

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

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

3)为什么不直接将数据发布到rails服务器?

于 2013-02-27T11:33:42.867 回答
0

在 Benjamin 的带领下,我为这个特定的动作实现了一个过滤器。

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

localhost 上的监听应用程序现在调用该操作,将从分析引擎接收到的 JSON 包作为参数传递。谢谢你。

于 2013-02-28T14:00:06.847 回答