2017-01-19 1 views
3

많은 스레드를 회전시키는 응용 프로그램이 있습니다. 각 스레드는 masstransit/rabbitmq를 통해 동일한 메시지 유형을 제출합니다. IBus의 한 인스턴스를 저장하기 위해 싱글 톤을 만들었습니다. 응용 프로그램은 구성에 엔드 포인트가 없도록 메시지 만 공개합니다.많은 스레드에서 Masstransit rabbitMQ 게시

싱글 톤 메시지 버스는 게시 할 때 올바른 작업일까요? 필자는 끊임없이 메시지를 게시하기 위해 루프를 설정하여 성능 테스트를 수행했습니다. 60,000 초 만에 하나의 스레드 52000 메시지를 큐에 추가하는 경우. 5 개의 스레드가 실행될 때, 각각 동일한 루프를 수행 할 때만 8000 개의 메시지가 60 초 동안 대기열에 추가됩니다.

5 개의 스레드를 실행할 때 성능이 훨씬 나빠진 이유는 무엇입니까? 각 스레드마다 자체 버스 인스턴스가 있어야합니까?

답변

1

단일 버스 인스턴스는 RabbitMQ에 대한 단일 연결을 생성합니다. 그리고 그것은 일반적으로 대부분의 상황에 충분합니다. 연결을 수평 확장하려면 현재 추가 버스 인스턴스를 만들어야합니다.

그러나 TPL (Task Parallel Library)에서 잘 작동하는 스레드가 여러 개인 경우 특히 상당히 높은 속도로 게시 할 수 있어야합니다. 하나의 Task.WhenAll()에 여러 개의 Publish 호출을 결합하여 각 메시지 간의 대기 시간을 피할 수도 있습니다.

좋은 테스트는 MassTransit-Benchmark 프로젝트를 사용하여 브로커의 처리량에 대한 아이디어를 얻는 것입니다. 일반적으로 RabbitMQ를 통해 게시되고 소비 된 초당 8000-12000 개의 메시지를 볼 수 있습니다 (게시자 확인이 비활성화 된 상태로 지속 가능). 내구성과 확인을 추가하면 단일 스레드 게시 속도가 느려지지만 여러 원본 스레드에 큰 영향을 미치지 않아야합니다. 디스크에 대한 내구성있는 쓰기는 확실하게 느려질 수 있습니다.

여러 스레드가 느린 곳에서 사용하는 코드에 궁금 할 것입니다. Thread.Create()보다는 Task.Run()을 사용하는 것이 가장 좋습니다 (또는 구문이 현재 무엇이든, 스레드를 더 이상 사용하지 않습니다).

관련 문제