2015-01-09 6 views
3

QueueClient Message Pump를 사용하여 많은 Azure Service Bus 메시지를 처리하는 작업자 역할을 확장하는 가장 좋은 방법은 무엇입니까?메시지 처리 Azure 서비스 버스 길이 조정

QueueClient.OnMessageOptions.MaxConcurrentCalls = 6 및 QueueClient.OnMessage 을 사용하는 경우 한 번에 최대 6 개의 메시지 만 처리 할 수 ​​있습니까?

OnMessage 콜백 내에서 처리를 완료하기 위해 새 작업을 생성하기 위해 장기 실행 처리를하는 것이 좋지 않습니까?

대신 QueueClient.OnMessageAsync를 사용해야합니까?

도움 주셔서 감사합니다.

답변

2

"장기 실행"이란 IO 바인딩 또는 CPU 바인딩을 의미합니까?

IO 바인딩을 가정하면 OnMessage 콜백에 새 태스크를 생성하지 않습니다. 이로 인해 처리 속도가 느려질 수있는 스레드 관리 오버 헤드가 생성됩니다.

는 IO 바인딩 작업을 사용하면 이러한 작업의 비동기 구현을 기다리고 있는지 확인하는 경우 OnMessageAsync을 사용하는 것이 좋습니다. 이렇게하면 기존 스레드를 훨씬 더 효율적으로 사용할 수 있습니다.

작업이 CPU 바인딩이면 작업 작성이 더 많은 작업을 수행 할 수 있습니다. 이것의 역학 스티븐 클리어 리 의한 우수한 게시물의 일련의 설명 :

http://blog.stephencleary.com/2013/10/taskrun-etiquette-and-proper-usage.html

MaxConcurrentCalls 속성은 서비스 버스에 동시 요청의 수를 제어합니다. IO를 제한하고 사용 가능한 대역폭으로 제한하는 경우이 수치를 높이면 제한적인 영향을 미칩니다. Azure 클라이언트 측 성능 카운터를 사용하여 성능 테스트를 수행하여 환경에 가장 적합한 값을 얻는 것이 좋습니다.

+1

AFAIK'MaxConcurrentCalls' 설정은'QueueClient'가 발행 할 동시 콜백 스레드의 수에 영향을 미치며, 그 번호에 관계없이 ASB에 대한 단일 요청이 있음을 나타냅니다. 즉 :'OnMessage'는 단순히 다중 쓰레드에서'QueueClient.Receive'를 래핑하지 않는만큼 폴링 방식의 인터페이스가 아닙니다. 'ReceiveBatch -> foreach를받은 것과 같고, 활성 카운트 동안 스레드를 생성합니다. – JoeBrockhaus