我使用以下url创建ActiveMQConnactionFactory:
failover:(tcp://server1:port,tcp://server2:port,tcp://server2:port)
我想要做的是从这个经纪人网络创建多个消息使用者。 以下不是真正的代码,但它有助于解释我是如何做到的:
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("BROKER_URL");
connection = connectionFactory.createConnection();
connection.start();
for (int i=0; i<10; i++) {
session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
Destination queue = consumerSession.createQueue("QUEUE_NAME");
consumer = consumerSession.createConsumer(queue);
consumer.setMessageListener(new MessageListener());
}
问题是所有消费者都将连接到一个随机选择的经纪人。 但我希望他们能够在经纪人网络上保持平衡。
我相信可以通过与工厂建立多个连接来实现这一目标。
但是最佳做法是什么? 这是我想要的好事吗? :)
答案 0 :(得分:0)
实际上,消费者不会连接到随机选择的经纪人。
连接是连接到代理的部分。使用您提供的连接字符串,您将有一个连接映射到一个随机选择的代理。所有消费者都有自己的会话,但这些会使用与该ONE经纪人相同的ONE连接。
我所知道的唯一设置是,您可以通过在连接字符串上设置?randomize=false
来禁用故障转移协议的随机化行为。这意味着您的连接将首先尝试第一个,然后是第二个,然后是第三个,等等。
但要达到你的要求。我会让每个消费者拥有自己的连接。这与故障转移协议中的随机化功能一起将对消费者进行负载平衡;但不是真的,那里没有智能,只是“随机化”它所连接的经纪人。
这意味着,我会执行以下操作(来自您的代码)
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("BROKER_URL");
for (int i=0; i<10; i++) {
connection = connectionFactory.createConnection();
connection.start();
session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
Destination queue = consumerSession.createQueue("QUEUE_NAME");
consumer = consumerSession.createConsumer(queue);
consumer.setMessageListener(new MessageListener());
}
这样,每个消费者都会拥有自己与故障转移连接字符串“a”代理的连接
更改问题后更新:
如果您想让ActiveMQ为每个消费者随机选择一个代理,上面提到的解决方案就是您的选择。
最佳做法是让您的消费者和生产者尽可能彼此接近。为此,我建议降低网络消费者的优先级,以便本地消费者和生产者具有最高优先级。只有当本地消费者不闲着时,它才会通过网络进一步分发给其他消费者。
除此之外,如果消费者端的操作长时间运行以设置较低的预取值将是一个好主意,这样消息就可以在经纪人网络周围实现负载平衡,而不是一个消费者抢占1000消息,而其他消费者闲置。