首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails +延迟作业: SSH连接池

Rails +延迟作业: SSH连接池
EN

Stack Overflow用户
提问于 2013-12-13 19:58:17
回答 1查看 774关注 0票数 5

当前情况:我有一个rails应用程序,有N个延迟的工作人员。每当我想向某些机器发送SSH请求时,我都会为工作人员创建一个任务。工作人员执行以下操作:

代码语言:javascript
复制
Net:SSH.start(hostname, username, :password => pass) do |ssh|
  ssh.exec!(command)
end

有时我会创建50个这样的任务,一个接一个地完成,或者在5-10分钟内完成。在这种情况下,每个任务都会打开单独的连接,这是无效的,有时由于连接太多而被目标服务器阻止。

我想要的:已经打开了存储在某个地方的连接,并被每个工作人员重用。以便每个员工都能以某种方式获得连接,然后运行

代码语言:javascript
复制
ssh.exec!(command)

我已经尝试过的

  • 在文件/数据库/缓存中存储连接似乎是不可能的,因为它们是不可序列化的
  • 尝试使用在初始化器下实例化全局变量的单例类。但是,类对象对于每个工作人员是不同的(稍后发现全局变量不能是一个选项)。

有办法解决这个问题吗?还有其他想法吗?谢谢!!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-13 21:35:27

首先是一些基础知识;一个SSH连接的核心是一个到远程计算机的低级套接字连接。进程之间不能(很容易)共享套接字。因此,在多个进程上运行的东西不能共享相同的SSH连接。

接下来,您需要知道当前设置中的哪些部分在单独的进程中运行。我们得到的是:

  1. Rails在大多数情况下都是基于流程的:在不同的进程上运行单独的web请求。因此,在Rails应用程序中存储SSH连接并不是一个可靠的解决方案。
  2. 据我所知,延迟工作也是基于过程的.主进程启动从进程来处理每个作业。因此,DJ也没有为此目的工作。

您需要的是一个存储SSH会话的主进程,然后等待需要在您的远程SSH计算机上执行的命令传入的消息。

就我个人而言,我只需要自己编写一个简单的线程Ruby守护进程来处理这个任务。如果您不想直接处理套接字编程,可以使用像EventMachine这样的工具来处理通信和处理。

如果您不习惯使用EventMachine或套接字编程,那么您可以查看一些消息传递系统,如RabbitMQZeroMQ来创建您的客户端和服务器。

我还为Rails找到了名为ActiveMessaging的东西,尽管我不知道该项目的当前和工作情况如何。

但就像我说的,我认为最简单的实现只是一个socket守护进程,它在后台运行,跟踪打开的SSH连接,然后监听Rails应用程序中的命令。

如果您实现了这样的东西,请记住也要考虑到安全性考虑。否则,您可以轻松地让任何人通过守护进程访问所有远程计算机。

编辑

一个更简单的想法:

只要有一个守护进程定期从Rails应用程序中读取数据库表中的命令即可。然后,这个守护进程可以根据它在这个“作业队列”表中找到的内容执行这些命令。这种方式根本不需要处理套接字通信,缺点是这个解决方案是轮询解决方案。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20574921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档