zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    C语言使用正则表达式
    linux 有名管道(FIFO)
    sendto() 向广播地址发包返回errno 13, Permission denied错误
    NSUserDefaults(数据存储)
    iOS开发UI篇—UIScrollView控件实现图片缩放功能
    李洪强iOS开发之-环信02_iOS SDK 介绍及导入
    李洪强iOS开发之-环信01_iOS SDK 前的准备工作
    iOS开发UI篇—UIScrollView控件介绍
    iOS开发UI篇—iOS开发中三种简单的动画设置
    iOS开发UI篇—IOS开发中Xcode的一些使用技巧
  • 原文地址:https://www.cnblogs.com/songgj/p/9597703.html
Copyright © 2011-2022 走看看