ActiveMQ в аварийном переключении с клиентом PHP / Stomp

вот цель: приложение PHP, подключающееся к отказоустойчивому кластеру ActiveMQ (Master / Slave) с помощью Stomp.

Вот версии:

  • ActiveMQ 5.7
  • PHP Stomp 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 | DEBUG | Транспортное соединение с: 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 в java.io.DataInputStream.readByte (DataInputStream.java:267) в org.apache.activemq.transport.stomp.StompWireFormat ( StompWireFormat.java:155) на org.apache.activemq.transport.stomp.StompWireFormat.readLine (StompWireFormat.java:148) на org.apache.activemq.transport.stomp.StompWireFormatorm70parseAction (StompWireFormatorm70) или наForWireFormatorm70parseAction: .apache.activemq.transport.stomp.StompWireFormat.unmarshal (StompWireFormat.java:98) в org.apache.activemq.transport.tcp.TcpTransport.readCommand (TcpTransport.java:229) в org.pachensport.active .TcpTransport.doRun (TcpTransport.java:221) в org.apache.activemq.transport.tcp.TcpTransport.run (TcpTransport.java:204) в 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 ошибке.

Не могу найти в Интернете много документов или проблем по этой теме ..

Любые рекомендации или советы по реализации отказоустойчивого клиента?


person chilladx    schedule 03.10.2014    source источник
comment
Аварийное переключение не является частью спецификации. Это функция ActiveMQ, которую реализуют некоторые клиентские библиотеки ActiveMQ. Вероятно, вам придется повторно подключиться вручную в общей библиотеке Stomp.   -  person Petter Nordlander    schedule 04.10.2014
comment
У меня была такая же проблема, но в итоге я добавил цикл while для подключения к активному брокеру mq. Вы всегда можете подключиться к vip-адресу и позволить vip-серверу перенаправить запрос активному брокеру. И я не думаю, что сейчас расширение Stamp-php поддерживает аварийное переключение.   -  person 蒋艾伦    schedule 03.03.2015


Ответы (1)


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;
    }
}
person akinzhou    schedule 22.12.2016