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]

总结

posted on 2013-04-23 18:27  hustlijian  阅读(7789)  评论(2编辑  收藏  举报

无觅相关文章插件,快速提升流量