RabbitMQ消息队列中间件

RabbitMq介绍

  RabbitMq是一个开源的消息代理和队列服务器,用Erlang语言开发实现了AMQP(Advanced Message Queuing Protocol)高级消息队列协议。可以跨平台跨语言及不同平台之间共享数据,给不同的语言提供了可以调用的Api。

     RabbitMq官网:www.rabbitmq.com

RabbitMq特点

  • 开源,性能优秀,稳定性保障。
  • 提供可靠性消息投递模式(confirm),返回模式(return)
  • 与SpringAMQP完美整合,API丰富。
  • 集群模式丰富,表达式配置,HA(High Available)模式,镜像队列模型。
  • 保证数据不丢失的前提下做到高可靠性,可用性。

RabbitMq安装

  因为RabbitMQ使用Erlang编写的,需要运行在Erlang运行时环境上,所以在安装RabbitMQ之前需要安装Erlang 运行时环境,可以到Erlang官网下载对应平台的安装文件。

   

     我本机是Mac系统,所以用brew下载。

     

     下载过程中如果发现brew update很慢,可以参考这两个链接

      https://www.uedbox.com/post/57246/

      https://learnku.com/articles/18908

brew install erlang

 安装时候如果出现下面错误

 可以使用下面命令解决,删除锁定文件就好

rm -rf /usr/local/var/homebrew/locks

 安装如下就可以了

 验证是否安装好erlang

 

 下面安装rabbitmq,也是通过brew来安装的

brew install rabbitmq

如果安装的过程中比较慢,可以切换brew的源,地址:https://lug.ustc.edu.cn/wiki/mirrors/help/brew.git

 我这边安装还是比较顺利,安装完毕。

 rabbitmq 服务脚本默认被安装到了/usr/local/sbin

 

 不过这个默认安装好的路径并不会自动添加到环境变量PATH中,所以需要手动将它添加到PATH。

 

 启动rabbitmq,之间输入rabbitmq-server命令即可,也可以这样rabbitmq-server start &。用rabbitmq-server -detached表示以守护进程的方式启动。

 

启动后打印出版本信息还有日志Logs,表示日志所在的路径,以及plugins(插件),前面的数字表示使用多少插件的意思。

 打开浏览器输入http://localhost:15672/就可以看到Rabbitmq登录页面。

 用户名和密码默认都是guest,输入后就可以登录到后台界面了。

RabbitMq几个重要命令

  下面这几个命令其实都是shell脚本,可以使用which命令找到它们的路径,然后使用cat命令查看内容。

  1. rabbitmqctl

     rabbitmqctl可以用于对Rabbitmq的一些控制管理操作,比如增加一个节点,添加一个用户,组建一个集群等都可以用这个命令。后面的ctl可以理解为control。

     常用的功能:

    1)rabbitmqctl  list_users命令来查看有哪些用户。

  2. rabbitmq-server
   上面的安装Rabbitmq后就是用这个命令启动的。

        

      3. rabbitmq-plugins
    管理Rabbitmq的插件的。
      常用的功能:
    1)rabbitmq-plugins list:查看插件列表信息。

         

     2)rabbitmq-plugins enable 插件名:启动某个插件。

    3) rabbitmq-plugins disenable 插件名:关闭某个插件。

RabbitMq核心概念

  Rabbitmq架构图

  

   先交代下上图的一些关键属性:

    1. Producer(生产者):上图蓝色的圆圈中字母P,是消息(Message)的生产者。

    2. Comsumer(消费者):上图蓝色的圆圈中字母C,用于消费消息(Message),多个消费者可以订阅同一个Queue。

    3. Rabbitmq Server:上图中间黑色的框里面都是属于Rabbitmq服务端。

    4. Exchange:上图中绿色的方框中字母x,是消息交换机,可以接受生产者的消息并转发,它指定消息按什么路由规则路由到哪个队列。所以Exchange和queue互相是绑定关系的。

    5. queue(队列):上图红褐色的长方体,用于存储消息。

  

  Rabbitmq工作流程简单说明:

    Producer先将消息投递给Exchange,Exchange在根据路由规则将消息路由到指定的队列queue,然后Comsumer只需要监听自己所订阅队列里的消息,消息到达后进行消费。

  Rabbitmq几个关键概念

    1. Server:也称为Broker,用于接受客户端的连接。  

    2. Connection(连接):程序客户端与Broker的网络连接。 

    3. Channel(网络信道):客户端与Rabbitmq建立了Connection后要进行操作,那么几乎所有的操作都在Channel中进行,Channel是进行消息读写的通道。客户端可以建立多个Channel,每个Channel代表一个会话任务。

    4. Message(消息):服务器与应用程序之间传递的数据,消息由Properties和Body两部分组成。Properties可以对消息进行修饰,比如消息的优先级延迟等高级属性,而Body是消息的内容。

    5. Virtual host(虚拟主机):用于进行逻辑隔离,也可以认为是不同的分类,比如有订单Virtual host,优惠券Virtual host,用于隔离不同的项目,属于是最上层的消息路由。一个Virtual host里可以有多个Exchange和queue,同一个Virtual host里面不能有同名的Exchange和queue。

    6. Binding(绑定):它的作用就是把Exchange和queue按照路由规则绑定起来,是一个虚拟连接,Binding中可以包含Routing Key。

    7. Routing Key(路由关键字):Exchange根据这个关键字进行消息投递。

  Rabbitmq工作模式

    1. 简单模式:只有一个生产者,一个消费者。

      
    2. work模式:一个生产者,多个消费者,每个消费者获取到的消息唯一。
    3. 订阅模式:一个生产者发送的消息会被多个消费者获取。
    4. 路由模式:发送消息到交换机并且要指定路由key ,消费者将队列绑定到交换机时需要指定路由key
    5. Topic模式:将路由键和某模式进行匹配,此时队列需要绑定在一个模式上,“#”匹配一个词或多个词,“*”只匹配一个词。
    6. RPC模式:

RabbitMq三种架构模式

  1. 单机模式

     常用于本地开发测试用。

  2. 普通集群模式(非高可用)

   队列的元数据存在于多个实例中,但是消息不存在多个实例中,每次多台机器上启动多个 rabbitmq 实例,每个机器启动一个。

      优点:可以多个机器消费消息,可以提高消费的吞吐量。

      缺点:可能会在 Rabbitmq 内部产生大量的数据传输,可用性基本没保障,queue 所在机器宕机,就没办法消费了。

  3. 镜像集群模式(高可用,非分布式)

     镜像集群顾名思义,每个队列的元数据和消息都会存在于多个实例中,每次写消息到 queue的时候,都会自动把消息到多个实例的 queue 里进行消息同步。也就是每个节点上都有这个 queue 的一个完整镜像(这个 queue的全部数据)。任何一个节点宕机了,其他节点还包含这个 queue的完整数据,其他 consumer 都可以到其他活着的节点上去消费数据都是 OK 的。

  缺点:不是分布式的,如果这个 queue的数据量很大,大到这个机器上的容量无法容纳 。

参考资料

  https://www.rabbitmq.com/tutorials/tutorial-one-go.html

原文地址:https://www.cnblogs.com/songgj/p/9597703.html