2016-10-04 4 views
7

사용자가 이벤트를 평가할 수 있도록하는 틴더 스타일 앱이 있습니다. 사용자가 이벤트를 평가 한 후에는 사용자의 피드백을 기반으로 다른 이벤트를 다시 순위 지정하는 백그라운드 재 작업이 실행됩니다.Rails & Heroku : 얼마나 많은 작업자/다이노 스가 필요합니까?

이 백그라운드 작업은 약 10 초가 걸리고 사용자 당 분당 약 20 회 실행됩니다.

간단한 예를 사용하십시오. 특정 시점에 10 명의 사용자가 앱을 사용하고 있고 대기중인 것을 원치 않는 경우 어떻게해야 최적의 방법일까요?

Dynos, resque pools 및 redis 연결에 대해 혼란스러워합니다. 다른 사람이 그 차이를 이해하도록 도와 줄 수 있습니까? 이것을 계산할 방법이 있습니까?

+0

사용자가 1 분에 20 번 작업을하는 이유는 무엇입니까? 사용자가 이벤트를 순위 매기기 만하면 실행되지 않는 이유는 무엇입니까? – toddmetheny

+0

그게 정확히 무엇입니까, 사용자가 그들을 통해 스 와이프하여 "순위"20 분당 이벤트 ("좋아하는"또는 "싫어하는 것") –

답변

4

올바른 질문을하고 있는지 확실하지 않습니다. 당신의 진짜 질문은 "어떻게하면 더 나은 성능을 얻을 수 있습니까?"입니다. "얼마나 많은 dynos가 아닌가?" dynos를 추가하는 것만으로도 더 나은 성능을 제공하지는 않습니다. 더 많은 다이노스가 더 많은 메모리를 제공합니다 ... 따라서 사용 가능한 메모리가 부족하여 앱이 느리게 실행되는 경우 (예 : 스왑에서 실행중인 경우), 더 많은 다이노 스가 답이 될 수 있습니다. 만약 그 일이 각각 10 초씩 걸린다면 ... 아마도 기억은 실제 문제가 아닙니다. 메모리 사용량을 모니터링하려면 New Relic과 같은 시각화 도구를 확인하십시오.

문제를 해결하는 데 많은 방법이 있습니다. 하지만 당신이 작성한 코드부터 시작하겠습니다. SO에 코드를 게시하면 그 작업이 10 초 걸리는 이유를 이해하는 데 도움이 될 수 있습니다 (코드 게시)! 10 초는 오래 걸립니다. 따라서 해당 작업 내에서 쿼리를 최적화하면 거의 확실하게 도움이됩니다.

낮은 교수형 과일의 또 다른 조각 ... 배경 작업을 위해 resque에서 sidekiq로 전환하십시오. 정말 사용하기 쉽습니다. 메모리 사용량이 적어지고 성능이 급격히 상승합니다.

+1

자세한 내용을 알고 있으므로 다른 질문을 게시 할 것입니다. 감사! –

+0

다음은 문제의 철저한 게시물입니다. http://stackoverflow.com/questions/40115387/rails-heroku-and-resque-long-running-background-job-optimization/40115470#40115470 –

0

다이노스 : 이는 개별 가상/물리적 서버입니다. EC2 인스턴스와 동일하다고 생각하십시오.

Redis Connections : Redis 인스턴스에 대한 개별 연결입니다.

Resque Pool : 동일한 dyno/instance에서 동시에 작업자를 실행할 수있게 해주는 보석.

+0

그래서 내가 내 대기열에 너무 많은 작업이 있다는 것을 알게되면, 더 많은 dynos 또는 redis 연결 또는 다른 뭔가? –

+0

작업이 백업중인 경우 해당 작업자에 대해 dyno 수를 올릴 필요가 있음을 수정하십시오. 당신은 또한 당신이 가진 노동자의 수를 처리 할 수있는 redis 인스턴스가 있는지 확인해야합니다. –

0

우선, 작업 자체의 성능을 향상시킬 수있는 방법을 찾아 볼 가치가 있습니다. 로우 레벨 모델 캐싱을 사용하거나 알고리즘을 최적화하여 10 초 이내에 얻을 수 있습니다.

필요한 근로자 수를 계산할 때 사용자 수 (10)을 실행하는 데 걸리는 시간 (초)을 20 분으로 계산해야합니다. . 그러면 한 명의 작업자를 실행하는 데 걸리는 분당 시간 (초)이 표시됩니다. 20 * 10 * 10 = 2000. 60으로 나누면 분당 분 수는 33.3입니다. 그래서 당신이 34 명의 근로자를 갖고 있고,이 숫자가 모두 일치한다면, 그들은 계속 일을 계속할 수 있어야합니다.

그렇다면 순위 알고리즘을 위해 단지 10 명의 동시 사용자를 대상으로 36 개 이상의 다이노스를 실행해야하는 위치에 있어서는 안됩니다. 그것은 매우 비싸게 될 것입니다.

알고리즘을 최적화하고 더 많은 캐싱을 추가하고 Sidekiq에 시도해보십시오. 내 경험상, Sidekiq는 Resque보다 10 배 빠른 대기열을 처리 할 수 ​​있습니다. 그것은 당신의 직업이하는 일과 당신이 각 도구를 어떻게 활용하는지에 달려 있지만 체크 아웃 할 가치가 있습니다. Sidekiq vs Resque을 참조하십시오.

+0

고마워, 내가 살펴볼 게. –

0

다른 이벤트의 순위를 재 지정하는 것은 좋지 않습니다.

이벤트 테이블의 total_points 및 average_points 열을 고려하고 순위에 따라 순위를 결정할 수 있습니다. 이렇게

class Event 
    has_many :feedbacks 

    scope :rank_by_total, -> { order(:total_points) } 
    scope :rank_by_average, -> { order(:average_points) } 
end 

class Feedback 
    belongs_to :event 
    after_create :update_points 

    def update_points 
     total = event.feedbacks.sum(:points) 
     avg = event.feedbacks.average(:points) 
     event.update(total_points: total, average_points: avg) 
    end 
end 

그래서, 얼마나 많은 노동자/동력계는 당신이 필요합니까?

이 문제에 대해 dyno 나 worker에 대해 걱정할 필요가 없습니다. 처리 능력이 높은 dynos를 얼마나 많이 사용하더라도 이벤트 테이블이 커지면 솔루션의 시간이 오래 걸릴 것입니다. 따라서 내가 설명한대로 솔루션을 변경해보십시오.

+0

하지만 이벤트 순위는 맞춤 설정되어 있습니다. 각 사용자에게 그것은 인기가 아니며, 그들이 좋아했던 과거의 이벤트를 기반으로 특정 사용자와의 관련성이 있습니다. –

+0

내 아이디어는 다음과 같습니다. 이벤트 has_many event_rankings 및 event_ranking belongs_to user. 그래서 각 사용자는 자신의 이벤트 순위를 가지고 있습니다 ... –