2011-01-13 4 views
9

하늘색에서 SQL Azure 데이터베이스에서 일부 데이터 처리를 수행하는 간단한 작업 역할을가집니다. 작업자는 기본적으로 타사 데이터 소스의 데이터를 2 분마다 데이터베이스에 추가합니다. 역할의 인스턴스가 두 개인 경우이 작업이 불필요하게 두 배가됩니다. 이중화와 99.95 가동 시간에 대해 2 개의 인스턴스를 갖고 싶지만 동일한 작업을 복제 할 때 동시에 두 프로세스를 처리하지 못하게해야합니다. 내가 누락 된 표준 패턴이 있습니까? 데이터베이스에 플래그를 설정할 수 있다는 것을 알고 있지만 이것을 관리하는 또 다른 쉽고 더 좋은 방법이 있기를 바랍니다. 감사합니다.여러 인스턴스에서 하늘색 작업자 역할 동시성 제어

+1

글쎄, 한 번에 하나의 클라이언트 만 메시지를 읽을 수 있기 때문에 Azure 큐에 트리거 메시지를 넣을 수 있습니다. 그러나 이것은 처음에 메시지를 만드는 방법에 대한 질문을 제기합니다. 일정한 간격으로 작업자 역할에서 수행하는 경우 동일한 동시 작업자 역할이 거의 동시에 같은 메시지를 보내므로 동일한 문제가 다시 발생합니다. 나는 어떤 종류의 세마포어를 포함하지 않는 이것에 대한 해결책을 생각할 수 없다. –

답변

7

마크가 제안했듯이, Azure 큐를 사용하여 메시지를 게시 할 수 있습니다. 작업자 역할 인스턴스가 현재 메시지를 처리 ​​할 때 수행하는 마지막 작업으로 큐에 대한 후속 메시지를 게시하게 할 수 있습니다. 세마포어에 대한 필요성과 관련하여 Mark가 제기 한 이슈를 다루어야합니다. 대기열 메시지에서 메시지를 처리 ​​할 수있을 때 타임 스탬프 마킹을 내장 할 수 있습니다. 새 메시지를 작성할 때 현재 시간에 2 분을 추가하기 만하면됩니다.

... 명백하지 않은 경우 : 작업자 역할 인스턴스가 처리를 완료하기 전에 충돌하고 새 대기열 메시지를 다시 게시하지 못하는 경우에는 문제가 없습니다. 이 경우 현재 대기열 메시지는 대기열에 다시 나타나고 다른 인스턴스는 처리 할 수 ​​있습니다.

+1

포이즌 메시지 필터를 구현했는지 확인하십시오. 특정 메시지로 인해 작업자 역할이 중단되는 경우 큐에 계속해서 다시 게시하지 않으려는 경우입니다. 재 게시 횟수 (또는 읽기 횟수)가 도움이 될 수 있습니다. – tijmenvdk

+0

@tijmenvdk - 합의. –

+2

어떻게이 영구 기계를 시작 하시겠습니까? 동시에 두 개의 역할 인스턴스가있는 경우 어떤 메시지를 게시해야합니까? –

0

이렇게하는 것이 쉬운 방법이 아닙니다. 저는 생각하지 않습니다.

Mark가 언급 한대로 세마포를 사용할 수 있습니다. 기본적으로 처리의 시작과 중지를 기록합니다. 그런 다음 세마포어 레코드를 검사하고 세마포어가 허용하는 경우에만 각각 실행하는 인스턴스를 실행할 수 있습니다.

그러나 여기서주의해야 할 점은 처리 중에 인스턴스 중 하나가 충돌하고 절대로 해당 세마포어를 해제하지 않으면 어떻게됩니까? X 제한 시간 동안 잠금이 해제되지 않은 경우 다른 인스턴스가 처리를 시작하려고 시도한 후 "제한 시간"값을 구현할 수 있습니다.

AzureWatch과 같은 타사 모니터링 서비스를 사용하여 Azure에서 응답하지 않는 인스턴스를 감시하고 "준비"인스턴스 수가 1 미만인 경우 새 인스턴스를 시작할 수 있습니다. 이렇게하면 절약 할 수 있습니다. 2 개의 인스턴스를 항상 실행해야하지만 인스턴스가 실패 할 때와 새 인스턴스가 시작될 때 사이에 약간의 시간차가 있습니다.

0

제안 된대로의 세마포는 길을 갈 것입니다. 비록 내가 블랍 저장소에 간단한 타임 스탬프 하트 비트를 가지고있을지라도 말입니다.

다른 생각은 얼마나 필요한가요? 로드가 몇 분 동안 지속될 수 있다면, 아마도 역할을 재활용하게할까요?

0

데이빗의 해결책에 작은 잡기. 대기열에 메시지를 다시 게시하면 현재 실행의 마지막 일이 발생하므로 시스템이 충돌하여 현재 메시지가 만료되어 대기열에 다시 놓일 수 있습니다. 이는 메시지가 원래 엿보이고 대기열에서 제거하기 위해 대기열 작업을 필요로한다고 가정합니다. 대기열에 새 메시지를 삽입하기 전에 대기열이 발생해야합니다. 이 두 작업 사이에 역할이 충돌하면 시스템에 토큰이 남아 있지 않고 중단됩니다. ESB dup 확인은 가능한 접근법처럼 들리지만, 버스가 현재 대기열에있는 동일한 메시지 만 확인할 수 있기 때문에 결정적 일 것 같지 않습니다. 그러나 이전 메시지가 대기열에서 제외 된 직후에 메시지 중 하나가 들어 오면 병렬로 실행되는 두 개의 프로세스로 끝날 수 있습니다.

대체 솔루션을 제공 할 수 있다면 Peek 작업을 통해 메시지를 대기열에서 제외하고 임대 만하면됩니다. 보이지 않는 시간 제한이 작업자 역할의 처리 시간을 초과하지 않도록해야합니다. 처음부터 토큰을 생성하는 경우 ASB dup check와 결합 된 이전에 설명한 작업자 역할 시작 전략이 작동해야합니다 (메시지는 대기열에서 절대로 이동하지 않으므로).