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
消息队列的存在形式
- 系统内部,或者软件内部:
- 不同电脑,多个应用程序,多种操作系统:
- 有一些优化,如系统故障中”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
消息队列标准
新近有了三个标准:- Advanced Message Queuing Protocol,高级消息队列协议
- MQTT(MQ Telemetry Transport),
- Streaming Text Oriented Messaging Protocol
消息队列的架构
- 多个生产者可以给一个消息队列发送消息
- 多个消费者可以从一个消息队列中获得消息
- 消息队列的设计可以保证一个消息只发送一次
- 消费者不可达时,消息也可以到达消费者[06]
消息队列的模型
分布式消息的常用传输模式:点对点消息传送(P2P)[5]
消息队列的模型
分布式消息的常用传输模式:订阅发布(Pub/Sub)模式[5]
RabbitMQ的介绍
RabbitMQ的架构原理图
RabbitMQ的介绍
- 几个概念说明:
- Broker:简单来说就是消息队列服务器实体。
- Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
- Queue:消息队列载体,每个消息都会被投入到一个或多个队列。
- Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。
- Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
RabbitMQ的介绍
- 几个概念说明:
- vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
- producer:消息生产者,就是投递消息的程序。
- consumer:消息消费者,就是接受消息的程序。
- channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。
RabbitMQ的介绍
RabbitMQ的使用原理图
RabbitMQ的介绍
- 消息队列的使用过程
- 客户端连接到消息队列服务器,打开一个channel。
- 客户端声明一个exchange,并设置相关属性。
- 客户端声明一个queue,并设置相关属性。
- 客户端使用routing key,在exchange和queue之间建立好绑定关系。
- 客户端投递消息到exchange。
- 接收方在接收时也是获取connection,接着获取channel,然后指定一个Queue直接到它关心的Queue上取消息,它对Exchange,RoutingKey及如何binding都不关心.
RabbitMQ的介绍
- RabbitMQ的优点
- 可靠性:包括持久性保存,送达确认,发布确认,和高可用性(HA)。
- 弹性路由选择:自己设置exchange选项
- 集群:多个server可以集群为一个逻辑broker
- 高可用性队列:队列在多个server中备份
- 多客户端:支持多种语言
- 图形管理:监测broker信息
- 跟踪支持:可以跟踪系统运行状态
消息队列实例比较
图中显示的是发送和接受的每秒钟的消息数。整个过程共产生1百万条1K的消息。测试的执行是在一个Windows Vista上进行的。[07]
MSMQ的介绍
- MSMQ的安装,查看,使用介绍
- 常用API
- using System.Messaging; //添加需要的库
- MessageQueue.Create; //建立一个消息队列
- MessageQueue Q1 = new MessageQueue(QueueName); //建立引用
- Q1.Send(); //发送信息
- Q1.GetAllMessages() //获得所有信息
ZeroMQ介绍
- ZeroMQ,一个简单、高效的MQ
- 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