【发布时间】:2014-11-28 13:54:12
【问题描述】:
这里是目标:使用 Stomp 连接到 ActiveMQ 故障转移集群(主/从)的 PHP 应用程序。
以下是版本:
- 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 |活动MQ 传输: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错误。
在网上找不到太多关于此类的文档/问题..
关于实施故障转移客户端有什么建议或建议吗?
【问题讨论】:
-
故障转移不是 stomp 规范的一部分。这是一些 ActiveMQ 客户端库实现的 ActiveMQ 功能。您可能必须在通用 stomp 库中手动重新连接。
-
我遇到了同样的问题,最后我添加了一个 while 循环来连接到一个活动的 mq 代理。您始终可以连接到 vip 地址,并让 vip 服务器将请求重定向到活动代理。而且我认为 stomp-php 扩展现在不支持故障转移。
标签: php activemq failover stomp