2017-12-12 25 views
0

도 확인 , udp 기반 클러스터링 클러스터에 노드가 2 개 있으면 2 개의 연결이 필요합니다. 라운드 로빈 방식으로 메시지를 소비하려면 4 개의 연결이 필요합니다.아파치 아티 미스는 많은 연결을 STRICT 구성으로 많은 서버 노드를 생성해야합니다

하나의 연결 또는 수신기를 만든 경우 2 대의 서버에 2 대의 연결이 필요하다고 가정하고 10 개의 메시지를 생성 한 다음 5 개의 메시지를 놓치게됩니다.

얼마나 많은 서버 노드가 사용되는지에 따라 많은 연결을 생성하는 대신 하나의 연결에서 메시지를 수신하는 방법. 이 시간에 노드를 추가 운영하는 시나리오이다, 그래서 우리는 시간이 추가 된 노드를 실행하기 위해 올 것이다 그 메시지를 그리워 것이기 때문에 는

여기

내가

import javax.jms.*; 
import org.apache.activemq.artemis.api.jms.ActiveMQJMSClient; 
import org.apache.activemq.artemis.core.client.impl.ClientSessionInternal; 
import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory; 
import org.apache.activemq.artemis.util.ServerUtil; 
/** 
* A simple example that demonstrates server side load-balancing of messages between the queue instances on different 
* nodes of the cluster. The cluster is created from a static list of nodes. 
*/ 
public class StaticClusteredQueueExample { 
    public static void main(final String[] args) throws Exception { 
     Connection connection0 = null; 
     try { 

     Topic topic = ActiveMQJMSClient.createTopic("exampleTopic"); 

     ConnectionFactory cf0 = new ActiveMQConnectionFactory("tcp://localhost:9616"); 
     Thread.sleep(2000); 

     connection0 = cf0.createConnection(); 
     final String clientID = "admin"; 
     connection0.setClientID(clientID); 
     final String subscriptionName = "mySub"; 

     Session session0 = connection0.createSession(false, Session.AUTO_ACKNOWLEDGE); 
     connection0.start(); 

     MessageConsumer subscriber0 = session0.createDurableSubscriber(topic, subscriptionName); 
     Thread.sleep(2000); 

     MessageProducer producer = session0.createProducer(topic); 
     // We send 20 messages to server 
     final int numMessages = 20; 
     for (int i = 0; i < numMessages; i++) { 
      TextMessage message = session0.createTextMessage("This is text message " + i); 
      producer.send(message); 
      System.out.println("Sent message: " + message.getText()); 
     } 
     Thread.sleep(2000); 

     for (int i = 0; i < numMessages; i += 2) { 
      try { 
       TextMessage message0 = (TextMessage) subscriber0.receive(5000); 
       System.out.println("" + message0.getText() + ": from node " + ServerUtil.getServer(connection0)); 
      } catch (Exception e) {} 
     } 
     } finally { 
     // Step 15. Be sure to close our resources! 
     if (connection0 != null) { 
      connection0.close(); 
     } 
     } 
    } 
} 
연결 한 (클러스터 포함)이 개 노드가 예입니다 위의 예에서

제조자 20 메시지를 보낼하지만 난 출력을 인쇄하고 때만 the clustering documentation 상태로 대신 20

답변

0

10 메시지를 인쇄하는 방식의 메시지가 클러스터의로드 균형은 <message-load-balancing> 구성 요소에 따라 달라집니다 <cluster-connection>. 설명서 내용 :

이 매개 변수는 메시지가 클러스터의 다른 노드간에 배포되는지 여부를 결정합니다. OFF, STRICT 또는 ON_DEMAND (기본값)의 세 가지 값 중 하나 일 수 있습니다. 이 매개 변수는 더 이상 사용되지 않는 forward-when-no-consumers 매개 변수를 대체합니다.

이 다음 메시지가이가 각 수신 메시지가 둥근 다른 한편으로 심지어 같은 큐 불구하고 robin'd됩니다 STRICT로 설정되어있는 경우 클러스터

의 다른 노드로 전달되지 않습니다 OFF로 설정되어있는 경우 클러스터의 노드에는 소비자가 전혀 없거나 일치하지 않는 메시지 필터 (선택기)가있는 소비자가있을 수 있습니다. 이 매개 변수가 STRICT으로 설정된 경우에도 Apache ActiveMQ Artemis는 다른 노드에 같은 이름의 대기열이 없으면 메시지를 다른 노드로 전달하지 않습니다. STRICT을 사용하는 것은 기존 forward-when-no-consumers 매개 변수를 true으로 설정하는 것과 같습니다.

ON_DEMAND으로 설정하면 Apache ActiveMQ Artemis는 전달되는 주소에 사용자가있는 대기열이 있고 해당 메시지 처리기 (선택자)가있는 경우에만 클러스터의 다른 노드로 메시지를 전달합니다 해당 선택자 중 최소한 하나가 메시지와 일치해야합니다. ON_DEMAND을 사용하는 것은 legacy forward-when-no-consumers 매개 변수를 false으로 설정하는 것과 같습니다.

기본값은 ON_DEMAND입니다.

clustered-static-discovery 예는 모든 노드에 대한 연결이 요구되는 이유이다 <message-load-balancing>위한 STRICT 이용한다.

또한 여기서는 <redistribution-delay>이 동작에 영향을 미칩니다. 자세한 내용은 the clustering documentation의 "Message Redistribution"섹션을 참조하십시오.

당신이 <message-load-balancing>에 대한 ON_DEMAND를 사용하는 경우와 >=0은 다음 단일 노드에 연결에서 클러스터의 특정 큐에있는 모든 메시지를 소비 할 수있는 <redistribution-delay>.

+0

로드 밸런싱 서버 측이 작동하고 있는데, 이것은 문제가되지 않습니다. 문제는 STRICT를 사용할 때 서버 측에서 부하가 균형을 잡을 때입니다. 클러스터에 STRICT를 사용하는 두 개의 노드가 있고 클라이언트에 2 개의 연결이 필요하다고 가정합니다. 측면, 거기에 어떤 해결책이있다, 클러스터에서 STRICT를 변경하지 않고 단 하나의 연결을 사용하여 메시지를 소비 할 수 있습니다. – Baba

+0

아니요. 메시지로드 균형 조정이 STRICT로 구성된 경우 단일 노드에 대한 연결에서 클러스터의 특정 큐에있는 모든 메시지를 사용할 수있는 솔루션이 없습니다. 문서 재배포는 메시지로드 균형 조정이 문서 상태와 같이 ON_DEMAND로 구성된 경우에만 발생합니다. –