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 | ОТЛАДКА | Транспортное соединение с:
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.readHeaderLine (StompWireFormat.java:155)
в org.apache.activemq.transport.stomp.StompWireFormat.readLine (StompWireFormat.java:148)
в org.apache.activemq.transport.stomp.StompWireFormat.parseAction (StompWireFormat.java:170)
в org.apache.activemq.transport.stomp.StompWireFormat.unmarshal (StompWireFormat.java:98)
в org.apache.activemq.transport.tcp.TcpTransport.readCommand (TcpTransport.java:229)
в org.apache.activemq.transport.tcp.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 ошибка.

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

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

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;
}
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]