вот цель: приложение 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
ошибке.
Не могу найти в Интернете много документов или проблем по этой теме ..
Любые рекомендации или советы по реализации отказоустойчивого клиента?