分布式

RabbitMQ系列-1.初识RabbitMQ

2019-06-07  本文已影响0人  Tian_Peng

概述

    RabbitMQ是目前非常热门的一款消息中间件,不管是互联网行业还是传统行业都在大量地使用 。 RabbitMQ 凭借其高可靠、易扩展、高可用及丰富的功能特性受到越来越多企业的青睐

RabbitMQ的基本模型

    所有MQ产品从模型抽象上来说都是一样的过程:生产者(producer)创建消息,然后发布到队列(queue)中,最后将消息发送到监听的消费者,消费者(consumer)来消费某个队列中的消息


消息中间件的概念模型

上面只是一个宏观上抽象的描述,而具体到RabbitMQ则有更详细的内部结构:


RabbitMQ的内部结构
想要理解RabbitMQ,我们需要认识一些基本概念:
/**
 * FileName: MessageProducer
 * Author:   TP
 * Date:     2019-06-07 18:56
 * Description:消息生产者
 */
public class MessageProducer {
    //交换器名称
    private static final String EXCHANGE_NAME = "exchange_demo";
    //路由键
    private static final String ROUTING_KEY = "routingKey_demo";
    //队列名称
    private static final String QUEUE_NAME = "queue_demo";
    //IP地址
    private static final String IP_ADDRESS = "127.0.0.1";
    //端口(RabbitMQ服务端口默认为5672)
    private static final int PORT = 5672;
    //用户名
    private static final String USER_NAME = "admin";
    //密码
    private static final String PASS_WORD = "admin";

    public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {
        //创建连接工厂
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost(IP_ADDRESS);
        connectionFactory.setPort(PORT);
        connectionFactory.setUsername(USER_NAME);
        connectionFactory.setPassword(PASS_WORD);
        //获取连接
        Connection connection = connectionFactory.newConnection();
        //创建信道
        Channel channel = connection.createChannel();
        //创建一个类型为direct、持久化的、非自动删除的交换器
        channel.exchangeDeclare(EXCHANGE_NAME, "direct", true, false, null);
        //创建一个持久化、非排他、非自动删除的队列
        channel.queueDeclare(QUEUE_NAME, true, false, false, null);
        //将交换机与队列通过路由键绑定(绑定key和路由key使用同一个)
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY);
        //发送一条持久化的消息:HELLO Rabbit MQ
        String message = "HELLO Rabbit MQ";
        channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());
        //关闭资源
        channel.close();
        connection.close();
    }
}

以上代码声明了一个direct类型的交换器,然后将交换器和队列绑定起来。channel.queueBind方法中本该使用BindingKey,却和channel.basicPublish方法同样使用了RoutingKey,这样做的潜台词是:这里的RoutingKey和BindingKey是同一个东西。在direct交换器类型下, RoutingKey和BindingKey需要完全匹配才能使用,所以上面代码中采用了此种写法会显得方便许多。
所以在很多人的代码中可能习惯性地将BindingKey写成RoutingKey,尤其是在使用 direct类型的交换器的时候。
但是在topic交换器类型下,RoutingKey和BindingKey之间需要做模糊匹配,两者并不是相同的。

交换器(Exchange)类型

RabbitMQ 常用的交换器类型有 fanout、 direct、 topic、 headers 这四种 。 AMQP 协议里还提
到另外两种类型: System 和自定义,这里不予描述。对于这四种类型下面一一阐述。

RabbitMQ的运转流程

生产者端

消费者端

在接下来的文章中我们将讲解RabbitMQ的安装与演示Java客户端的使用

上一篇 下一篇

猜你喜欢

热点阅读