2016-07-11 4 views
2

: 비동기식 큐 어댑터는 실제로 어떤 작업을 수행합니까?레일 비동기 활성 작업은 코드를 실행하지 않습니다. 인라인은 수행합니다.

: 레일 4의 기본 기능인 인라인은 현재 실행 스레드에서 ActiveJob, 어 ... 인라인으로 작성된 작업을 처리합니다. 비동기, 안됩니다. ConnectionPool을 사용하여 현재 스레드에서 실행하지 않아야하며 이상적으로는 어떤 일이 발생하는지 알 수 있습니다. 현재 실행 스레드 외부에서 수행 할 것입니다.

하지만 아무 것도 실행하지 않습니다.

필자는 문서를 훑어 보았습니다. 비할 바는 인라인과 달리 작업을 실행하지 않으며 실행을 중심으로 시스템을 구축 할 것을 기대합니다. 모든 작업에 로컬로 실행되도록하려면 수동으로 perform을 수행해야합니다. 어댑터를 인라인으로 설정하면 실행할 필요없이 잘 작동합니다.

비동기가 올바로 작동하지 않는 구성 문제가 있습니까 (예 : ActionCable?).

레이크 작업 (또는 콘솔?)에서 실행하면 작동하지 않습니까?

sidekiq/: resque와 같이 작동하지만 항상 로컬로 실행하고 싶지 않습니다.

Rails by default comes with an "immediate runner" queuing implementation. That means that each job that has been enqueued will run immediately.

이 뭔가 잘못되는 날 큐잉 무슨의 일종이다. 나는 대기열에 앉아 있어도 실행되지 않는 작업이 있습니다. 이걸 막을 수 있니?

답변

4

이것은 내가 발견 한 것입니다. concurrent-ruby의 출현으로, 레이크 작업이이 문제를 처리하도록 설정되지 않았습니다.

설명서를 읽으면 :async으로 표시되며 프로세스가 끝나면 메모리가 비워집니다.

레일 자체는 처리 중 대기 시스템 만 제공하며 은 RAM에 작업을 유지합니다. 프로세스가 충돌하거나 시스템이 재설정 된 경우 은 기본 비동기 백엔드에서 모든 미해결 작업이 손실됩니다.

레이크 프로세스가 끝나면 종료됩니다. 따라서 데이터 변경 작업을 수행하는 경우 갈퀴 작업이 길게 열려서 :inline을 실행하지만 :async이 아닌 것은 실행할 수 있습니다.

그럼, 뭔가를 실행하기에 충분히 오랫동안 갈퀴 작업을 열어 두는 해결책을 찾지 못했습니다. (전체 시간에 :async을 계속 유지하십시오). 작업을 실행하려면 :inline으로 바꿔야하고 나머지 작업은 끝내면 :async으로 돌아 가야합니다. 그것은 :sidekiq 또는 :resque으로 잘 작동하는 이유입니다. 이러한 응용 프로그램은 작업 정보를 메모리에 보관하고 레이크 작업이 끝나면 해제하지 않기 때문입니다. 레이크 작업 로컬 :async와 함께 작동하기 위해서는

, 당신이 (작업 주자로) 레이크까지 지역 있다면 당신은 :inline으로 실행 작업 이외의 작업을 수행 할 수 있습니다 많지 않다 비동기 작업을하였으나 영업을하는 방법을 이해 시작 (또는하지 않음).개발 전용 기능으로, 이것은 실제로 최우선 순위는 아니지만 작업을 실행하는 기본 작업으로 왜 :async이 실제로 실행되지 않는지 이해하지 못하는 표를 두드리는 경우 그 이유가됩니다.

+0

@januszm 기쁜 약간의 도움을 얻을 수 있습니다. – tadiou