Кэшировать FTP-соединение через переменные сеанса для использования через AJAX? - PullRequest
0 голосов
/ 30 апреля 2010

Я работаю над веб-приложением Ruby, которое использует библиотеку Net :: FTP. Одна его часть позволяет пользователям взаимодействовать с FTP-сайтом через AJAX. Когда пользователь что-то делает, и выполняется вызов AJAX, а затем Ruby повторно подключается к FTP-серверу, выполняет действие и выводит информацию.

Каждый раз, когда выполняется вызов AJAX, Ruby приходится переподключаться к FTP-серверу, и это медленно. Есть ли способ я могу кешировать это FTP-соединение? Я пробовал кэшировать в хеше сеанса, но отображается сообщение «Извините, но что-то пошло не так», и дамп TCP выводится в мои журналы всякий раз, когда я пытаюсь сохранить его в хэше сеанса. Я еще не пробовал memcache.

Есть предложения?

Ответы [ 2 ]

1 голос
/ 30 апреля 2010

То, что вы пытаетесь сделать , возможно , но далеко не тривиально, и Rails не предлагает никакой встроенной поддержки для него. На самом деле вам нужно будет опуститься до уровня ОС, чтобы сделать это, и если у вас есть более одного физического сервера, это будет еще сложнее.

Во-первых, вы не можете сохранить соединение в сеансе. На самом деле вы не хотите хранить какой-либо объект Ruby в сеансе по многим причинам, включая, но не ограничиваясь:

  • Некоторые типы объектов испытывают трудности с маршалированием / демаршалированием
  • Развертывание может привести к поломке, если модель изменится, и у людей будут устаревшие материалы, сериализованные в их сеансе
  • Если вы используете хранилище сеансов cookie, то у вас есть только 4k

Так что в общем случае вы когда-либо хотите помещать примитивы, такие как строки, числа и логические значения, в сессию.

Теперь, что касается FTP-соединения, это относится к категории вещей, которые нельзя сериализовать / не сериализовать надежно. Причина в том, что это не просто объект Ruby, но также открытый сокет, который будет закрыт, как только исходный объект будет собран мусором.

Таким образом, чтобы поддерживать постоянное FTP-соединение, оно не может быть сохранено в переменной экземпляра контроллера, так как экземпляр контроллера предоставляется для каждого запроса. Вы можете попытаться создать его где-нибудь за пределами экземпляра контроллера, но это может привести к утечкам памяти, если вы не очень осторожны в очистке соединений, и, кроме того, если у вас более одного экземпляра сервера приложений, вам также понадобится чтобы найти способ гарантировать, что пользователь обращается к одному и тому же экземпляру сервера приложений при каждом запросе, иначе он не сможет найти ловушку. Так что, в целом, поддержание открытого сеанса в процессе Ruby не является началом.

Что вам нужно сделать, так это открыть соединение в отдельном процессе, с которым может общаться любой из процессов ruby. Там действительно нет установленного и стандартного способа сделать это, вам придется свернуть свой собственный. Вы можете заглянуть в DRb , чтобы найти некоторые примитивы, которые вам понадобятся.

1 голос
/ 30 апреля 2010

AJAX не может напрямую общаться с FTP. Он предназначен для HTTP. Это не мешает вам писать что-то, что действительно кэширует FTP-сервер. Вы, вероятно, должны профилировать это, чтобы узнать, что действительно медленно. Я предполагаю, что доступ к FTP очень медленный. Кеширование может быть смешанным благословением. Как вы узнаете, когда меняется содержимое FTP-сайта?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...