2010-04-30 2 views
0

저는 Net :: FTP 라이브러리를 사용하는 Ruby 웹 응용 프로그램을 만들고 있습니다. 그것의 한 부분은 사용자가 AJAX를 통해 FTP 사이트와 상호 작용할 수있게합니다. 사용자가 무언가를하고 AJAX 호출이 이루어지면 Ruby는 FTP 서버에 다시 연결하고, 작업을 수행하고, 정보를 출력합니다.AJAX를 통해 사용할 세션 변수를 통해 FTP 연결을 캐싱 하시겠습니까?

AJAX 호출이있을 때마다 Ruby는 FTP 서버에 다시 연결해야하며 느립니다. 이 FTP 연결을 캐시 할 수있는 방법이 있습니까? 나는 세션 해쉬에서 캐싱을 시도했지만, "미안합니다.하지만 뭔가 잘못되었습니다"라고 표시되고 세션 해시에 저장하려고 할 때마다 TCP 덤프가 로그에 출력됩니다. 나는 아직 memcache를 시도하지 않았다.

제안 사항?

+0

나는 다른 질문에 대답하고 나서 그것을 삭제했다. 나는 여기에 초에 게시 할 것이다. – gtd

+0

죄송합니다. –

답변

1

일 수 있지만 사소한 것은 아니지만 Rails는 기본 제공 기능을 제공하지 않습니다. 사실이 작업을 수행하려면 OS 레벨로 내려와야하며 둘 이상의 물리적 서버가있는 경우 훨씬 복잡해집니다.

먼저 세션에 연결을 저장할 수 없습니다. 사실 당신은 다음과 같은 여러 가지 이유로 세션에있는 루비 객체를 저장하지 않으 이에 국한되지 다음 경우 물건을 깰 수있는 문제가 정렬 화되고있는 객체의

  • 일부 유형/비 정렬 화
  • 배포 이 모델 변경 사람들은
  • 당신이 쿠키 세션 저장소를 사용하는 경우에 당신은 일반적으로 그래서 4K

, 당신은 오직 문자열, 숫자 및 부울 같은 프리미티브를 넣어 원하는가 자신의 세션에서 연재 물건을 outdates 세션으로

지금까지 FTP 연결에 관한 한,이 문제는 직렬화/직렬화를 확실하게 할 수없는 범주로 분류됩니다. 이유는 루비 객체 일뿐만 아니라 원래 객체가 가비지 수집되는 즉시 닫힐 소켓을 가지고 있기 때문입니다.

따라서 FTP 연결을 영구적으로 유지하려면 컨트롤러 인스턴스가 요청 당이기 때문에 컨트롤러 인스턴스 변수에 저장할 수 없습니다. 컨트롤러 인스턴스 외부에서 인스턴스화를 시도 할 수는 있지만, 연결을 정리하는 데 매우 신중하지 않으면 메모리 누출 가능성이 있습니다. 게다가 둘 이상의 app 서버 인스턴스가있는 경우 사용자가 각 요청에 대해 동일한 앱 서버 인스턴스와 통신하도록 보장하는 방법을 찾거나 후크를 찾을 수 없습니다. 그래서 결국 Ruby 프로세스에서 세션을 열어 두는 것이 비 스타터입니다.

루비 프로세스가 말할 수있는 별도의 프로세스로 연결을 열어야합니다. 실제로 그렇게 할 수있는 표준 및 표준 방법이 없기 때문에 자신 만의 롤을 만들어야합니다. DRb을 살펴보고 필요한 기본 요소 중 일부를 제공 할 수 있습니다.

+0

멋진 정보. 분명히 이것은 사소한 일이며 시간이 걸릴 것입니다. 그래서 저는 이것을 지금 백 버너에 넣어야 할 것입니다. 나중에 다시 돌아가서 DRb를 살펴보고 조금 후에 맞춤형 솔루션을 살펴 보겠습니다. 감사! –

1

AJAX는 FTP와 직접 대화 할 수 없습니다. 그것은 HTTP 용으로 설계되었습니다. 그렇다고해서 FTP 서버를 캐시하는 작업을하지는 않습니다. 정말 느린 것을 찾아 내기 위해 그것을 프로파일 링해야합니다. 내 생각 엔 FTP 액세스가 느린 것 같습니다. 캐싱은 혼합 된 축복이 될 수 있습니다. ftp 사이트의 내용이 언제 변경되는지 어떻게 알 수 있습니까?

+0

AJAX는 FTP와 통신하지 않는다는 것을 알고 있습니다. 나는 Rails 컨트롤러와 Ruby를 자바 스크립트의 프록시로 사용하고있다. 그것은 단지 캐시하려는 TCP 연결 일뿐입니다. 바라건대 당신이 말하는 것처럼 서버가 느려지 길 바랍니다. –

관련 문제