【发布时间】:2023-04-03 03:48:01
【问题描述】:
在我们的架构中,即使与本地网络的连接丢失,JMS 发布者也可以继续工作(并生成新消息)。是否可以使用 JMS 使发布服务器能够容忍网络或代理中断:
- 发布调用可能不会阻止应用程序,即使代理不可用;
- 已发布的消息(中断期间)必须在网络连接恢复后传递;
据我了解,可以在每台发布机器上使用嵌入式(本地)代理来完成。如果这是唯一的方法,那么该拓扑是否存在任何不明显的问题 - 性能、维护等?本地代理是否能够自行容忍中断?
【问题讨论】:
在我们的架构中,即使与本地网络的连接丢失,JMS 发布者也可以继续工作(并生成新消息)。是否可以使用 JMS 使发布服务器能够容忍网络或代理中断:
据我了解,可以在每台发布机器上使用嵌入式(本地)代理来完成。如果这是唯一的方法,那么该拓扑是否存在任何不明显的问题 - 性能、维护等?本地代理是否能够自行容忍中断?
【问题讨论】:
我没有尝试过,但您似乎可以使用本地故障转移来降低阻抗: 使用 ActiveMQ,您可以配置故障转移传输:
failover:(tcp://primary:61616,tcp://secondary:61616)?randomize=false
尝试绘制这个:
client +---> primary: network broker <-------+
| |
+---> secondary: embedded broker -----+
这里的主要代理是您的网络代理,而您的二级代理是本地嵌入的代理,具有与主要代理的桥接。当客户端发布分配时,这似乎会很好用;我不确定这对于订阅者是否会比@Biju 提出的解决方案更好:如下图所示:
client +---> secondary: embedded broker ------> primary: network broker
例如,这是我的嵌入式代理(通常是非持久的)。
<bean id="activeMQBroker" class="org.apache.activemq.broker.BrokerService">
<property name="transportConnectors">
<list>
<bean id="brokerConnection" class="org.apache.activemq.broker.TransportConnector">
<property name="connectUri">
<bean id="brokerURI" class="java.net.URI">
<constructor-arg value="tcp://localhost:61616" />
</bean>
</property>
</bean>
</list>
</property>
<property name="persistent" value="true" />
</bean>
【讨论】:
我能想到的唯一方法就是按照你的建议 -
【讨论】:
如果队列管理器\代理在您描述的情况下非常常见,则分布式架构。
确切的配置取决于您使用的特定产品,但它通常有据可查且易于管理
关于本地冗余,您可以在容错配置中使用两个这样的队列管理器(同样——创建容错集群的确切方法取决于产品)——但这似乎有点过头了。
JMS只对消息队列提供者的API进行标准化,其他的
【讨论】: