zoukankan      html  css  js  c++  java
  • MQ(Message Queue)的介绍和使用

    MQ(Message Queue)的介绍和使用

    ----------- A introduction and practice of message queue ------------

    李剑

    Blog: www.cnblogs.com/hustlijian

    Email: hustlijian@gmail.com

     

    什么是消息队列?

    • 在计算机科学中,消息队列(Message queue)是一种进程间通信或同一进程的不同线程间的通信方式。[1]
    • 消息发送后,可以立即返回,由消息系统来确保消息的可靠传递,消息作为应用间的一种通信方式,能够有效的降低各模块间的耦合性,提升分布式协作的效率。
    • 发布者只管把消息发布到MQ中而不管谁会来取,同样消息使用者只管从MQ取消息而不管是谁发布的。这样发布者和使用者都不用知道对方的存在。

    为什么要再讲消息队列?

    • 李白学长讲的只是linux系统中的消息队列。
    • 分布式系统中消息队列的重要性。
    • 学习新东西,==_==
    • BladeStore的测试,真是好纠结呀!!!
    • 每天就在代码中跳来跳去
    • 一个多月,就是把配置文件中的一个选项0改为1

    消息队列的存在形式

    • 系统内部,或者软件内部:
      • linux下的消息机制:见李白学长的介绍。
      • windows下的消息机制[2]: 如Win32实例
      • PS. windows下Message Queues VS Message Queuing[3]
    • 不同电脑,多个应用程序,多种操作系统:
      • 有一些优化,如系统故障中”message” 不会丢失。
      • 例如:IBM's WebSphere MQ , Oracle Advanced Queuing (AQ) ,Java standard called Java Message Service,
    • 作为服务程序: 如StormMQ、IronMQ等
    • 软件中间件:MOM(Message-oriented middleware)[4]
      有很多有名的开源软件,如Apache ActiveMQ,RabbitMQ

    消息队列标准

    新近有了三个标准:

    消息队列的架构

    • 多个生产者可以给一个消息队列发送消息
    • 多个消费者可以从一个消息队列中获得消息
    • 消息队列的设计可以保证一个消息只发送一次
    • 消费者不可达时,消息也可以到达消费者[06]

    消息队列的模型

    分布式消息的常用传输模式:点对点消息传送(P2P)[5]

    消息队列的模型

    分布式消息的常用传输模式:订阅发布(Pub/Sub)模式[5]

    RabbitMQ的介绍

    RabbitMQ的架构原理图

    RabbitMQ的介绍

      几个概念说明:
    1. Broker:简单来说就是消息队列服务器实体。
    2. Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
    3. Queue:消息队列载体,每个消息都会被投入到一个或多个队列。
    4. Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。
    5. Routing Key:路由关键字,exchange根据这个关键字进行消息投递。

    RabbitMQ的介绍

      几个概念说明:
    1. vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
    2. producer:消息生产者,就是投递消息的程序。
    3. consumer:消息消费者,就是接受消息的程序。
    4. channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。

    RabbitMQ的介绍

    RabbitMQ的使用原理图

    RabbitMQ的介绍

      消息队列的使用过程
    1. 客户端连接到消息队列服务器,打开一个channel。
    2. 客户端声明一个exchange,并设置相关属性。
    3. 客户端声明一个queue,并设置相关属性。
    4. 客户端使用routing key,在exchange和queue之间建立好绑定关系。
    5. 客户端投递消息到exchange。
    6. 接收方在接收时也是获取connection,接着获取channel,然后指定一个Queue直接到它关心的Queue上取消息,它对Exchange,RoutingKey及如何binding都不关心.

    RabbitMQ的介绍

      RabbitMQ的优点
    1. 可靠性:包括持久性保存,送达确认,发布确认,和高可用性(HA)。
    2. 弹性路由选择:自己设置exchange选项
    3. 集群:多个server可以集群为一个逻辑broker
    4. 高可用性队列:队列在多个server中备份
    5. 多客户端:支持多种语言
    6. 图形管理:监测broker信息
    7. 跟踪支持:可以跟踪系统运行状态

    消息队列实例比较

    图中显示的是发送和接受的每秒钟的消息数。整个过程共产生1百万条1K的消息。测试的执行是在一个Windows Vista上进行的。[07]

    MSMQ的介绍

    1. MSMQ的安装,查看,使用介绍
    2. 常用API
      • using System.Messaging; //添加需要的库
      • MessageQueue.Create; //建立一个消息队列
      • MessageQueue Q1 = new MessageQueue(QueueName); //建立引用
      • Q1.Send(); //发送信息
      • Q1.GetAllMessages() //获得所有信息

    Demo代码来自:[8] [9]

    RabbitMQ的安装和测试

    1. 安装环境介绍
      • 安装erlang语言环境
      • 安装RabbitMQ
      • 安装语言开发环境,如python
    2. 测试

    Demo代码参考:Rabbit官网[10],伍哥[11]

    ZeroMQ介绍

    1. ZeroMQ,一个简单、高效的MQ
    2. ZeroMQ常用API
                  zmq_ctx_new  //create new 0MQ context
                  zmq_socket   //create 0MQ socket
                  zmq_connect  //create outgoing connection from socket
                  zmq_send     //send a message part on a socket
                  zmq_recv     // receive a message part from a socket
                  zmq_close    //close 0MQ socket
                  zmq_ctx_destroy //destroy a 0MQ context
              

    PS. C语言开发测试
    python Demo参考[12],C demo参考zmq官网[13]

    总结

  • 相关阅读:
    推荐美丽的flash网页MP3音乐播放器
    android混合动画实现
    swift UI专项训练39 用Swift实现摇一摇功能
    The return type is incompatible with JspSourceDependent.getDependants():JasperException问题分析与解决方法
    【翻译自mos文章】注意: ASMB process exiting due to lack of ASM file activity
    表格对象QTableWidget相关常见方法
    python 加密解密
    python报错ordinal not in range(128)
    scp,ssh双机互信操作步骤
    PyQt多窗口调用
  • 原文地址:https://www.cnblogs.com/hustlijian/p/3038510.html
Copyright © 2011-2022 走看看