RabbitMQ:基础,运行和管理

        在本章中我们来学习一下RabbitMQ的基础知识以及相关的相关运行和管理。
        RabbitMQ是一个高性能的工业级的AMQP协议、使用erlang语言创建的开源的消息服务器,可以同步或异步发送或接受消息。

        RabbitMQ基础知识
        Broker:简单来说就是消息队列服务器实体,可以把一个rabbitmq server当作一个broker。       
        Exchange交换机:
        Exchange负责对消息进行路由,是一个路由规则。当收到 Publisher 传递给它的消息后,Exchange会根据路由键routing_key决定将消息加入到哪些消息队列中。
        RabbitMQ有四种类型的exchange:direct,fanout,topic,headers,经常使用的是下面三种:
        Direct Exchange:处理路由键,使用一个固定字符串作为路由键routing_key,若exchange和message queue 绑定的key和routing_key一样时,消息会被路由到绑定的这个 message queue中。

        Fanout Exchange:不处理路由键,会将发布的消息路由到该注册Exchange的所有的message queue中,和ActiveMQ的发布订阅模式很像。

        Topic Exchange:主题交换类型,routing key 中可以包括通配符。这里使用的通配符主要是"*"和"#",比如用户生名了两个queue: Q1(routing_key="rk.*")和Q2(routing_key="rk.#"),现在有人向Q1和Q2所绑定的topic exchange发布了2条消息,routing_key分别为"rk.1"和"rk.m.2",那么Q1只能接受到rk.1的这条消息,而Q2则可接受到这两条消息。
        通配符:* 表示一个词 # 表示0个或多个词。

        Queue队列:
        消息队列载体,每个消息都会被投入到一个或多个队列。
        Binding绑定:
        它的作用就是把exchange和queue按照路由规则绑定起来。
        vhost虚拟主机:
        一个broker里可以开设多个vhost,用作不同用户的权限分离,也可以把他看作明名空间。
        Routing_Key路由关键字:exchange根据这个关键字进行消息投递。
        Channele消息通道:在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。

        持久化消息和非持久化消息
        默认情况下,用户发送的消息是非持久化的,也就是说如果要接收消息的rabbitmq server宕机——在没有被消费者接收处理之前,重新启动后消息将不存在,及消息会丢失。
        在学习如何将消息“装配”成持久化消息之前,我们先看一下Exchange和Queue的类型。实际上rabbitmq中的交换机Exchange和消息队列Queue都分为持久化和非持久化的两种类型,当然消息Message也分为持久化和非持久化的,并且在默认情况下都是非持久化的。也就是说默认情况下用户创建的exchange、queue在服务器重启后都将不存在——服务器不会重建(re-create),消息也会lost,其元数据信息回报存在服务器的内存中而非写道服务器的磁盘上。
        如果用户想要发布持久化的消息,那么需要满足一下3个条件:
        1、将消息发布模式选项设置为2;
        2、将消息发布到一个持久化的exchange;
        3、消息最终保存到一个持久化的queue。
        但是,持久化的消息相对于非持久化的消息来说,服务器性能麾下将很多。

        消息生产者如何确认消息发布成功呢?
        默认情况下,当用户也即消息生产者将消息发不出去后,会发生什么事情呢?答案是什么也不会发生——对用户来说。这也就是说,消息发布后,就没有消息生产者什么事儿了,用户就不知道消息是发布成功了还是失败了。
        那么,如果用户也即消息生产者想要知道自己是否成功发送消息的话,可以使用“transations”和“publisher confirms”这两种方式来处理消息发送。transations,也就是事务——就像是传统数据库中的事务,提交后会给发布者返回发布是否成功的信息。publisher confirms和transations都会接收到消息是否发布成功的信息,两者不同的是,transations是同步的,而publisher confirms方式是异步的。

        RabbitMQ运行和管理
        下面是一些常用的rabbitmq启动和停止操作:
引用

        # cd /opt/mq/rabbitmq/sbin
        # ./rabbitmq-server //启动服务器
        # ./rabbitmqctl start_app //启动application
        # ./rabbitmqctl stop //停止服务器
        # ./rabbitmqctl stop_app //停止application

       


        常用的rabbitmq服务管理操作:
引用

        # ./rabbitmqctl list_vhosts  //查看当前rabbitmq上的vhost列表
        # ./rabbitmqctl add_vhost demo //添加名为"demo"的vhost虚拟主机
        # ./rabbitmqctl delete_vhost demo  //删除名为"demo"的vhost虚拟主机

        # ./rabbitmqctl list_users  //查看当前rabbitmq上的user列表
        # ./rabbitmqctl add_user test test  //添加test用户并将密码设置为test
        # ./rabbitmqctl delete_user test  //删除test用户
        # ./rabbitmqctl change_password test test2 //将test用户的密码修改为test2
        # ./rabbitmqctl clear_password test //清除test用户的密码

        //设置或修改用户权限
        # ./rabbitmqctl set_permissions -p demo test ".*" ".*" ".*"
           -p demo:demo虚拟主机
           test:要赋予权限的用户,即给用户test在demo虚拟主机上赋予权限
           ".*" ".*" ".*":用户test在demo虚拟主机上赋予权限,按顺序为configure(配置)、write(写)和read(读)的权限
           ".*"表示米陪任何exchange和queue;""表示不匹配任何的exchange和queue;另外还有另外一种匹配方式——正则式匹配,如"checker-*"表示匹配任何以checker-开头的任何的exchange和queue。
        # ./rabbitmqctl list_permissions -p demo //查看demo虚拟主机上用户权限列表
        # ./rabbitmqctl list_user_permissions test //查看test用户在所有虚拟主机的配置权限列表
        # ./rabbitmqctl clear_permissions -p demo test //删除demo虚拟主机上test用户的权限

        # ./rabbitmqctl list_queues
        # ./rabbitmqctl list_queues -p demo
        # ./rabbitmqctl list_queues name durable auto_delete //查看队列详细信息:名字 是否持久化 是否自动删除

        # ./rabbitmqctl list_exchanges
        # ./rabbitmqctl list_exchanges -p demo

        # ./rabbitmqctl list_bindings
        # ./rabbitmqctl list_bindings -p demo

        # ./rabbitmqctl list_consumers
        # ./rabbitmqctl list_consumers -p demo

        # ./rabbitmqctl status
        # ./rabbitmqctl report

       

猜你喜欢

转载自flyingdutchman.iteye.com/blog/1911179