Предложения по поддержанию соединений с помощью списка файлов FTP через AJAX? - PullRequest
0 голосов
/ 17 декабря 2010

У меня есть многопользовательское веб-приложение Ruby on Rails, которое может взаимодействовать с FTP-сервером через AJAX.Приложение позволяет пользователю просматривать FTP-сайт.Javascript выполняет AJAX-вызов, который связывается с серверным скриптом, который возвращает список файлов и каталогов в данном каталоге.

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

Я мог бы сделать это, используя потоки (хотя я полностью открыт для других идей) или какое-то необычное соединениесхема объединения (возможно, с помощью демона, который управляет этим).

Какими способами я мог бы сохранить и восстановить ссылку на соединения в моем источнике ruby?

Кто-то предложил использовать «Connection: Keep»"Живой" заголовок, но я не понимаю, как это могло бы помочь в этом случае.

1 Ответ

1 голос
/ 17 декабря 2010

Не полный ответ, но если у вас есть какой-то демон или что-то, управляющее соединением, вы можете использовать TCP keepalive, чтобы поддерживать управляющее соединение в течение продолжительного периода времени.

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

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

В любом случае, я думаю, что источник медлительности больше связан с закрытием и повторным открытием управляющего соединения (и аутентификации) для каждого запроса. Я думаю, что если у вас есть какой-то процесс, который держит управляющее соединение открытым с использованием TCP keepalive (опция сокета SO_KEEPALIVE), вы увидите значительное улучшение.

...