加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Rails延迟作业:SSH连接池

发布时间:2020-12-16 21:00:09 所属栏目:百科 来源:网络整理
导读:现在的情况: 我有一个有N个延迟工作的铁路应用程序.每当我想向某台机器发送SSH请求时,我都会为该工作者创建一个任务.工人执行类似的事情: Net:SSH.start(hostname,username,:password = pass) do |ssh| ssh.exec!(command)end 有时我创造例如50个这样的任
现在的情况:
我有一个有N个延迟工作的铁路应用程序.每当我想向某台机器发送SSH请求时,我都会为该工作者创建一个任务.工人执行类似的事情:
Net:SSH.start(hostname,username,:password => pass) do |ssh|
  ssh.exec!(command)
end

有时我创造例如50个这样的任务要一个接一个地执行,或者彼此在5-10分钟之内执行.在这种情况下,每个任务都会打开单独的连接,这种连接无效,有时由于连接太多而被目标服务器阻止.

我想要的:打开连接存储在某处并由每个工作人员重用.这样每个工人都会以某种方式获得连接,然后才能运行

ssh.exec!(command)

我尝试过的:

>在文件/数据库/缓存中存储连接看起来是不可能的,因为它们不可序列化
>尝试使用具有在初始化器下实例化的全局变量的单例类.但是,每个worker的类对象都不同(后来发现全局变量不能作为选项).

有办法解决吗?还有其他想法吗?谢谢!!

解决方法

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

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

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

您需要的是一个存储SSH会话的主进程,然后等待传入的消息,这些消息是需要在其中一台远程SSH机器上执行的命令.

就个人而言,我只是自己编写一个简单的线程Ruby守护程序进程来处理这个任务.如果您不想直接处理套接字编程,可以使用类似EventMachine的东西来处理通信和处理.

如果您对EventMachine或套接字编程不满意,那么您可以查看一些消息系统,如RabbitMQ或
ZeroMQ用你的客户端和服务器创建.

我还为Rails找到了一些名为ActiveMessaging的东西,虽然我不确定该项目的最新和有效性.

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

如果您实现类似的功能,请记住考虑安全性因素.否则,您可以通过守护进程轻松地授予任何人对所有远程计算机的SSH访问权限.

编辑

一个更简单的想法:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读