澳门皇冠金沙网站-澳门皇冠844网站

热门关键词: 澳门皇冠金沙网站,澳门皇冠844网站

RabbitMQ实现消息队列的完整代码_php技巧_脚本之家

前言

MQ框架非常之多,比较流行的有RabbitMq、ActiveMq、ZeroMq、kafka。这几种MQ到底应该选择哪个?要根据自己项目的业务场景和需求。下面我列出这些MQ之间的对比数据和资料。

为什么使用RabbitMq而不是ActiveMq或者RocketMq?

第一部分:RabbitMQ,ActiveMq,ZeroMq比较

首先,从业务上来讲,我并不要求消息的100%接受率,并且,我需要结合php开发,RabbitMq相较RocketMq,延迟较低。至于ActiveMq,貌似问题较多。RabbitMq对各种语言的支持较好,所以选择RabbitMq。

1、 TPS比较一

先安装PHP对应的RabbitMQ,这里用的是 php_amqp 不同的扩展实现方式会有细微的差异.

ZeroMq 最好,RabbitMq 次之, ActiveMq 最差。这个结论来自于以下这篇文章。

php扩展地址:

其中包括持久化消息和瞬时消息的测试。注意这篇文章里面提到的MQ,都是采用默认配置的,并无调优。

具体以官网为准

图片 1

介绍

2、TPS比较二

config.php 配置信息 BaseMQ.php MQ基类 ProductMQ.php 生产者类 ConsumerMQ.php 消费者类 Consumer2MQ.php 消费者2

ZeroMq 最好,RabbitMq次之, ActiveMq最差。这个结论来自于一下这篇文章。

  [ 'host' => '127.0.0.1', 'port' => '5672', 'login' => 'guest', 'password' => 'guest', 'vhost'=>'/', ], //交换机 'exchange'=>'word', //路由 'routes' => [], ];

 conf = $conf['host'] ; $this->exchange = $conf['exchange'] ; $this->AMQPConnection = new AMQPConnection; if (!$this->AMQPConnection->connect throw new AMQPConnectionException("Cannot connect to the broker!n"); } /** * close link */ public function close() { $this->AMQPConnection->disconnect(); } /** Channel * @return AMQPChannel * @throws AMQPConnectionException */ public function channel() { if { $this->AMQPChannel = new AMQPChannel($this->AMQPConnection); } return $this->AMQPChannel; } /** Exchange * @return AMQPExchange * @throws AMQPConnectionException * @throws AMQPExchangeException */ public function exchange() { if { $this->AMQPExchange = new AMQPExchange; $this->AMQPExchange->setName; } return $this->AMQPExchange ; } /** queue * @return AMQPQueue * @throws AMQPConnectionException * @throws AMQPQueueException */ public function queue() { if { $this->AMQPQueue = new AMQPQueue; } return $this->AMQPQueue ; } /** Envelope * @return AMQPEnvelope */ public function envelope() { if { $this->AMQPEnvelope = new AMQPEnvelope(); } return $this->AMQPEnvelope; } }

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

ProductMQ.php

图片 2

 channel(); //创建交换机对象 $ex = $this->exchange(); //消息内容 $message = 'product message '.rand; //开始事务 $channel->startTransaction(); $sendEd = true ; foreach ($this->routes as $route) { $sendEd = $ex->publish ; echo "Send Message:".$sendEd."n"; } if { $channel->rollbackTransaction(); } $channel->commitTransaction(); //提交事务 $this->close(); die ; } } try{ ->run(); }catch (Exception $exception){ var_dump($exception->getMessage ; }

3、持久化消息比较

ConsumerMQ.php

zeroMq不支持,activeMq和rabbitMq都支持。持久化消息主要是指:MQ
down或者MQ所在的服务器down了,消息不会丢失的机制。

 exchange(); $ex->setType; //direct类型 $ex->setFlags; //持久化 //echo "Exchange Status:".$ex->declare()."n"; //创建队列 $q = $this->queue(); //var_dump; $q->setName; $q->setFlags; //持久化 //echo "Message Total:".$q->declareQueue()."n"; //绑定交换机与队列,并指定路由键 echo 'Queue Bind: '.$q->bind($this->exchange, $this->route)."n"; //阻塞模式接收消息 echo "Message:n"; while{ $q->consume(function { $msg = $envelope->getBody(); echo $msg."n"; //处理消息 $queue->ack($envelope->getDeliveryTag; //$q->consume('processMessage', AMQP_AUTOACK); //自动ACK应答 } $this->close(); } } try{ ->run(); }catch (Exception $exception){ var_dump($exception->getMessage ; }

4、技术点:可靠性、灵活的路由、集群、事务、高可用的队列、消息排序、问题追踪、可视化管理工具、插件系统、社区

总结

RabbitMq最好,ActiveMq次之,ZeroMq最差。当然ZeroMq也可以做到,不过自己必须手动写代码实现,代码量不小。尤其是可靠性中的:持久性、投递确认、发布者证实和高可用性。

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

所以在可靠性和可用性上,RabbitMQ是首选,虽然ActiveMQ也具备,但是它性能不及RabbitMQ。

5、高并发

从实现语言来看,RabbitMQ最高,原因是它的实现语言是天生具备高并发高可用的erlang语言。

本文由澳门皇冠金沙网站发布于编辑程序,转载请注明出处:RabbitMQ实现消息队列的完整代码_php技巧_脚本之家