10

안녕하세요. 백그라운드 처리를 위해 delayed_job을 사용합니다. I 8 CPU 서버, MySQL이 있고 I 7 delayed_job가여러 지연된 작업 잠금 테이블을 실행하는 레일

RAILS_ENV=production script/delayed_job -n 7 start 

Q1 처리 시작 : I가 궁금 가 2 개 이상인 delayed_job 공정은 동일한 프로세스 처리를 시작하는 것이 가능하다 (같은 기록 행을 데이터베이스 delayed_jobs). delayed_job 플러그인의 코드를 확인했지만 잠금 지시문을 찾을 수 없습니다 (잠금 테이블이 없거나 SELECT ... FOR UPDATE).

lock_by 열에서 UPDATE를 실행하기 전에 각 프로세스가 데이터베이스 테이블을 잠궈 야한다고 생각합니다. 그들은 단순히 locked_by 필드를 업데이트하여 레코드를 잠급니다 (UPDATE delayed_jobs SET locked_by ...). 정말 충분하니? 잠금이 필요하지 않습니까? 왜? 나는 UPDATE가 SELECT보다 높은 우선 순위를 가지고 있음을 알고 있지만,이 경우에는 효과가 없다고 생각한다. 엑셀 스레드 상황

나의 이해는 다음과 같습니다

Process1: Get waiting job X. [OK] 
Process2: Get waiting jobs X. [OK] 
Process1: Update locked_by field. [OK] 
Process2: Update locked_by field. [OK] 
Process1: Get waiting job X. [Already processed] 
Process2: Get waiting jobs X. [Already processed] 

내가 더 많은 일자리가 동일한 정보를 얻을 수 있으며, 동일한 프로세스 처리를 시작할 수 있습니다 경우에 따라서 생각합니다.

질문 2 : 7 delayed_jobs는 8CPU 서버에 적합한 번호입니까? 왜 예/아니오.

Thx 10x!

다음
self.class.update_all(["locked_at = ?, locked_by = ?", now, worker], ["id = ? and (locked_at is null or locked_at < ?)", id, (now - max_run_time.to_i)]) 

행의 업데이트는 수행, 다른 작업자가 이미 잠겨있는 경우 :

답변

11

나는 귀하의 질문에 대한 대답은 'lib 디렉토리/delayed_job/job.rb'라인 (168)에 생각 작업이 있으며 테이블이 갱신되면 점검됩니다. DBMS가 단일 쿼리의 실행이 다른 쿼리의 영향으로부터 격리되도록 보장하기 때문에 테이블 잠금 또는 유사 (앱의 성능을 크게 떨어 뜨릴 수 있음)는 필요하지 않습니다. 예제에서 Process2는 이전에 잠근 적이없는 경우에만 작업 테이블을 업데이트하므로 작업 X에 대한 잠금을 얻을 수 없습니다.

두 번째 질문은 다릅니다. 8 CPU 서버에서. 이 작업을 위해 헌신 된 8 명의 근로자가 좋은 시작점입니다. 왜냐하면 근로자는 단일 스레드이므로 모든 핵심에 대해 하나씩 실행해야하기 때문입니다. 설정에 따라 근로자가 많든 적든 더 낫습니다. 그것은 당신의 일에 크게 의존합니다. 복수 코어의 일자리를 얻으시겠습니까? 아니면 대부분의 시간 동안 외부 자원을 기다리고 있습니까? 다른 설정으로 실험 해보고 관련된 모든 리소스를 살펴보십시오.

+0

그래서 각 가공물은 원자 스타일의 공정이며 안전하다고 말하는 것입니까? – xpepermint

+0

내가 여기에없는 것은 SELECT ... FOR UPDATE입니다. ? – xpepermint

+0

쿼리는 원 자성입니다. 따라서 UPDATE 작업 SET locked_at = '..', locked_by = 1 어디에서 id = 12이고 (locked_at가 null이거나 locked_at < '..')'쿼리를 실행하면 locked_at 및 locked_by는 업데이트되지 않습니다. 다른 유효한 자물쇠. DBMS는 먼저 조건이 어디서 업데이트를 실행하고 그 사이에 행이 변경되지 않았는지 확인합니다. 따라서 기존 잠금을 ​​덮어 쓸 수 없습니다. – gregor

관련 문제