우리는 다양한 서비스를 통해 메시지를 처리합니다 (하나의 메시지는 완료되기 전에 9 개의 서비스에 닿을 것입니다. 현재는 성능면에서 최악의 경우 (XML 데이터 계약 직렬화)와 최상의 경우 (메모리 내 MSMQ)를 조합했습니다.
메시지의 특성상 직렬화 된 데이터는 약 12-15 킬로바이트이며, 주당 약 4 백만 개의 메시지를 처리합니다. MSMQ의 영구 메시지는 우리에게 너무 느리고 데이터가 증가함에 따라 MSMQ의 메모리 매핑 파일에서 압력을 받고 있습니다. 서버는 16GB의 메모리 사용 및 큐잉을 위해 증가하고 있습니다. 컴퓨터가 스와핑을 시작하기 때문에 메모리 사용량이 많으면 성능이 저하됩니다. 이미 MSMQ 자체 정리 동작을 수행하고 있습니다.
우리가 여기서 잘못하고있는 부분이 있다고 생각합니다. 메시지를 유지하고 식별자를 대기열에 넣기 위해 RavenDB를 사용하려고 시도했지만 성능이 매우 느 렸습니다 (분당 1000 메시지). 그것이 개발 버전을 사용한 결과인지 확실하지 않지만 더 높은 처리량이 필요합니다 [1]. 이 개념은 이론적으로는 잘 작동했지만 성능은 과제에 미치지 못했습니다.
사용 패턴에는 라우터 역할을하는 하나의 서비스가 있으며,이 서비스는 모든 읽기를 수행합니다. 다른 서비스는 타사 후크를 기반으로 정보를 첨부하고 라우터로 다시 전달합니다. 대부분의 객체는 9-12 번 터치되지만 타사가 적절하게 응답 할 때까지 약 10 % 가이 시스템에서 잠시 동안 반복됩니다. 이러한 이유로 서비스의 우선 순위 필드를 활용함에 따라 현재 서비스가이를 설명하고 적절한 수면 동작을 갖습니다.
그래서 제 질문은 C # / Windows 환경에서 개별 디스크이지만 LAN 컴퓨터 사이에서 메시지를 전달하는 데 이상적인 스택은 무엇입니까? 일반적으로 XML 직렬화 대신 BinaryFormatter로 시작하지만 직렬화를 문서 저장소로 오프로드하는 것이 더 좋은 방법이라면 토끼 구멍입니다. 따라서 내 질문입니다.
[1] : 비즈니스의 본질은 메시지를 빨리 처리할수록 더 많은 돈을 벌 수 있음을 의미합니다. 우리는 일주일 후반에 메시지를 처리하는 것이 돈을 벌 가능성이 적다는 것을 경험적으로 증명했습니다. "분당 1000"의 성능은 매우 빠르지 만 실제로는 10k / 분 이상의 숫자가 필요합니다. 주당 메시지로 숫자를 제공한다고해서 해당 메시지를 처리하는 데 일주일 내내 있다는 의미는 아닙니다.
=============== 편집 :
추가 정보
의견을 바탕으로 몇 가지 설명을 추가하겠습니다.
직렬화가 병목 현상인지 확실하지 않습니다. 애플리케이션을 벤치마킹했으며 히트 그래프에 직렬화가 표시되지만 서비스 CPU 사용률의 2.5-3 %에 대해서만 책임이 있습니다.
나는 메시지의 영속성과 MSMQ의 오용에 대해 주로 우려하고 있습니다. 비 트랜잭션, 비 지속 메시지를 사용하여 큐잉 성능을 계속 유지할 수 있으며 최소한 지속성 메시지를 유지하여 재부팅 후에도 지속됩니다.
RAM을 더 추가하는 것은 스톱 갭 측정입니다. 머신은 이미 4GB-> 16GB RAM에서 나갔으며 계속 추가하기 위해 중단하는 것이 점점 어려워지고 있습니다.
응용 프로그램의 스타 라우팅 패턴으로 인해 객체가 터지는 시간의 절반이 대기열로 푸시되어 전혀 변경되지 않습니다. 이것은 다른 곳에서 일종의 키-값 저장소에 저장하고 단순히 메시지 식별자를 전달하기 위해 다시 자신에게 적합합니다 (IMO).
스타 라우팅 패턴은 응용 프로그램에 필수적이며 변경되지 않습니다. 모든 방식의 조각이 비동기 방식으로 (폴링 방식으로) 작동하고 재시도 동작을 한 곳에서 중앙 집중화하려고하기 때문에 애플리케이션을 지네로 지을 수 없습니다.
응용 프로그램 논리는 C #으로 작성되고 개체는 변경 불가능한 POCO이며 대상 배포 환경은 Windows Server 2012이며 특정 소프트웨어가 Linux에서만 지원되는 경우 추가 컴퓨터를 세워 둘 수 있습니다.
저의 목표는 최소한의 자본 지출로 메모리 풋 프린트를 줄이고 내결함성을 높이면서 현재 처리량을 유지하는 것입니다.