activemq

来源:互联网 发布:网络平台招商加盟 编辑:程序博客网 时间:2024/05/21 18:39

假设你喜欢用PHP构建WEB应用,然后还有一些外围的应用,包括移动终端APP,mobile web等,

由于mobile app等是非PHP语言所编写如ObjectiveC、Java等,然后你想在这些客户端应用程序之间共享某些基础服务,

希望这些基础服务以一种松耦合,高扩展性,高性能的方式来提供,那么一个比较好的解决方案是使用跨平台的消息中间件ActiveMQ。

对于PHP客户端而言,要使用ActiveMQ,可以使用两种方式,一种是rest方式(基于HTTP),一种是借助Stomp:

http://en.wikipedia.org/wiki/Streaming_Text_Orientated_Messaging_Protocol

基于rest是无状态的,而基于Stomp则要求保持连接(Stomp基于TCP协议)。

基于rest方式,可阅读如下链接,本文不做详解:

http://activemq.apache.org/rest.html


下面具体示例PHP如何使用Stomp:

[php] view plaincopy
  1. //send a message to the queue    
  2. function sendMQ($data) {    
  3.     $link = openMQ();    
  4.     foreach ($data as $pitem) {    
  5.         //使用 persistent message    
  6.         $result = stomp_send($link$amq['queue'], $pitemarray("persistent" => "true"));    
  7.         if (FALSE === $result) {    
  8.             //do something    
  9.         }    
  10.     }    
  11. }    
  12.     
  13. //receive message    
  14. function receiveMQ() {    
  15.     $link = openMQ($queue);    
  16.     stomp_subscribe($link$queue);    
  17.     
  18.     while (1) {    
  19.         if (TRUE === stomp_has_frame($link)) {    
  20.             $frame = stomp_read_frame($link);    
  21.     
  22.             if (FALSE !== $frame) {    
  23.                 stomp_ack($link$frame['headers']['message-id']);    
  24.             } else {    
  25.                 //do something    
  26.                 break;    
  27.             }    
  28.         } else {    
  29.             break;    
  30.         }    
  31.     }    
  32.     stomp_unsubscribe($link$queue);    
  33.     stomp_close($link);    
  34. }    
  35.     
  36. //connection ActiveMQ    
  37. function openMQ(&$queue=FALSE) {    
  38.     $amq = array(    
  39.         'url' => 'tcp://127.0.0.1:61613',    
  40.         'id' => 'xxx',    
  41.         'pswd' => 'xxx',    
  42.         'queue' => '/queue/mytest',    
  43.         'enable' => TRUE    
  44.     );    
  45.     $link = stomp_connect($amq['url'], $amq['id'], $amq['pswd']);    
  46.     if (!$link) {    
  47.         die("Can't connect MQ !!");    
  48.     } else {    
  49.         return $link;    
  50.     }    
  51. }    

注意Stomp读取方需要调整prefetchSize,如下:

[php] view plaincopy
  1. stomp_subscribe($link$queuearray("activemq.prefetchSize" => 1000));    

否则可能会发现读取消息非常缓慢。prefetchSize字段含义如下:

Specifies the maximum number of pending messages that will be dispatched to the client. 

Once this maximum is reached no more messages are dispatched until the client acknowledges a message. 

Set to 1 for very fair distribution of messages across consumers where processing messages can be slow.

详细原因可仔细阅读:ActiveMQ In Action 一书。


参考资料:

Apache ActiveMQ - Enterprise messaging in actionstomp进阶说明-prefetchSize、ack header

ActiveMQ extensions to Stomp

stomping-with-php-intergration-with-activemq

0 0
原创粉丝点击