RabbitMQ 本文共有3938个字,关键词: RabbitMQ是什么? RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性方面表现不俗。 RabbitMQ主要是为了解决系统之间的双向解耦而实现的,当生产者大量产生数据的时,消费者无法快速消费,那么需要一个中间层保存这个数据。 rabbitmq是一个消息代理,一个消息系统的媒介,它可以为你的应用提供一个通用的消息发送和接收平台,并保证消息在传输过程中的安全。 随着系统压力的增大和系统解耦的急迫性,各大应用之间通过消息队列互相连接起来组成一个更大的应用,并且消息系统通过将消息的发送和接收分离来实现应用程序的异步和解耦。 通过接入rabbitmq解决了数据传递,非阻塞操作和推送通知的操作,实现了发布/订阅、异步处理和工作队列的问题。 RabbitMQ的特点: ①可靠性:RabbitMQ提供了多种技术,可以让使用者在性能和可靠之间进行权衡,这些技术包括持久性机制、投递确认、发布者证实和高可用性机制。 ②灵活的路由: 消息队列到达队列前是通过交换器进行路由的,RabbitMQ为典型的路由逻辑提供了多种交换器类型,如果使用者有更复杂的路由需求,可以将这些交换器组合起来使用,甚至可以实现自己的交换器类型,并当做RabbitMQ的插件来使用。 RabbitMQ提供的内置交换器4中类型中,我们常使用到的有三种,分别是:direct exchange(直连交换器)、topic exchange(主题交换器)、fanout exchange(扇形交换器),RabbitMQ支持多种中间件协议。 ③集群:在相同的局域网中的多个RabbitMQ服务器可以聚合在一起,作为一个逻辑代理来使用。 ④高可用队列:在同一个集群中,队列可以被镜像到多个物理机器中,以确保当中某些硬件故障后消息仍然安全。 ⑤广泛的客户端:只要是能够想到的编程语言,几乎都有与其相适配的RabbitMQ客户端 ⑥可视化管理工具:RabbitMQ给我们提供了易于使用的可视化管理工具,它可以帮助使用者监控信息代理的每一个环节 Direct exchange(直连交换器) ![](http://fxme.top/usr/uploads/2019/04/260936530.png) 转发消息到routingkey(路由键)指定的队列,routingkey是一个消息的原属性,由生产者加在消息头中。 XQ1 有一个routingkey,routingkey为orange XQ2 有两个routingkey,routingkey为black和green 当消息队列的routingkey(路由键)和routingkey对应时,这个消息去往对应的队列中。 topic exchange(主题交换器) 按规则(通配符)转发消息,这种交换机制下,队列和交换机的绑定会定义一种路由模式,通配符就是要在这种路由模式和路由键之间匹配后,交换器才能够进行消息的转发 ![](http://fxme.top/usr/uploads/2019/04/728014181.png) XQ1 有一个路由模式*.orange.*来匹配任何A.orange.B类似的路由键的消息 XQ2 有两个路由模式*.*.rabbit和lazy.#来匹配任何A.B.rabbit和lazy.A、lazy.A.B或者lazy.A.B.C,其中“#”表示一个或多个单词 主题交换器严格区分*.*和lazy.#,在生产环境中尽量不要使用#作为routingkey(路由键) 在指定路由键的时候最好指定准确的路由键作为routingkey fanout exchange(扇形交换器) 转发消息到所有的绑定队列,如果有不同的consumer(消费者)需要对童谣的消息进行不同的处理,使用这种方式是很有用的。 这种类型的交换器,不管是路由键或者是路由模式,会把消息发送给绑定给它的全部队列。 ![](http://fxme.top/usr/uploads/2019/04/2833314823.png) RabbitMQ的模型 RabbitMQ使用的是AMQP协议,这是一种二进制协议,默认启用的端口为5672 ![](http://fxme.top/usr/uploads/2019/04/2002774866.png) P代表消息生产者,也就是网RabbitMQ发消息的程序 中间件为RabbitMQ,其中包括交换器和队列 C代表消费者,也就是从RabbitMQ拿消息的程序 RabbitMQ的集群 RabbitMQ搭建有三种模式,其中集群模式有两种 ①单一模式 单机情况不做集群,单独运行一个RabbitMQ ②普通模式 默认模式,以两个节点(node_01、node_02)为例来进行说明,对于Queue来说,消息实体只是存在于其中的一个节点(node_01或node_02),node_01和node_02有相同的元数据,即队列结构,当消息进入node_01节点的Queue后,consumer从node_02节点消费时,RabbitMQ会临时在node_01、node_02间进行消息传输,将node_01中的消息实体取出并经过node_02发送给consumer,所以consumer应当尽量连接每一个节点,从中获取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue,否则无论consumer连接node_01或者node_02,出口总在node_01,这样会产生瓶颈,当node_01节点故障,node_02节点无法获取到node_01节点中还未消费的消息实体,如果消息做了持久化,那么就得等node_01节点恢复,然后才可以消费,如果没有做持久化,就会产生消息丢失的现象。 ③镜像模式 把需要的队列做成镜像队列存在于多个节点,属于RabbitMQ的HA方案,该模式下解决了普通模式中的问题,其实和普通模式不同之处在于,消息实体会主动的在镜像节点间同步,而不是在客户端取数据的时候临时拉取,该模式带来的副作用也很明显,除了降低系统的性能外,如果奖项队列数量过多,加之大量的消息进入,集群内部的带宽将会被这种同步通讯大大消耗,所以在对可靠性要求较高的场合中适用。 RabbitMQ集群搭建的注意事项 ①所有机器上,运行的erlang和rabbitmq的版本需相同(否则RabbitMQ之间不能连接到一起) ②所有机器上erlang的cookie需要相同,将/var/lib/rabbitmq/.erlang.cookie复制到其他节点,保证一直,且权限的设置要符合标准(属主属组为rabbiymq) ~]# chown rabbitmq.rabbitmq /var/lib/rabbitmq/.erlang.cookie #修改后需重启服务 两个节点的RabbitMQ集群搭建 搭建epel源,配置主机名DNS解析, ~]# yum install erlang ~]# yum -y install rabbitmq-server ~]# rabbitmq-server -detached #启动 #将/var/lib/rabbitmq/.erlang.cookie复制到其他节点,并修改属主属组 node_01操作: ~]# rabbitmqctl stop_app ~]# rabbitmqctl reset ~]# rabbitmqctl join_cluster rabbit@node_02 #加入node_02集群中 ~]# rabbitmqctl start_app node_02上查看加入集群的状态 ~]# rabbitmqctl cluster_status ~]# netstat -antp #查看rabbitmq之间建立的连接 新增用户: ~]# rabbitmqctl add_user admin 123456 #新添加用户admin,并指定密码123456 ~]# rabbitmqctl set_user_tags admin administrator ~]# rabbitmqctl set_permissions -p / admin ".*" ".*" ".*" #给用户admin授予默认vhost"/"read/write/configure权限 开启图形化管理界面 ~]# rabbitmq-plugins enable rabbitmq_management #访问http://RabbiyMq_Server_IP:15672 #建议使用rabbitmq3.6.9以上的版本和erlang最新的版本 「一键投喂 软糖/蛋糕/布丁/牛奶/冰阔乐!」 赞赏 × 几人行 (๑>ڡ<)☆谢谢老板~ 2元 5元 10元 50元 100元 任意金额 2元 使用微信扫描二维码完成支付 版权声明:本文为作者原创,如需转载须联系作者本人同意,未经作者本人同意不得擅自转载。 服务 2019-04-27 评论 2657 次浏览