2009-08-18 4 views
0

Google 애널리틱스와 비슷한 것을 만들고 있는데 현재는 실시간 데이터베이스 업데이트를하고 있습니다. 여기에 내 응용 프로그램에 대한 워크 플로 :데이터베이스 업데이트를 레일즈에 연기하려면 어떻게해야합니까?

  1. 사용자는
  2. I 데이터베이스에서 사용자의 요청 카운터를 기록 (JSON으로 반환,
  3. 나는 데이터베이스에 레코드를 찾을 편안한 API 요청을한다 즉 사용자가 2 API 호출을하면 사용자의 요청 카운터가 '2'만큼 증가합니다.

1 및 2는 SQL에서 실제로 빠릅니다. 이것은 SELECT입니다. # 3은 UPDATE이기 때문에 실제로 느립니다. 현실 세계에서 내 데이터베이스 (MySQL)는 확장되지 않습니다. New Relic에 따르면, # 3은 대부분의 시간이 소요됩니다 - 최대 70 %!

제 생각에는 동기식 DB 작업을 중단해야한다는 것입니다. 단기적으로는 DB 쓰기를 줄이기 위해 노력하고 있으므로 전역 컨트롤러에서 사용할 수있는 전역 해시 (예 : environment.rb에 선언되어 있습니다)와 모델에 쓰기를 대신 할 수있는 모델을 생각하고 있습니다. DB. 모든 경우에 DB에 기록해야하는 업데이트를 작성할 수 있습니다.

질문 :

  1. 이 소리 합리적인합니까? 어떤 문제가 있니?
  2. 동시성 문제가 발생합니까?
  3. 로그를 파일 시스템에 쓰고 나중에 가져 오는 것과 어떻게 비교할까요?
  4. 대신 Starling과 같은 메시지 대기열 시스템을 사용해야합니까? 어떤 추천?

PS : 여기서 문제가되는 쿼리 - 관심의 모든 열이 색인 :

UPDATE statistics_api SET count_request = COALESCE (count_request?) +는? WHERE (id =?)

답변

0

DelayedJob으로 나중에 처리하십시오.

편집 : 당신의 DB가 하나의 UPDATE가 눈에 띄게 귀하의 요청을 아래로 둔화되고 너무 많이 충돌하는 경우, 어쩌면 당신은 마스터 - 슬레이브 데이터베이스 아키텍처를 설정하는 것이 좋습니다.

+0

링크를 업데이트 해 주셔서 감사합니다. ecoologic! –

1

해시 솔루션은 다소 복잡해 보입니다. http://www.slideshare.net/mattmatt/the-current-state-of-asynchronous-processing-with-ruby

  • 그들은 간단한 일이 될 것이다라고 : 슬라이드 세트는 당신의 문제 헤드를 해결하는 최신 자원 통찰력과 입니다

    Thread.new do 
        MyModel.do_long_thing 
    end 
    

    하지만 Ruby mysql 드라이버가 블로킹 중이므로 해당 스레드의 mysql 요청은 여전히 ​​요청을 차단할 수 있습니다. 드라이버로 mysqlplus을 사용하여 비 차단 요청을받을 수는 있지만 이제는 매우 복잡하고 전문적인 솔루션을 얻게되었습니다.

    당신은 정말 당신의 요청주기에서이를 원하지만 그것을 위해 서버를 잠금 마련 할 수있는, 당신은 같은 것을 할 수있는 경우 좀 더와 ApplicationController에 추상을 거라고

    MyController 
        after_filter :do_jobs 
    
        def index 
        @job = Proc.new{ MyModel.do_long_thing } 
        end 
    
    private 
    
        def do_jobs 
        return unleses @job 
        @job.call 
        end 
    
    end 
    

    을,하지만 당신은 얻을 아이디어. proc은 요청 이후까지 업데이트를 지연시킵니다.

    비동기식 백그라운드 프로세스을 심각하게 생각한다면 다양한 옵션을 살펴보고 필요한 사항을 결정해야합니다. Matt Grande는 DelayedJob을 추천했습니다. 지금 당장은 매우 인기가 있지만, 전체 서버가 데이터베이스 쓰기로 어려움을 겪고 있다면, 제안하지 않을 것입니다. 이 업데이트가 특히 느린 업데이트이지만 서버에 과부하가 걸리지 않으면 좋은 해결책 일 수 있습니다.

    저는 현재 가장 복잡한 프로젝트에서 Starling과의 작업을 사용합니다. Workling은 꽤 확장 성이 있지만 Starling은 이상적이지 않습니다. Workling의 장점 중 하나는 백엔드를 교환 할 수 있기 때문에 큰 문제가되는 경우 Starling에서 제외 할 수 있습니다.

    서버에 쓰기가 어려움이있는 경우 비동기 작업 방식에 관계없이 크기를 조정해야합니다.

    행운을 빈다. 흥미 진진한 속도로 앱이 성장하고있는 것 같습니다.

관련 문제