2013-08-12 1 views
1

와 ActiveMQ를 균형을로드합니다. 하지만 100 TPS에서 500 TPS로 확장 할 수는 없습니다. 이미어떻게이 같은 트랜잭션을 수행 아파치 낙타를 기반으로 미들웨어를 지속적 메시지

  1. 는 동시 소비자 설정을 제기하고 트랜잭션 속도를 높이기 위해 빈 businessProcessor
  2. 구성된 JAVA_XMX 및 PERMGEN

을 사용했다.

Active MQ 웹 콘솔에 따르면 시나리오 500TPS에서 처리되는 것을 기다리는 메시지가 너무 많습니다. 나는 솔루션 중 하나가 ActiveMQ를 확장한다고 생각합니다. 그래서 클러스터에 여러 중개인을 사용하고 싶습니다.

http://fuse.fusesource.org/mq/docs/mq-fabric.html ("토폴로지"절)에 따르면 클러스터링 모드에서 ActiveMQ를 구성하는 것이 비 지속성 메시지에 적합합니다. IMHO, 실행중인 모든 브로커가 동일한 저장소 파일을 사용하기 때문에 적합하지 않다는 것은 사실입니다. 그러나 저장소 파일을 분리하는 것은 어떻습니까? 지금 가능한가?

아무도 이것을 설명 할 수 있습니까? 가능하지 않은 경우 영구 메시지의로드 균형을 유지하는 가장 좋은 방법은 무엇입니까?

감사

답변

0

실행중인 모든 브로커가 지속성에 대해 동일한 저장소 파일 또는 TX-지원 데이터베이스를 사용하는 경우, 시작 후 첫 번째 브로커가 다른 사람들이 대기 모드에있는 동안 첫 번째는 잠금을 잃을 때까지, 활성화됩니다 . 다음 더에서 메시지를 하나 소비자 메시지 를 보내

  1. 구성 여러 브로커를 네트워크 브리지 모드에서 : 당신이 당신의 지속성을로드 균형 조정하려면

    은, 우리가 시도 할 수 두 가지 방법이 있었다 그들 중 하나보다. 그것 수 있습니다 loadbalance 브로커 및 loadbalance 지속성.

  2. persistenceAdapter를 대체하고 메시지를 파티션별로 저장하려면 데이터베이스 샤딩 미들웨어 (예 : tddl : https://github.com/alibaba/tb_tddl)을 사용하십시오.
0

이 대답은 카멜 세부 사항이 추가되기 전에 질문의 버전과 관련이 있습니다.

부하 분산을 원하는 이유와 이유가 무엇인지 정확히 알 수 없습니다. 소비자를 통한 메시지? 중개인을 통한 제작자? 어떤 종류의 걱정거리를 해결하려고합니까?

일] 적으로 일종의 지리적 사용 사례를 처리하거나 signle broker가 처리 할 수있는 연결이 너무 많거나 단일 브로커 (브로커 쌍이 될 수 있음)를 제외하고는 브로커 네트워크 사용을 피해야합니다 HA에서 구성된)는 필요한 처리량을 제공하지 않습니다 (90 %의 경우).

브로커 네트워크에서 각 노드는 자체 저장소를 가지며 store-and-forward라는 메커니즘을 통해 메시지를 전달합니다. 이 작동 방식에 대한 설명은 Understanding broker networks을 읽으십시오.

ActiveMQ는 대기열에있는 가입자간에 메시지를 라운드 로빈 방식으로 균등하게 분산하여 일종의 부하 분산 장치로 작동합니다. 따라서 큐에 2 명의 구독자가 있고 메시지 A, B, C, D 스트림을 보내는 경우, 하나의 구독자는 A & C를 수신하고 다른 수신자는 B & D를 수신합니다.

한 단계 더 나아가 관련 메시지를 대기열에 그룹화하여 한 가입자 만 일관되게 처리하려면 다음을 고려해야합니다. Message Groups.

-1

첫 번째 단계는 ActiveMQ에서 처리중인 작업자 수를 늘리는 것입니다. 이를 수행하는 방법은 시작 URI에 ?concurrentConsumers=10 속성을 추가하는 것입니다. 기본 동작은 하나의 스레드 만 해당 끝점에서 소모되므로 ActiveMQ에 메시지가 쌓이게됩니다. 브로커를 더 추가하면 도움이되지 않습니다.

둘째, 진행중인 것으로 보이는 것이 SEDA (Staged Event-Driven Architecture)의 이점을 누릴 수 있습니다. SEDA에서는 처리량을 여러 단계로 나누어 처리량을 균등하게하기 위해 서로 다른 소비자 수를 가질 수 있습니다. ActiveMQ에서 소비하는 스레드는 프로세스의 한 단계 만 수행하여 Exchange를 다음 단계로 전달하고 입력 대기열에서 메시지를 가져옵니다.

사용자 경로를 따라서 2 개 작은 경로로 다시 쓸 수있다 : 입력 큐로부터 메시지 소모율 출력 속도와 일치하도록

from("activemq:input?concurrentConsumers=10").id("FirstPhase") 
    .process(businessInvokerOne) 
    .to("seda:invokeSecondProcess"); 

from("seda:invokeSecondProcess?concurentConsumers=20").id("SecondPhase") 
    .process(businessInvokerTwo) 
    .to("activemq:output"); 

두 단계가 동시에 소비자의 상이한 번호를 가질 수있다. 호출자 중 하나가 다른 호출자보다 훨씬 느린 경우 유용합니다.

메시지 지속성을 원할 경우 seda: 끝 점을 다른 중간 점 activemq: 끝점으로 바꿀 수 있습니다.

마지막으로 처리량을 높이려면 호출자를 프로파일 링하고 해당 코드를 최적화하여 처리 자체를 더 빠르게 만드는 데 집중할 수 있습니다.

+0

감사를 참조하십시오. IMHO, 나는 그것들이 단지 트랜잭션의 속도를 높이지만 트랜잭션의 수를 늘리지는 않을 것이라고 생각한다. 5000 메시지/초를 처리하도록하려면 어떻게해야합니까? 로드 밸런싱을 할 수 있도록 클러스터를 구성하기 위해 다른 머신을 구입해야한다고 생각합니다. – sancho21

+0

처리 속도와 처리량은 직접 관련이 있습니다. 스레드 처리 1 개당 1000 개의 메시지는 1 개의 메시지를 처리하는 1000 개의 스레드와 동일한 처리량을 제공합니다. 단일 시스템에서 제공 할 수있는 것 이상으로 확장하려는 경우 병목 현상 인 ActiveMQ (http://activemq.apache.org/activemq-performance-module-users-manual.html에서 쉽게 확인할 수 있음)를 테스트해야합니다. , 또는 낙타 경로. 후자 인 경우 상한값을 찾을 때까지 소비자 수를 계속 조정 한 다음 라우팅 프로세스의 두 번째 인스턴스를 다른 상자에 추가하여 동일한 ActiveMQ 인스턴스에서 읽습니다. –

+0

실제 처리가 알려지지 않았기 때문에 이러한 처리 단계가 항상 seda 구조로 분해 될 수 있다고 가정하지 않습니다. –

0

소비자를 추가하면 포인트 (서버의 코어/cpus 수에 따라 다름)에 도움이 될 수 있습니다. "Camel 서버"가 비즈니스 처리에 사용 가능한 모든 CPU를 활용하는 지점을 넘어서 스레드를 추가하는 것은 의미가 없으므로 생산성을 높일 수 있습니다.

아마도 더 많은 ActiveMQ 시스템을 추가해야 할 것입니다. ActiveMQ "네트워크"를 사용하여 지속성 파일을 분리 한 인스턴스간에 통신 할 수 있습니다. 더 많은 중개인을 추가하고 네트워크에 배치하는 것이 중요합니다.

도로를 따라 성능 테스트를 수행하여 브로커가 처리 할 수있는 부하의 종류와 낙타 프로세서가 처리 할 수있는 부하 (다른 시스템에있는 경우)를 확인하십시오.

영구 메시징을 할 때 트랜잭션이 필요할 수도 있습니다. 사용 중인지 확인하십시오.

1

두 개의 마스터/슬레이브 쌍을 생성하여 지속적인 메시지로드를 공유 할 수 있습니다. 마스터와 슬레이브는 데이터베이스 또는 공유 파일 시스템을 통해 상태를 공유하므로 해당 설정을 복제해야합니다.

2 개의 마스터 슬레이브 쌍을 만들고 2 쌍 사이에 소위 "네트워크 커넥터"를 구성하십시오. 이렇게하면 메시지가 손실 될 위험없이 성능이 두 배로 향상됩니다.

은 입력에 대한 http://activemq.apache.org/networks-of-brokers.html

+0

좋아, 이것은 아주 내구성있는 해결책으로 들린다. – kensai

관련 문제