이 문서에서는 Java용 Azure SDK에서 Event Hubs 라이브러리를 사용할 때 발생할 수 있는 일반적인 성능 문제에 대한 솔루션을 제공합니다. Event Hubs를 사용할 때 발생할 수 있는 다른 일반적인 문제에 대한 솔루션을 찾고 있는 경우 Azure Event Hubs 문제 해결을 참조하세요.
processEvent 또는 processEventBatch 사용
각 processEvent 인스턴스가 당신의 코드를 호출할 때 EventData 콜백을 사용합니다. 이 프로세스는 이벤트 허브에서 낮은 트래픽 또는 보통 트래픽에서 잘 작동합니다.
이벤트 허브에 높은 트래픽이 있고 높은 처리량이 예상되는 경우, 콜백을 지속적으로 호출하는 집계 비용이 EventProcessorClient의 성능을 저하시킬 수 있습니다. 이 경우 processEventBatch를 사용합니다.
각 파티션에 대해 콜백이 한 번에 하나씩 호출됩니다. 콜백의 처리 시간이 길면 EventProcessorClient에서 더 많은 이벤트를 다운스트림으로 푸시하거나 Event Hubs 서비스에서 추가 EventData 인스턴스를 요청하지 않으므로 성능 저하가 발생합니다.
검사점 비용
Azure Blob Storage를 검사점 저장소로 사용하는 경우 HTTP 요청을 수행하고 응답을 대기하기 때문에 검사점 지정에 대한 네트워크 비용이 발생합니다. 이 프로세스는 네트워크 대기 시간, Azure Blob Storage의 성능, 리소스 위치 등으로 인해 최대 몇 초 정도 걸릴 수 있습니다.
모든 EventData 인스턴스가 처리될 때마다 검사점을 설정하는 것은 이러한 HTTP 요청을 만드는 비용으로 인해 성능을 저해합니다. 콜백이 이벤트를 전혀 처리하지 않았다면 체크포인트를 수행하지 말고, 일정 수의 이벤트를 처리한 후에 체크포인트를 수행하세요.
LoadBalancingStrategy.BALANCED 또는 LoadBalancingStrategy.GREEDY 사용
LoadBalancingStrategy.BALANCED를 사용할 때, EventProcessorClient는 모든 부하 분산 주기마다 하나의 파티션을 주장합니다. 이벤트 허브에 32개의 파티션이 있는 경우 모든 파티션을 클레임하려면 32번의 부하 분산 반복이 필요합니다. 사용자가 실행 중인 인스턴스의 EventProcessorClient 집합 수를 알고 있는 경우 하나의 부하 분산 주기에서 파티션의 공유를 클레임하는 데 사용할 LoadBalancingStrategy.GREEDY 수 있습니다.
각 전략에 대한 자세한 내용은 azure-sdk-for-java 리포지토리의LoadBalancingStrategy.java 참조하세요.
prefetchCount 구성
기본 프리페치 값은 500입니다. AMQP 수신 링크가 열리면 링크에 500 크레딧이 배치됩니다. 각 EventData 인스턴스가 하나의 링크 크레딧 EventProcessorClient 이라고 가정하면 500 EventData 개의 인스턴스를 프리페치합니다. 프로세서 클라이언트가 모든 이벤트를 사용하는 경우 링크에 500 크레딧을 추가하여 더 많은 메시지를 받습니다. 이 흐름은 여전히 EventProcessorClient가 파티션을 소유하는 동안 반복됩니다.
너무 낮게 설정하면 prefetchCount 성능에 영향을 줄 수 있습니다. AMQP 수신 링크에서 크레딧을 배치할 때마다 원격 서비스는 ACK를 보냅니다. 높은 처리량 시나리오의 경우 수천 개의 클라이언트 요청 및 서비스 ACK를 만드는 오버헤드로 인해 성능이 저하될 수 있습니다.
너무 높게 설정하면 prefetchCount 성능에 영향을 줄 수 있습니다.
x 크레딧이 줄에 배치되면 Event Hubs 서비스는 최대 x개의 메시지를 보낼 수 있음을 알고 있습니다. 각 EventData 인스턴스가 수신되면 메모리 내 큐에 배치되어 처리될 때까지 대기합니다. 큐의 EventData 인스턴스 수가 많을수록 메모리 사용량이 매우 높아질 수 있습니다.
다음 단계
이 문서의 문제 해결 지침이 Java 클라이언트 라이브러리에 Azure SDK 사용할 때 문제를 해결하는 데 도움이 되지 않는 경우 Java GitHub 리포지토리에 대한 Azure SDK문제를 제출합니다.