2015-01-23 3 views
3

두 개의 작업자를 사용하도록 구성된 Puma 서버가 있으며 각각 16 개의 스레드가 있습니다. 그리고 푸마를 사용하여 스레딩을 허용하도록 config.threadsafe!을 사용 중지했습니다.레일 - 퓨마 작업자와의 동시성 문제

이제 코드가 있는데, 거기에 상수로 Mutex을 사용해도 threadsafety를 사용하지 않을 것입니다. 동시성 문제를 피하기 위해이 코드를 한 번에 하나의 푸마 스레드 만 실행하도록하고 Mutex을 사용합니다.

자, 내 질문은,

  1. Mutex는 퓨마 스레드를 사용하는 동안 여러 노동자, threadsafety를 주입하기 위해 노력합니까? 내가 알기에, 작업자는 별도의 프로세스이므로 뮤텍스는 작동하지 않습니다.
  2. Mutex가 위와 같이 작동하지 않는 경우 perticular 코드에서 threadsafety를 사용하는 방법은 무엇입니까?

코드 예제

class MyService 
    ... 
    MUTEX = Mutex.new  
    ... 

    def initialize 
    ... 
    end 

    def doTask 
    MUTEX.synchronize do 
     ... 
    end 
    end 
end 

답변

1

MUTEX 것은 나를 위해 일하지 않았다, 그래서 다른 방법을 찾아야합니다. 아래 해결책을 참조하십시오.

문제는 Diff. 푸마 스레드는 동시에 외부 원격 API에 요청을하고 있으며 때로는 원격 API가 응답하는 데 시간이 걸리는 경우가 있습니다.

전체 API 요청 수를 제한하고 싶었지만 위의 이유로 인해 작동하지 않았습니다. 내가 요청이 외부 API에 보낼 때 내가 in-pogress 같은 새 항목을 작성하는 DB 테이블을 만든

  • 이 문제를 해결하려면

    .
  • 그 API가 다시 응답하면, 내가 외부 API에 대한 새 요청을하기 전에 in-progress을 가진 총 요청을 확인하고 processed
  • 등의 항목을 업데이트합니다.

이렇게하면 시스템에서 외부 API로 보내는 요청의 총 수를 제한 할 수 있습니다.