вот цель: приложение PHP, подключающееся к отказоустойчивому кластеру ActiveMQ (Master / Slave) с помощью Stomp.
Вот версии:
Вот установка:
< ? 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
ошибка.
Не могу найти много документов / проблем в Интернете о такой вещи ..
Любая рекомендация или совет по реализации отказоустойчивого клиента?
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;
}
}
Других решений пока нет …