RabbitMQ的五种常见消费模型

这篇具有很好参考价值的文章主要介绍了RabbitMQ的五种常见消费模型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言

RabbitMQ是一个流行的消息队列中间件,它确保了不同应用程序之间的可靠消息传递。由于其高性能、轻量级和灵活性,RabbitMQ在许多应用程序中被广泛使用,例如异步任务处理、负载均衡、事件通知 等。在RabbitMQ中,消息的生产和消费是通过一系列的消费模型来管理的。每个消费模型都有不同的特点和应用场景,可以帮助开发人员构建高效的消息传递系统。本文将深入介绍RabbitMQ的五种常见消费模型,包括简单队列模型、工作队列模型、发布/订阅模型、路由模型和主题模型,删除线格式 并探讨它们各自的优缺点和适用场景。希望此文能帮助你更好地理解RabbitMQ消费模型并在实践中达到更好的效果。

RabbitMQ的五种常见消费模型,rabbitmq,分布式,java,消息中间件,原力计划

1. 简单队列模型(Simple Queue Model)

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

优缺点及适用场景

  • 优点

实现简单,易于理解和部署。
可以提供一些基本的可靠性保证,例如消息确认和持久化。

  • 缺点

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

  • 适用场景

单生产者和单消费者之间的点对点通信。
系统中只有一个进程或线程可以处理消息。
例如,一个后端服务向另一个后端服务发送消息,或者一个客户端将任务发送给服务器

代码示例

Connection connection = factory.newConnection();
Channel channel = connection.createChannel();

// 声明队列
String queueName = "simpleQueue";
channel.queueDeclare(queueName, false, false, false, null);

// 发送消息
String message = "Hello, RabbitMQ!";
channel.basicPublish("", queueName, null, message.getBytes("UTF-8"));
System.out.println("Sent message: " + message);

// 接收消息
boolean autoAck = true;
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("Received message: " + message);
    }
};
channel.basicConsume(queueName, autoAck, consumer);

2. 工作队列模型(Work Queue Model)

工作队列模型允许多个消费者协同地从一个队列中接收、处理和分发消息。在这种模型中,消息被平均分配给不同的消费者。当一个消费者正在处理一个消息时,它不能接收新的消息。这确保了公平的分布和消费,同时在不同的消费者之间进行负载均衡

优缺点及适用场景

  • 优点

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

  • 缺点

没有消息路由的动态性。
如果有消息时,所有的消费者都会在接收到该消息后进行同样的处理,无法根据具体情况进行消息的划分,而且消息被平均分配,不能根据消息的重要性和紧急性进行处理。

  • 适用场景

需要在多个工人之间分配任务的应用程序,例如异步任务处理或负载均衡。

代码示例

// 创建连接和通道
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();

// 声明队列
String queueName = "workQueue";
channel.queueDeclare(queueName, false, false, false, null);

// 发送消息
String message = "Hello, RabbitMQ!";
channel.basicPublish("", queueName, null, message.getBytes("UTF-8"));
System.out.println("Sent message: " + message);

// 设置每个消费者在接收到确认前只能处理一条消息
channel.basicQos(1);

// 接收消息
boolean autoAck = false;
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("Received message: " + message);
        // 手动发送消息确认
        channel.basicAck(envelope.getDeliveryTag(), false);
    }
};
channel.basicConsume(queueName, autoAck, consumer);

3. 发布/订阅模型(Publish/Subscribe Model)

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

优缺点及适用场景

  • 优点

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

  • 缺点

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

  • 适用场景

需要将消息通知多个消费者的应用程序,例如事件通知或新闻发布。

代码示例

// 创建连接和通道
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();

// 声明交换器
String exchangeName = "publishSubscribeExchange";
channel.exchangeDeclare(exchangeName, "fanout");

// 创建随机队列并绑定到交换器
String queueName = channel.queueDeclare().getQueue();
channel.queueBind(queueName, exchangeName, "");

// 发送消息
String message = "Hello, RabbitMQ!";
channel.basicPublish(exchangeName, "", null, message.getBytes("UTF-8"));
System.out.println("Sent message: " + message);

// 接收消息
boolean autoAck = true;
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("Received message: " + message);
    }
};
channel.basicConsume(queueName, autoAck, consumer);

4. 路由模型(Routing Model)

路由模型允许生产者根据路由键将消息发送到指定的队列中。在这种模型中,交换机会将消息路由到与它所绑定的队列匹配的路由键的队列中。消费者可以从这些队列中接收和处理消息。

优缺点及适用场景

  • 优点

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

  • 缺点

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

  • 适用场景

需要根据某些特定属性或条件将消息路由到相应队列的应用程序,例如日志记录或按优先级处理任务。

代码示例

// 创建连接和通道
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();

// 声明交换器
String exchangeName = "routingExchange";
channel.exchangeDeclare(exchangeName, "direct");

// 绑定队列到交换器,并指定路由键
String queueName = "routingQueue";
String routingKey = "important";
channel.queueDeclare(queueName, false, false, false, null);
channel.queueBind(queueName, exchangeName, routingKey);

// 发送消息
String message = "Important message!";
channel.basicPublish(exchangeName, routingKey, null, message.getBytes("UTF-8"));
System.out.println("Sent message: " + message);

// 接收消息
boolean autoAck = true;
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("Received message: " + message);
    }
};
channel.basicConsume(queueName, autoAck, consumer);

5. 主题模型(Topic Model)

主题模型是路由模型的扩展,它可以实现更灵活的消息路由和分发。在这种模型中,生产者可以使用通配符匹配来匹配路由键。交换机会将消息路由到与它所绑定的队列匹配的路由键的队列中。消费者可以从这些队列中接收和处理消息。

优缺点及适用场景

  • 优点

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

  • 缺点

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

  • 适用场景

需要根据消息内容的模式将消息路由到不同队列的应用程序,例如按标签或关键字分发和处理不同的任务。

代码示例

// 创建连接和通道
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();

// 声明交换器
String exchangeName = "topicExchange";
channel.exchangeDeclare(exchangeName, "topic");

// 绑定队列到交换器,并指定匹配模式
String queueName = "topicQueue";
String routingKeyPattern = "com.example.*";
channel.queueDeclare(queueName, false, false, false, null);
channel.queueBind(queueName, exchangeName, routingKeyPattern);

// 发送消息
String routingKey = "com.example.news";
String message = "Important news!";
channel.basicPublish(exchangeName, routingKey, null, message.getBytes("UTF-8"));
System.out.println("Sent message: " + message);

// 接收消息
boolean autoAck = true;
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("Received message: " + message);
    }
};
channel.basicConsume(queueName, autoAck, consumer);

总的来说,不同的消息队列模型适用于不同的场景和需求。简单队列模型适合于点对点通信;工作队列模型适用于任务分配和负载均衡;发布/订阅模型适用于消息广播和解耦;路由模型适用于动态消息路由和选择性投递;主题模型适用于灵活的消息路由和过滤。根据具体的业务需求和系统架构,合理选择适用的消息队列模型可以提高系统的可扩展性、可靠性和性能。
如果您还有其他问题,我将非常乐意回答!!!文章来源地址https://www.toymoban.com/news/detail-712979.html

到了这里,关于RabbitMQ的五种常见消费模型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 中间件_RabbitMQ五种消息模型

    RabbitMQ官方文档 RabbitMQ 提供了5种常用消息模型。但是其实3、4、5这三种都属于订阅模型,只不过进行路由的方式不同。 简单消息队列官方文档 1、创建简单消息队列 2、导入依赖 3、编写生产者测试类SpringAmqpTest,并利用 RabbitTemplate 实现消息发送 4、编写消费者,监听队列消息

    2024年02月06日
    浏览(43)
  • 【图解RabbitMQ-7】图解RabbitMQ五种队列模型(简单模型、工作模型、发布订阅模型、路由模型、主题模型)及代码实现

    🧑‍💻作者名称:DaenCode 🎤作者简介:CSDN实力新星,后端开发两年经验,曾担任甲方技术代表,业余独自创办智源恩创网络科技工作室。会点点Java相关技术栈、帆软报表、低代码平台快速开发。技术尚浅,闭关学习中······ 😎人生感悟:尝尽人生百味,方知世间冷暖。

    2024年02月07日
    浏览(48)
  • RabbitMQ灵活运用,怎么理解五种消息模型

    上次我们介绍了,为什么rabbitMQ会被很多人中意选型,从而成为火热的MQ组件,今天就先来说一说MQ的基础使用 ———— 其五种消息模型 我们都知道,RabbitMQ是一个使用Erlang语言,基于AMQP协议的MQ组件,那什么是AMQP协议呢,我们就从这开始今天的学习。 AMQP 全称为 Advanced Me

    2024年02月11日
    浏览(42)
  • RabbitMQ - 基于 SpringAMQP 带你实现五种消息队列模型

    目录 一、SpringAMQP 1.1、概念 1.2、前置知识(实现案例前必看!) 1.2.1、创建队列 1.2.2、创建交换机 1.2.3、创建绑定 1.2.4、@RabbitListener 注解 a)情况一:queue 存在 b)情况二:queue 不存在  1.2.5、为什么更建议使用 @Bean 注解创建,而不是 @RabbitListener 注解创建? 1.3、案例实现

    2024年04月12日
    浏览(50)
  • RabbitMq(七) -- 常见问题:幂等性问题(消息重复消费)、消息丢失

    用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。 举个最简单的例子,那就是支付,用户购买商品后支付,支付扣款成功,但是返回结果的时候网络异常, 此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返

    2024年02月05日
    浏览(39)
  • 【Java】微服务——RabbitMQ消息队列(SpringAMQP实现五种消息模型)

    微服务间通讯有同步和异步两种方式: 同步通讯:就像打电话,需要实时响应。 异步通讯:就像发邮件,不需要马上回复。 两种方式各有优劣,打电话可以立即得到响应,但是你却不能跟多个人同时通话。发送邮件可以同时与多个人收发邮件,但是往往响应会有延迟。 1.

    2024年02月08日
    浏览(65)
  • 【分布式】java实现分布式事务的五种方案

    用户支付完成会将支付状态及订单状态保存在订单数据库中,由订单服务去维护订单数据库。由库存服务去维护库存数据库的信息。下图是系统结构图: 如何实现两个分布式服务(订单服务、库存服务)共同完成一件事即订单支付成功自动减库存,这里的关键是如何保证两个

    2024年04月11日
    浏览(49)
  • 常见的五种设计模式

    https://www.runoob.com/design-pattern/factory-pattern.html **意图:**保证一个类仅有一个实例,并提供一个访问它的全局访问点。 **主要解决:**一个全局使用的类频繁地创建与销毁。 **何时使用:**当您想控制实例数目,节省系统资源的时候。 **如何解决:**判断系统是否已经有这个单例

    2024年02月07日
    浏览(44)
  • RabbitMQ工作队列模型详解:实现高效任务分配与消费

    深入探索RabbitMQ的work消息模型,学习如何在多个消费者之间有效分配任务。掌握能者多劳的策略,优化队列消费效率,提升系统性能。

    2024年02月11日
    浏览(43)
  • 跨域的五种最常见解决方案

    在开发Web应用程序时,一个常见的问题是如何处理跨域请求。跨域请求是指来自不同源的请求,这些请求可能会受到浏览器的限制而不能被正常处理。在这篇文章中,我们将探讨跨域请求的常见解决方案,并了解每种解决方案的优缺点。 一、JSONP JSONP是一种常见的跨域请求解

    2024年02月01日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包