안녕하세요. 백그라운드 처리를 위해 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)])
행의 업데이트는 수행, 다른 작업자가 이미 잠겨있는 경우 :
그래서 각 가공물은 원자 스타일의 공정이며 안전하다고 말하는 것입니까? – xpepermint
내가 여기에없는 것은 SELECT ... FOR UPDATE입니다. ? – xpepermint
쿼리는 원 자성입니다. 따라서 UPDATE 작업 SET locked_at = '..', locked_by = 1 어디에서 id = 12이고 (locked_at가 null이거나 locked_at < '..')'쿼리를 실행하면 locked_at 및 locked_by는 업데이트되지 않습니다. 다른 유효한 자물쇠. DBMS는 먼저 조건이 어디서 업데이트를 실행하고 그 사이에 행이 변경되지 않았는지 확인합니다. 따라서 기존 잠금을 덮어 쓸 수 없습니다. – gregor