博客
关于我
RabbitMQ 工作模式
阅读量:377 次
发布时间:2019-03-05

本文共 3141 字,大约阅读时间需要 10 分钟。

RabbitMQ 概述

RabbitMQ 是一个消息代理,负责接收和转发消息。可以将它想象成一个邮局:当你把你想要邮寄的邮件放入一个邮箱时,你可以确定邮递员先生或女士最终会把邮件送到你的收件人那里。RabbitMQ 和邮局的主要区别在于,它不处理纸张,而是接受、存储和转发二进制数据消息。

核心概念

  • Server(Broker):接受客户端连接,实现AMQP实体服务。
  • Connection:连接和具体broker网络连接。
  • Channel:网络信道,几乎所有操作都在channel中进行,channel是消息读写的通道。客户端可以建立多个channel,每个channel表示一个会话任务。
  • Message:消息,服务器和应用程序之间传递的数据,由properties和body组成。properties可以对消息进行修饰,比如消息的路由键,交换区,队列,优先级,延迟,delivery-mode等高级特性;body是消息实体内容。
  • Virtual host:虚拟主机,用于逻辑隔离,最上层消息的路由。一个Virtual host可以若干个Exchange和Queue,同一个Virtual host不能有同名的Exchange或Queue。vhost 是 AMQP 概念的基础,必须在连接时指定,RabbitMQ 默认的 vhost 是 /
  • Exchange(交换机):交换机,接受消息,根据路由键转发消息到绑定的队列上。
  • Binding:Exchange和Queue之间的虚拟连接,binding中可以包括routing key。
  • Routing key:一个路由规则,虚拟机根据它来确定如何路由一条消息。
  • Queue(队列):消息队列,用来存放消息的队列。
  • 工作模式

    "Hello World" 示例

    Producer端

  • 创建连接工厂:
    ConnectionFactory factory = new ConnectionFactory();
  • 设置参数:
    factory.setHost("localhost");factory.setPort(5672);factory.setVirtualHost("/hello");factory.setUsername("guest");factory.setPassword("guest");
  • 创建连接:
    Connection connection = factory.newConnection();
  • 创建Channel:
    Channel channel = connection.createChannel();
  • 创建队列:
    channel.queueDeclare("hello_world", true, false, false, null);
  • 发送消息:
    for (int i = 0; i < 10; i++) {    String body = i + "hello rabbitmq!";    channel.basicPublish("", "hello_world", null, body.getBytes());}
  • 释放资源:
    channel.close();connection.close();
  • Consumer端

  • 创建连接工厂:
    ConnectionFactory factory = new ConnectionFactory();
  • 设置参数:
    factory.setHost("localhost");factory.setPort(5672);factory.setVirtualHost("/hello");factory.setUsername("guest");factory.setPassword("guest");
  • 创建连接:
    Connection connection = factory.newConnection();
  • 创建Channel:
    Channel channel = connection.createChannel();
  • 创建队列:
    channel.queueDeclare("hello_world", true, false, false, null);
  • 接收消息:
    Consumer consumer = new DefaultConsumer(channel) {    @Override    public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {        System.out.println("body = " + new String(body));    }};channel.basicConsume("hello_world", true, consumer);
  • 任务队列

    默认情况下,RabbitMQ 会将每条消息依次发送给下一个消费者。平均而言,每个消费者将获得相同数量的消息。

    发布/订阅

    Direct Exchange

    Direct 交换机的绑定规则基于路由键。消息的路由键必须与绑定的路由键完全匹配,才能被路由到目标队列。

    Multiple bindings

    可以将多个队列绑定到同一个交换机。消息的路由键需要匹配多个绑定的路由键之一,才能被路由到目标队列。

    Topic Exchange

    Topic 交换机支持通配符匹配。路由键可以包含通配符(如*和#),使交换机能够更灵活地路由消息。

    Headers Exchange

    Headers 交换机根据消息的头部属性(header)来进行路由匹配。

    RPC

    如果我们需要在远程计算机上运行一个函数并等待结果,可以使用RabbitMQ构建一个RPC系统。客户端发送请求消息,服务器用响应消息进行响应。通过设置回调队列和correlationId,可以实现请求-响应的通信。

    路由规则

    Direct Exchange

    可以通过绑定路由键来指定消息的路由目标。例如:

    • 消息路由键为error,会被路由到test_direct_queue1
    • 消息路由键为info, error, warning,会被路由到test_direct_queue2

    Topic Exchange

    路由键可以包含通配符(如*和#),使交换机能够更灵活地路由消息。例如:

    • 路由键为hw.#,可以匹配hw.insert.abchw.insert
    • 路由键为hw.*,只能匹配hw.insert

    Headers Exchange

    通过消息头部属性(headers)来进行路由匹配。例如:

    • 消息头部属性为routing_key=error,可以被路由到对应的队列。

    图片说明

    由于图片无法直接嵌入,以下是图片描述:

    • 生产者:发送消息的程序。
    • 队列:消息通过RabbitMQ和你的应用程序传递,但它们只能存储在队列中。队列只受主机内存的约束,磁盘限制它本质上是一个大的消息缓冲区。
    • 消费者:等待接收消息的程序。

    总结

    RabbitMQ 消息模型的核心思想是,生产者从不直接向队列发送任何消息。实际上,通常情况下,生产者甚至根本不知道消息是否会被传递到任何队列。交换机是消息传输的中间产物,它接收来自生产者的消息,并根据路由规则将消息推送到目标队列。消费者则通过监听队列来接收消息。RabbitMQ 提供了多种工作模式,包括简单消息队列、任务队列、发布/订阅模式以及远程过程调用(RPC)。

    转载地址:http://sqtg.baihongyu.com/

    你可能感兴趣的文章
    nginx 1.24.0 安装nginx最新稳定版
    查看>>
    nginx 301 永久重定向
    查看>>
    nginx css,js合并插件,淘宝nginx合并js,css插件
    查看>>
    Nginx gateway集群和动态网关
    查看>>
    Nginx Location配置总结
    查看>>
    Nginx log文件写入失败?log文件权限设置问题
    查看>>
    Nginx Lua install
    查看>>
    nginx net::ERR_ABORTED 403 (Forbidden)
    查看>>
    Nginx SSL私有证书自签,且反代80端口
    查看>>
    Nginx upstream性能优化
    查看>>
    Nginx 中解决跨域问题
    查看>>
    nginx 代理解决跨域
    查看>>
    Nginx 动静分离与负载均衡的实现
    查看>>
    Nginx 反向代理 MinIO 及 ruoyi-vue-pro 配置 MinIO 详解
    查看>>
    nginx 反向代理 转发请求时,有时好有时没反应,产生原因及解决
    查看>>
    Nginx 反向代理解决跨域问题
    查看>>
    Nginx 反向代理配置去除前缀
    查看>>
    nginx 后端获取真实ip
    查看>>
    Nginx 多端口配置和访问异常问题的排查与优化
    查看>>
    Nginx 如何代理转发传递真实 ip 地址?
    查看>>