php队列数据 php栈与队列的区别( 五 )


几个重要概念:
Broker:简单来说就是消息队列服务器实体 。
Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列 。
Queue:消息队列载体,每个消息都会被投入到一个或多个队列 。
Binding:绑定 , 它的作用就是把exchange和queue按照路由规则绑定起来 。
Routing Key:路由关键字 , exchange根据这个关键字进行消息投递 。
vhost:虚拟主机 , 一个broker里可以开设多个vhost,用作不同用户的权限分离 。
producer:消息生产者 , 就是投递消息的程序 。
consumer:消息消费者 , 就是接受消息的程序 。
channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务 。
消息队列的使用过程,如下:
(1)客户端连接到消息队列服务器,打开一个channel 。
(2)客户端声明一个exchange,并设置相关属性 。
(3)客户端声明一个queue,并设置相关属性 。
(4)客户端使用routing key , 在exchange和queue之间建立好绑定关系 。
(5)客户端投递消息到exchange 。
exchange接收到消息后,就根据消息的key和已经设置的binding,进行消息路由,将消息投递到一个或多个队列里 。
5.3 ZeroMQ
号称史上最快的消息队列,它实际类似于Socket的一系列接口 , 他跟Socket的区别是:普通的socket是端到端的(1:1的关系) , 而ZMQ却是可以N:M 的关系,人们对BSD套接字的了解较多的是点对点的连接,点对点连接需要显式地建立连接、销毁连接、选择协议(TCP/UDP)和处理错误等,而ZMQ屏蔽了这些细节,让你的网络编程更为简单 。ZMQ用于node与node间的通信 , node可以是主机或者是进程 。
引用官方的说法: “ZMQ(以下ZeroMQ简称ZMQ)是一个简单好用的传输层,像框架一样的一个socket library,他使得Socket编程更加简单、简洁和性能更高 。是一个消息处理队列库,可在多个线程、内核和主机盒之间弹性伸缩 。ZMQ的明确目标是“成为标准网络协议栈的一部分,之后进入Linux内核” 。现在还未看到它们的成功 。但是,它无疑是极具前景的、并且是人们更加需要的“传统”BSD套接字之上的一 层封装 。ZMQ让编写高性能网络应用程序极为简单和有趣 。”
特点是:
高性能,非持久化;
跨平台:支持Linux、Windows、OS X等 。
多语言支持; C、C++、Java、.NET、Python等30多种开发语言 。
可单独部署或集成到应用中使用;
可作为Socket通信库使用 。
与RabbitMQ相比,ZMQ并不像是一个传统意义上的消息队列服务器,事实上,它也根本不是一个服务器,更像一个底层的网络通讯库,在Socket API之上做了一层封装,将网络通讯、进程通讯和线程通讯抽象为统一的API接口 。支持“Request-Reply “,”Publisher-Subscriber“,”Parallel Pipeline”三种基本模型和扩展模型 。
ZeroMQ高性能设计要点:
1、无锁的队列模型
对于跨线程间的交互(用户端和session)之间的数据交换通道pipe,采用无锁的队列算法CAS;在pipe两端注册有异步事件,在读或者写消息到pipe的时,会自动触发读写事件 。
2、批量处理的算法
对于传统的消息处理,每个消息在发送和接收的时候,都需要系统的调用,这样对于大量的消息,系统的开销比较大,zeroMQ对于批量的消息,进行了适应性的优化,可以批量的接收和发送消息 。
3、多核下的线程绑定,无须CPU切换
区别于传统的多线程并发模式,信号量或者临界区,zeroMQ充分利用多核的优势,每个核绑定运行一个工作者线程 , 避免多线程之间的CPU切换开销 。

推荐阅读