本文实例讲述了 PHP 高级编程之音讯队列原理与实现办法。分享给大家供大家参考,具体如下:
- 什么是音讯队列
音讯队列(英语:Message queue)是一种过程间通信或同一过程的不同线程间的通信形式
- 为什么应用音讯队列
音讯队列技术是分布式应用间替换信息的一种技术。音讯队列可驻留在内存或磁盘上, 队列存储音讯直到它们被应用程序读出。通过音讯队列,应用程序可独立地执行,它们不须要晓得彼此的地位、或在继续执行前不须要期待接管程序接管此音讯。
- 什么场合应用音讯队列
你首先须要弄清楚,音讯队列与近程过程调用的区别,在很多读者征询我的时候,我发现他们须要的是 RPC(近程过程调用),而不是音讯队列。
音讯队列有同步或异步实现形式,通常咱们采纳异步形式应用音讯队列,近程过程调用多采纳同步形式。
MQ 与 RPC 有什么不同?MQ 通常传递无规则协定,这个协定由用户定义并且实现存储转发;而 RPC 通常是专用协定,调用过程返回后果。
- 什么时候应用音讯队列
同步需要,近程过程调用 (PRC) 更适宜你。
异步需要,音讯队列更适宜你。
目前很多音讯队列软件同时反对 RPC 性能,很多 RPC 零碎也能异步调用。
音讯队列用来实现下列需要
① 存储转发
② 分布式事务
③ 公布订阅
④ 基于内容的路由
⑤ 点对点连贯
- 谁负责解决音讯队列
通常的做法,如果小的我的项目团队能够有一个人实现,包含音讯的推送,接管解决。如果大型团队,通常是定义好消息协定,而后各自开发各自的局部,例如一个团队负责写推送协定局部,另一个团队负责写接管与解决局部。
那么为什么咱们不讲音讯队列框架化呢?
框架化有几个益处:
① 开发者不必学习音讯队列接口
② 开发者不须要关怀音讯推送与接管
③ 开发者通过对立的 API 推送音讯
④ 开发者的重点是实现业务逻辑性能
- 怎么实现音讯队列框架
上面是作者开发的一个 SOA 框架,该框架提供了三种接口,别离是 SOAP,RESTful,AMQP(RabbitMQ),了解了该框架思维,你很容易进一步扩大,例如减少 XML-RPC, ZeroMQ 等等反对。
本文只讲音讯队列框架局部。
6.1. 守护过程
音讯队列框架是本地应用程序(命令行程序),咱们为了让他在后盾运行,须要实现守护过程。
每个实例解决一组队列,实例化须要提供三个参数,$queueName = ‘ 队列名 ’, $exchangeName = ‘ 替换名 ’, $routeKey = ‘ 路由 ’
$daemon = new frameworkRabbitDaemon($queueName = ’email’, $exchangeName = ’email’, $routeKey = ’email’);
守护过程须要应用 root 用户运行,运行后会切换到普通用户,同时创立过程 ID 文件,以便过程进行的时候应用。
守护过程外围代码
6.2. 音讯队列协定
音讯协定是一个数组,将数组序列化或者转为 JSON 推送到音讯队列服务器,这里应用 json 格局的协定。
$msg = array(
'Namespace'=>'namespace',
"Class"=>"Email",
"Method"=>"smtp",
"Param" => array($mail, $subject, $message, null)
);
序列化后的协定
{“Namespace”:”single”,”Class”:”Email”,”Method”:”smtp”,”Param”:[流量交易 ”netkiller@msn.com”,”Hello”,” TestHelloWorld”,null]}
应用 json 格局是思考到通用性,这样推送端能够应用任何语言。如果不思考兼容,倡议应用二进制序列化,例如 msgpack 效率更好。