RabbitMQ的五种常见消费模子

打印 上一主题 下一主题

主题 506|帖子 506|积分 1518

引言

   RabbitMQ是一个盛行的消息队列中间件,它确保了差别应用步伐之间的可靠消息通报。由于其高性能、轻量级和机动性,RabbitMQ在许多应用步伐中被广泛使用,例如异步使命处理、负载均衡、变乱通知 等。在RabbitMQ中,消息的生产和消费是通过一系列的消费模子来管理的。每个消费模子都有差别的特点和应用场景,可以帮助开发职员构建高效的消息通报体系。本文将深入先容RabbitMQ的五种常见消费模子,包括简朴队列模子、工作队列模子、发布/订阅模子、路由模子和主题模子,删除线格式 并探究它们各自的优缺点和适用场景。希望此文能帮助你更好地理解RabbitMQ消费模子并在实践中到达更好的结果。
  

1. 简朴队列模子(Simple Queue Model)

   简朴队列模子是最基础的RabbitMQ模子。它包括单个生产者和单个消费者。生产者将消息发送到一个队列中,然后消费者从队列中读取消息并处理。这种模式不适用于多个消费者或消息广播,因为一旦消息被一个消费者吸取,它就会从队列中删除。
  优缺点及适用场景



  • 优点
   实现简朴,易于理解和摆设。
可以提供一些基本的可靠性保证,例如消息确认和恒久化。
  

  • 缺点
   不支持并发消费。
不支持多个消费者共同消费一个队列。
  

  • 适用场景
   单生产者和单消费者之间的点对点通信。
体系中只有一个进程或线程可以处理消息。
例如,一个后端服务向另一个后端服务发送消息,大概一个客户端将使命发送给服务器
  代码示例

  1. Connection connection = factory.newConnection();
  2. Channel channel = connection.createChannel();
  3. // 声明队列
  4. String queueName = "simpleQueue";
  5. channel.queueDeclare(queueName, false, false, false, null);
  6. // 发送消息
  7. String message = "Hello, RabbitMQ!";
  8. channel.basicPublish("", queueName, null, message.getBytes("UTF-8"));
  9. System.out.println("Sent message: " + message);
  10. // 接收消息
  11. boolean autoAck = true;
  12. Consumer consumer = new DefaultConsumer(channel) {
  13.     @Override
  14.     public void handleDelivery(String consumerTag, Envelope envelope,
  15.                                AMQP.BasicProperties properties, byte[] body) throws IOException {
  16.         String message = new String(body, "UTF-8");
  17.         System.out.println("Received message: " + message);
  18.     }
  19. };
  20. channel.basicConsume(queueName, autoAck, consumer);
复制代码
2. 工作队列模子(Work Queue Model)

   工作队列模子答应多个消费者协同地从一个队列中吸取、处理和分发消息。在这种模子中,消息被均匀分配给差别的消费者。当一个消费者正在处理一个消息时,它不能吸取新的消息。这确保了公平的分布和消费,同时在差别的消费者之间进行负载均衡。
  优缺点及适用场景



  • 优点
   支持多个消费者处理同一个队列中的消息。
消费负载均衡,每个消费者最多处理一条消息。
通过设置并发数,可以实现更高的消息吞吐量。
  

  • 缺点
   没有消息路由的动态性。
假如有消息时,所有的消费者都会在吸取到该消息后进行同样的处理,无法根据具体环境进行消息的划分,而且消息被均匀分配,不能根据消息的紧张性和告急性进行处理。
  

  • 适用场景
   需要在多个工人之间分配使命的应用步伐,例如异步使命处理或负载均衡。
  代码示例

  1. // 创建连接和通道
  2. Connection connection = factory.newConnection();
  3. Channel channel = connection.createChannel();
  4. // 声明队列
  5. String queueName = "workQueue";
  6. channel.queueDeclare(queueName, false, false, false, null);
  7. // 发送消息
  8. String message = "Hello, RabbitMQ!";
  9. channel.basicPublish("", queueName, null, message.getBytes("UTF-8"));
  10. System.out.println("Sent message: " + message);
  11. // 设置每个消费者在接收到确认前只能处理一条消息
  12. channel.basicQos(1);
  13. // 接收消息
  14. boolean autoAck = false;
  15. Consumer consumer = new DefaultConsumer(channel) {
  16.     @Override
  17.     public void handleDelivery(String consumerTag, Envelope envelope,
  18.                                AMQP.BasicProperties properties, byte[] body) throws IOException {
  19.         String message = new String(body, "UTF-8");
  20.         System.out.println("Received message: " + message);
  21.         // 手动发送消息确认
  22.         channel.basicAck(envelope.getDeliveryTag(), false);
  23.     }
  24. };
  25. channel.basicConsume(queueName, autoAck, consumer);
复制代码
3. 发布/订阅模子(Publish/Subscribe Model)

   发布/订阅模子答应一个生产者向多个消费者广播一条消息。在这种模子中,生产者将消息发送到一个交换机中,然后这个交换机将消息路由到所有与之绑定的队列。每个队列对应一个消费者,可以独立地处理这个队列中的消息。
  优缺点及适用场景



  • 优点
   支持广播式消息发布和订阅。
与其他应用步伐解耦,生产者和消费者不需要知道对方的存在和细节。
  

  • 缺点
   不支持消息路由的动态性。
没有消息过滤机制,每个订阅者都会收到所有的消息。
  

  • 适用场景
   需要将消息通知多个消费者的应用步伐,例如变乱通知或新闻发布。
  代码示例

  1. // 创建连接和通道
  2. Connection connection = factory.newConnection();
  3. Channel channel = connection.createChannel();
  4. // 声明交换器
  5. String exchangeName = "publishSubscribeExchange";
  6. channel.exchangeDeclare(exchangeName, "fanout");
  7. // 创建随机队列并绑定到交换器
  8. String queueName = channel.queueDeclare().getQueue();
  9. channel.queueBind(queueName, exchangeName, "");
  10. // 发送消息
  11. String message = "Hello, RabbitMQ!";
  12. channel.basicPublish(exchangeName, "", null, message.getBytes("UTF-8"));
  13. System.out.println("Sent message: " + message);
  14. // 接收消息
  15. boolean autoAck = true;
  16. Consumer consumer = new DefaultConsumer(channel) {
  17.     @Override
  18.     public void handleDelivery(String consumerTag, Envelope envelope,
  19.                                AMQP.BasicProperties properties, byte[] body) throws IOException {
  20.         String message = new String(body, "UTF-8");
  21.         System.out.println("Received message: " + message);
  22.     }
  23. };
  24. channel.basicConsume(queueName, autoAck, consumer);
复制代码
4. 路由模子(Routing Model)

   路由模子答应生产者根据路由键将消息发送到指定的队列中。在这种模子中,交换机会将消息路由到与它所绑定的队列匹配的路由键的队列中。消费者可以从这些队列中吸取和处理消息。
  优缺点及适用场景



  • 优点
   支持基于路由键的动态消息路由。
可以根据消息的类型、内容和优先级选择发送给哪个队列,支持消息的定向投递。
  

  • 缺点
   需要提前设置好交换机和队列之间的绑定关系。
支持的路由逻辑有限,只能通过路由键进行匹配。
  

  • 适用场景
   需要根据某些特定属性或条件将消息路由到相应队列的应用步伐,例如日志记录或按优先级处理使命。
  代码示例

  1. // 创建连接和通道
  2. Connection connection = factory.newConnection();
  3. Channel channel = connection.createChannel();
  4. // 声明交换器
  5. String exchangeName = "routingExchange";
  6. channel.exchangeDeclare(exchangeName, "direct");
  7. // 绑定队列到交换器,并指定路由键
  8. String queueName = "routingQueue";
  9. String routingKey = "important";
  10. channel.queueDeclare(queueName, false, false, false, null);
  11. channel.queueBind(queueName, exchangeName, routingKey);
  12. // 发送消息
  13. String message = "Important message!";
  14. channel.basicPublish(exchangeName, routingKey, null, message.getBytes("UTF-8"));
  15. System.out.println("Sent message: " + message);
  16. // 接收消息
  17. boolean autoAck = true;
  18. Consumer consumer = new DefaultConsumer(channel) {
  19.     @Override
  20.     public void handleDelivery(String consumerTag, Envelope envelope,
  21.                                AMQP.BasicProperties properties, byte[] body) throws IOException {
  22.         String message = new String(body, "UTF-8");
  23.         System.out.println("Received message: " + message);
  24.     }
  25. };
  26. channel.basicConsume(queueName, autoAck, consumer);
复制代码
5. 主题模子(Topic Model)

   主题模子是路由模子的扩展,它可以实现更机动的消息路由和分发。在这种模子中,生产者可以使用通配符匹配来匹配路由键。交换机会将消息路由到与它所绑定的队列匹配的路由键的队列中。消费者可以从这些队列中吸取和处理消息。
  优缺点及适用场景



  • 优点
   支持更机动、更具体的消息路由和过滤。
可以使用通配符匹配路由键,实现更复杂的消息匹配和分发。
  

  • 缺点
   高度设置化和复杂化,需要额外设置主题模式下的应用步伐逻辑。
在一些场景下,通配符匹配路由键可能会导致性能问题。
  

  • 适用场景
   需要根据消息内容的模式将消息路由到差别队列的应用步伐,例如按标签或关键字分发和处理差别的使命。
  代码示例

  1. // 创建连接和通道
  2. Connection connection = factory.newConnection();
  3. Channel channel = connection.createChannel();
  4. // 声明交换器
  5. String exchangeName = "topicExchange";
  6. channel.exchangeDeclare(exchangeName, "topic");
  7. // 绑定队列到交换器,并指定匹配模式
  8. String queueName = "topicQueue";
  9. String routingKeyPattern = "com.example.*";
  10. channel.queueDeclare(queueName, false, false, false, null);
  11. channel.queueBind(queueName, exchangeName, routingKeyPattern);
  12. // 发送消息
  13. String routingKey = "com.example.news";
  14. String message = "Important news!";
  15. channel.basicPublish(exchangeName, routingKey, null, message.getBytes("UTF-8"));
  16. System.out.println("Sent message: " + message);
  17. // 接收消息
  18. boolean autoAck = true;
  19. Consumer consumer = new DefaultConsumer(channel) {
  20.     @Override
  21.     public void handleDelivery(String consumerTag, Envelope envelope,
  22.                                AMQP.BasicProperties properties, byte[] body) throws IOException {
  23.         String message = new String(body, "UTF-8");
  24.         System.out.println("Received message: " + message);
  25.     }
  26. };
  27. channel.basicConsume(queueName, autoAck, consumer);
复制代码
  总的来说,差别的消息队列模子适用于差别的场景和需求。简朴队列模子适合于点对点通信;工作队列模子适用于使命分配和负载均衡;发布/订阅模子适用于消息广播和解耦;路由模子适用于动态消息路由和选择性投递;主题模子适用于机动的消息路由和过滤。根据具体的业务需求和体系架构,合理选择适用的消息队列模子可以提高体系的可扩展性、可靠性和性能。
假如您另有其他问题,我将非常乐意答复!!!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

灌篮少年

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表