簡體   English   中英

使用PHP / Stomp客戶端進行故障轉移的ActiveMQ

[英]ActiveMQ in failover with PHP/Stomp client

這是目標:一個使用Stomp連接到ActiveMQ故障轉移群集(主/從)的PHP應用程序。

這些是版本:

  • ActiveMQ 5.7
  • PHP踐踏1.0.5穩定
  • PHP 5.4.4-14 + deb7u14(CLI)

這是設置:

  • 2台帶有ActiveMQ的服務器;
  • 在兩台服務器上安裝keepalived ,共享VIP
  • PHP腳本如下
 < ? php $queue = '/queue/test'; try { $stomp = new Stomp("tcp://VIP:61613"); } catch(StompException $e) { die('Connection failed: ' . $e->getMessage()); } $stomp->subscribe($queue); while ($stomp->hasFrame()) { $frame = $stomp->readFrame(); var_dump($frame); print_r($frame->headers["message-id"]."\\n"); if ($stomp->ack($frame)) print_r("Frame ACK!\\n"); else die("ACK Error"); } ?> 

隨之而來的消息數量,我們在ActiveMQ調試日志中得到了這類錯誤

2014-10-03 13:19:13,941 | 調試| 傳輸連接到:tcp://127.0.0.1:37125失敗:java.io.EOFException | org.apache.activemq.broker.TransportConnection.Transport | ActiveMQ傳輸:tcp:///127.0.0.1:37125 @ 61613 java.io.EOFException,位於org.apache.activemq.transport.stomp.StompWireFormat.readHeaderLine(的java.io.DataInputStream.readByte(DataInputStream.java:267) org.apache.activemq.transport.stomp.StompWireFormat.java:155)org.org.apache.activemq.transport.stomp.StompWireFormat.parseAction(StompWireFormat.java:170) org.apache.activemq.transport.tcp.TcpTransport.readCommand(TcpTransport.java:229)上的.apache.activemq.transport.stomp.StompWireFormat.unmarshal(StompWireFormat.java:98)在org.apache.activemq.transport.tcp上org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:204)處的.TcpTransport.doRun(TcpTransport.java:221)在java.lang.Thread.run(Thread.java:745)

這導致STOMP連接斷開,並導致我們遇到其他問題。

看來ActiveMQ錯誤可能與keepalived設置有關,更好的配置是在客戶端中使用故障轉移方案。

我們在Stomp對象創建中嘗試了以下連接字符串:

> failover://tcp://IP1:61613,tcp://IP2:61613
> failover:tcp://IP1:61613,tcp://IP2:61613
> failover://(tcp://IP1:61613,tcp://IP2:61613)
> failover:(tcp://IP1:61613,tcp://IP2:61613)

但是它們都會導致Invalid broker URI錯誤。

在網絡上找不到有關此類事情的大量文檔/問題。

關於實施故障轉移客戶端的任何建議或建議?

默認情況下,PHP Stomp不支持故障轉移,您必須自己實現以支持它,如以下示例所示:

$urls = array('ip1:61613','ip2:61613');
$conn = null;
foreach ($urls as $url) {
    $url = "tcp://".$url;
    try {
        $conn = new \Stomp($url,$user,$passwd);
    } catch(\Exception $e) {
    }
    if ($this->conn) {
        break;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM