Rabbitmq 订阅多个服务,但以循环方式使用它
Rabbitmq Subscribe to multiple services but consume it in a round robin fashion
我找到了解决问题的有效方法,但想知道是否有更简洁的方法来解决这个问题。
我的架构由多个服务组成,通过 Rabbitmq 代理发送消息。
一些工作人员使用这些消息并执行后台作业。
问题是我希望能够创建不同类型的工人,所有工人都使用相同的服务,并且能够让多个相同类型的工人通过循环法获得工作。
为此,消息由服务以 pub/sub 方式发布,并由进程使用,该进程在专用于一组工作人员的工作队列中重新分发消息。
有没有更优雅的方式来做到这一点?
抱歉,如果解释不清楚,我会编辑它。
谢谢!
(我本可以为服务中的每个工作人员创建一个队列,但使用我的解决方案,我可以在不触及任何代码的情况下尽可能多地订阅)
听起来非常适合 topic exchange。
请看:
https://www.rabbitmq.com/tutorials/tutorial-two-java.html
节"Round-robin dispatching"
您必须设置参数channel.basicQos(X)
:
channel.basicQos(1);
final Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
String message = new String(body, "UTF-8");
System.out.println(" [x] Received '" + message + "'");
try {
doWork(message);
} finally {
System.out.println(" [x] Done");
channel.basicAck(envelope.getDeliveryTag(), false);
}
}
};
我找到了解决问题的有效方法,但想知道是否有更简洁的方法来解决这个问题。
我的架构由多个服务组成,通过 Rabbitmq 代理发送消息。
一些工作人员使用这些消息并执行后台作业。
问题是我希望能够创建不同类型的工人,所有工人都使用相同的服务,并且能够让多个相同类型的工人通过循环法获得工作。
为此,消息由服务以 pub/sub 方式发布,并由进程使用,该进程在专用于一组工作人员的工作队列中重新分发消息。
有没有更优雅的方式来做到这一点?
抱歉,如果解释不清楚,我会编辑它。
谢谢!
(我本可以为服务中的每个工作人员创建一个队列,但使用我的解决方案,我可以在不触及任何代码的情况下尽可能多地订阅)
听起来非常适合 topic exchange。
请看: https://www.rabbitmq.com/tutorials/tutorial-two-java.html
节"Round-robin dispatching"
您必须设置参数channel.basicQos(X)
:
channel.basicQos(1);
final Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
String message = new String(body, "UTF-8");
System.out.println(" [x] Received '" + message + "'");
try {
doWork(message);
} finally {
System.out.println(" [x] Done");
channel.basicAck(envelope.getDeliveryTag(), false);
}
}
};