2013-08-30 4 views
1

URL이 status 200 인 경우 알려주는 서비스를 만들고 싶습니다. 현재 sidekiq 근로자를 사용 중입니다. status == 200 일 경우 데이터베이스 (row.available = true)를 업데이트하고 예외가 발생하면 n seconds, n amount of times으로 작업자를 다시 시도합니다.URL이 존재하는지 반복적으로 확인합니다.

이 작동하지만, 그것은 (1000 수표 예외 1000 년대에 나쁜 소식이 특정 플랫폼에 초래 - JRuby를) 효율적인 또는 확장 생각하지 않고, 내가 만들 수있는 방법이 있는지 해요 sidekiq에 의존하지 않는 URL 모니터링을 관리하는 내부 서비스 (Go 또는 다른 Ruby gem에서 가능). 그러나 어디서부터 시작해야할지 모르겠으므로 일반적인 방향을 고맙게 생각합니다.

+1

'GET'요청 대신 'HEAD'를 수행하여 확실히 저장할 수 있습니다. 아직 수행하지 않은 경우라면 가능합니다.예 :'Net :: HTTP.start ('example.com') {| http | http.head ('/')} .code' –

+0

고마워요. 나는'Faraday.head()'를 사용하고 있습니다. –

답변

2

간단한 링크 검사기를 작성하고 실행하는 것은 쉽습니다. 이중화없이 1000s의 링크를 신속하게 처리하고 전체 시스템을 허비시키지 않으면 서 죽거나 응답이 느린 링크를 처리하는 것이 더 어려워집니다.

  1. 는 데이터베이스에서 읽는 디스패처 스레드 :

    나는 세 개의 스레드, 플러스 두 개의 큐를 사용하십시오. "확인할 것"대기열에 체크인 할 URL을 찾고 대기열에 넣습니다.

  2. 첫 번째 큐에서 소비 한 결과를 "업데이트 된 URL 결과"큐에 넣는 작업자 스레드입니다.
  3. # 2의 스레드 결과를 가져 와서 데이터베이스를 업데이트하는 업데이터/소비자 스레드입니다.

루비 일부 내장 클래스가 도움이 : 내가보기 엔 중간 스레드에서 사용 Typhoeus and Hydra을 권하고 싶습니다

. 이 두 클래스에 대한 문서는 병렬로 실행되는 여러 스레드를 처리하는만큼 많은 작업을 처리합니다.

은 Rails 애플리케이션의 일부로이 코드를 작성하지 않습니다. Rails가 추가 한 가치는 없으며 필요하지도 않습니다. 기존의 database.yaml 설정과 모델에 액티브 레코드와 피기 백이 필요하거나 Rails' "runner"을 사용하여 코드를 레일스 코드의 보조 도구로 실행하십시오.

또는 Rails 서버가 느려지지 않도록 다른 서버에서 실행하기 위해 작은 응용 프로그램 별 코드를 작성합니다. MySQL이나 PostgreSQL 드라이버를 사용하면 Rails가 사용하는 것과 동일한 데이터베이스와 대화 할 수 있습니다. 이 경우 ORM으로 작동하려면 Sequel 보석을 사용 하겠지만 액티브 레코드보다 선호하기 때문입니다.

실패한 URL의 재 시도, 리디렉션 감지 및 소스 URL 업데이트를 포함하여 시간 낭비를 방지하고 호스트 서버의 성능을 저하시키지 않으므로이 코드를 작성할 때 고려해야 할 사항이 많이 있습니다. 금지.

나는 몇 년 동안이 목적을 위해 몇 가지 응용 프로그램을 작성했으며 올바른 작업을 수행하는 데 많은주의를 기울 였으므로 나중에 디자인을 생각해보십시오. 그렇지 않으면 나중에 주요 재 작성이 끝날 수 있습니다.

+0

대단히 감사합니다. 나는 이것을 고려할 것이다. –

관련 문제