2017-04-04 9 views
1

NATS를 사용하고 있으며 3 개 이상 노드의 클러스터링을 사용합니다. 우리는 여러 생산자와 많은 소비자를 보유하고 있습니다. 메시지 크기는 작지만 (~ 100bytes) 처리량은 다소 높습니다. ~ 40k/초. 모든 트래픽은 2x10gbps 본드 내부 네트워크에 있습니다.NATS가 수평으로 확장됩니까 (처리량)

더 많은 노드로 클러스터를 확장하면 클러스터 처리량에 도움이 될지 궁금했습니다. 더 많은 메시지/초가 기록 될 때마다 약간의 대기 시간이 생기는 것 같습니다.

보조 메모로 처리량을 향상시키기 위해 수행 할 수있는 팁/트릭이 있습니까? 우리는 현재 protobufs를 사용하고 있습니다. 그러나 서버를 조정할 수 있습니까?

답변

2

주어진 주제에 일치하는 구독 수가 많으면 처리량에 영향을 줄 수 있습니다.

예를 들어, 1 연결을 사용 중이며 foo에 게시하고 있다고 가정합니다. foo에는 100 개의 구독 정보가 있습니다. 서버가 메시지를 받으면 일치하는 모든 구독에 메시지를 배달합니다. 이 경우 구독이 동일한 연결에 속하는지 여부에 관계없이 TCP가이 메시지를 100 번 보내야 함을 의미합니다.

가입자에게 보내기를 수행하는 동안 서버는이 연결에 의해 게시 된 다른 메시지를 읽지 않습니다.

서버 추가로 수평 확장 클러스터의 구독로드도 배포하는 경우 도움이됩니다. 위의 예에서 한 소비자가 50 명, 다른 소비자가 50 명인 경우 게시 된 메시지를받는 서버는 이제 50 + 1 회 (현지 가입자의 경우 50 명, 경로의 경우 1 명)에만 메시지를 보내야합니다. 그러면 다른 서버는 로컬 가입자에게 50 개의 메시지를 보냅니다.

그러나 서버를 추가하는 것만으로 단일 구독이 있거나 일치하지 않는 구독이있는 경우 단일 연결 처리량이 향상되지 않습니다.

게시자 처리량을 향상시키는 또 다른 방법은 더 많은 연결을 사용하는 것입니다. 서버는 연결 당 go 루틴을 사용하므로 (소켓에서 데이터를 읽은 다음 가입으로 전송) 일부 작업을 병렬 처리 할 수 ​​있습니다.

컴퓨터에서 얻을 수있는 상한값을 얻기 위해 repo에 포함 된 일부 벤치 마크를 실행할 수 있습니다. 예를 들어, 서버 벤치 테스트는 대개 NATS 클라이언트 대신 소켓에 직접 데이터를 씁니다.

go test -v -run=xxx -bench=. ./test 

당신이 메시지를 보내는 방법으로 볼 수 있는지 확인하고이 구독 '콜백 처리하는 방법이 클라이언트 구현에 의해 부과 된 제한없이 서버 성능을 측정하는 것입니다. 실적을 향상시키기 위해 할 수있는 모든 일이 큰 가치가있을 것입니다.

희망이 도움이됩니다.