2011-05-04 8 views
5

SQL Server Service Broker가없는 일반 테이블을 사용하여 이벤트가 SQL Server Azure 데이터베이스에 저장되는 분산 이벤트 기반 시스템의 참조 아키텍처를 구성하는 중입니다.데이터베이스 큐 및 큐 처리

이벤트는 새 이벤트 메시지에 대한 대기열을 폴링 할 작업자 역할을 사용하여 처리됩니다.

제 연구에서 여러 프로세서가 대기열에서 메시지를 처리 ​​할 수있게 해주는 여러 가지 솔루션이 있습니다. 여러 가지 프로세스가 단일 메시지 대기열에 액세스하려고 시도 할 때 잠금 등을 관리하는 복잡성이 추가되는 경우가 많습니다.

전통적인 대기열 패턴은 하나의 대기열에서 여러 개의 프로세서를 가져 오는 것임을 알고 있습니다. 그러나 이벤트 메시지를 임의의 순서로 처리 할 수 ​​있다고 가정하면 대기열과 대기열 처리기간에 일대일 관계를 작성하지 않고 다른 대기열간에로드 균형을 조정해야하는 이유가 있습니까?

queue_1 => processor_1
queue_2 => processor_2

이러한 구현은 다수의 프로세서에 걸쳐 큐에 대한 동시 액세스를 관리하는 데 필요한 모든 배관을 피할 수있다. 이벤트 게시자는 모든로드 균형 알고리즘을 사용하여 메시지를 게시 할 큐를 결정할 수 있습니다.

내 검색에서 이런 종류의 구현이 보이지 않는다는 사실 때문에이 디자인에서 큰 적자를 간과한다고 생각합니다. 이 게시물 등 내가 내구성 메시지를 포함하여 나에게 가능한 기본 대기 옵션의 숫자가 있다는 것을 이해 MSMQ, 푸른 큐, 대 대기열로 데이터베이스 테이블을 사용을 통해 논쟁을 촉발했다 편집

Azure AppFabric의 버퍼. 필자는 옵션을 평가하여 SQL Azure 테이블로 충분하다고 판단했습니다. 내 질문의 의도는 큐 당 하나의 프로세서 대 하나의 큐에 대해 여러 개의 프로세서 사용을 논의하는 것이 었습니다.

+0

"그래서 나는 무엇을 놓치고 있습니까?" 나는 적절한 이벤트 큐를 사용하는 전체 요점을 놓치고 있다고 제안한다. 이벤트 대기열이 이미 일류 제품인 경우 데이터베이스를 사용하여 이벤트 대기열을 작성하는 것은 어리석은 것처럼 보입니다. 왜 MS-MQ를 사용하지 않고 많은 고통을 덜어 주실 수 있습니까? –

+0

@S. Lott : 나는 항상 같은 가게에 대기열과 데이터를 보유 할 이유가 있다고 주장합니다. 모든 작업 (메시지 저장소와 데이터 저장소 간의 DTC), 배포/문제 해결/관리를위한 하나의 제품, 메시지 저장소와 데이터 저장소에서 함께 실패한 HA/DR 솔루션 1 개를 사용하여 균일 한 백업/복원, 2 단계 커밋 제거 일관성있는 상태로 유지되며이 모든 것들이 데이터베이스 내부의 대기열에 대해 매우 중요한 경우입니다. 거의 모든 메시지가 데이터 작업의 결과로 시작하고 데이터 업데이트를 끝내는 것을 고려하면 이벤트 *는 데이터이며 함께 속합니다. –

+0

@ S.Lott : 1) Azure에 배포 할 때 MSMQ가 없습니다. 2) MS-MQ에는 많은 고통이 있습니다. –

답변

1

S.Lott에서 언급했듯이 사용할 수있는 메시지 큐 메커니즘이 있습니다. MSMQ는 Windows Azure에서 실제로 도움이되지 않지만 Windows Azure에는 이미 내구성 큐 메커니즘이 있습니다. 하나 이상의 큐 항목을 읽도록 각 작업자 역할 인스턴스를 쉽게 설정할 수 있습니다. 대기열 항목을 읽은 후에는 지정한 시간 길이에 상관없이 "보이지 않습니다"(시간이 지정되지 않은 경우 30 초). 큐 메시지는 최대 8K가 될 수 있으며 "내구성"으로 간주됩니다. 모든 Azure 저장소는 최소 3 회 복제됩니다 (SQL Azure와 동일).

gbn에서 설명한 것과 같은 것을 구현할 수 있지만 실제로 Windows Azure에서 작업 할 때는 기본 Azure Queue 서비스를 고려해야한다고 생각합니다. 여러 대기열 사용자로 쉽게 확장 할 수 있으며 동시성 또는로드 균형 조정 코드에 대해 걱정할 필요가 없습니다. 인스턴스 수를 늘리거나 줄입니다.

Windows Azure 대기열에 대한 자세한 내용은 Azure Platform Training Kit을 확인하십시오. 대기열 기본 사항을 안내하는 몇 가지 간단한 실습실이 있습니다.

+0

http://msdn.microsoft.com/en-us/library/dd179363.aspx? 그게 유용한 링크인가요? –

+0

Azure 대기열은 내가 찾고있는 옵션입니다. 그러나, 나는 그들이 거래가 아니라는 사실에 관심이있다. –

+0

"Azure Queue의 핵심 토대 이해"에서 - 그렇습니다, 절대적으로 유용한 링크. 이를 염두에 두십시오 : 모든 REST API를 숨기는 완전한 공식 .NET SDK가 있으므로 걱정할 필요가 없습니다. 또한 PHP 및 Java 용 라이브러리와 Ruby 및 Python 용 오픈 소스 프로젝트도 있습니다. –

0

당신이 놓치고있는 요점은 큐를 사용할 때 중요한 점 중 하나는 명령이 저장된다는 것이고 일단 대기열에 있으면 어떤 일이 일어나더라도 잃지 않을 것이라는 것입니다.

이제 폴러 프로세스가 죽을 수도 있고, 다른 문제가 많을 수도 있습니다. 대기열은 주문이 안전한 장소입니다.

폴러는 동일한 수준의 견고성을 요구하지 않습니다. 예를 들어, Postfix은 메시지 대기열이 많은 보안 수준 (대기열이있는 다른 보안 수준과 통신해야하는 응용 프로그램의 각 하위 시스템)에서 사용되는 메일 전송기의 매우 안전한 구현입니다. 어떤 우편물도 풀지 않을 것이고, 노동자들은 매우 나쁘게 죽을 수 있습니다.

편집 기본적인 사용이 주문을 저장하고, 노동자들이 그와 함께 무엇을 할 것 인 무시 여러 큐를 처리 할 수있는 유일한 이유가 그래서, 얼마나 많은 노동자 등, 아직 살아있다 의미

주문 (애플리케이션 로직)을위한 여러 목적지를 관리하고 작업자가 작업 할 방법을 관리하지 마십시오 (디커플링).

5

이 주제에 대한 자세한 내용은 Using tables as Queues을 참조하십시오. 문제는 '대기열'에 액세스하는 방법뿐 아니라 색인 생성 방법도 클러스터 된 색인 이 다음 대기열을 대기열에서 제외하기 위해 직접 검색 할 수 있어야합니다. 그렇지 않으면 계속 교착 상태가됩니다.

프로세서를 동일한 대기열로 경주 시키려면 다른 대기열에 분산시켜로드 균형을 조절하는 것이 좋습니다. 늦은 프로세서 뒤에 대기중인 항목이있는 곳에서는 호송 및 인공 대기 시간이 발생하지만 대기열이 비어 있기 때문에 다른 프로세서는 무료이며 유휴 상태입니다.

+0

여러 개의 대기열을 갖는로드 균형 조정이 안티 패턴을 구성하는지는 확실하지 않습니다. 테이블을 수평 적으로 분할하는 것이 일반적입니다. WRT convoys와 late processors를 사용하기에 적절한로드 밸런싱 알고리즘이 퍼블리시를 각 큐에 분산시켜 균형을 유지할 수 있다고 가정합니다. –

+0

분할하여 메시지 저장소의 수평 확장을 암시하는 경우 여러 큐가 유일한 방법입니다. 그러나 하나의 저장소 (예 : Azure DB)에 여러 대기열을 배치하려는 경우 하나의 대기열이 여러 개가 아닌 것보다 내 의견에 충실합니다. 단일 큐의 확장 성은 제대로 완료되면 Azure DB가 구동 할 수있는 것보다 훨씬 크기 때문에 더 많은 큐를 가질 이유가 없습니다. –

+0

좋은 입력. 나는 당신의 주장을 고려할 것입니다. 의견을 보내 주셔서 감사합니다. –