JMS容错异步发布者

时间:2011-03-02 11:14:39

标签: java jms messaging

在我们的体系结构中,即使与本地网络的连接丢失,JMS发布者也可以继续工作(并生成新消息)。是否可以使发布服务器容忍JMS的网络或代理中断:

  1. 发布呼叫可能不会阻止申请,即使经纪人不可用;
  2. 必须在恢复网络连接后发送已发布的消息(在中断期间);
  3. 据我所知,可以在每台发布机上使用嵌入式(本地)代理完成。如果这是唯一的方法,那么该拓扑是否有任何明显的问题 - 性能,维护等?本地经纪人能否自行容忍中断?

3 个答案:

答案 0 :(得分:2)

我没试过这个,但似乎你可以使用本地故障转移来减少阻抗: 使用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>

答案 1 :(得分:0)

我能想到的唯一方法就是你提出的方法 -

  1. 拥有本地嵌入式代理,并提供从此嵌入式代理到基于网络的代理的桥接。即使是本地的,也可能会崩溃,因此您可能必须在资源(db和jms基础架构)之间进行事务性发布。
  2. 不要直接发布,而是有一个缓冲它的抽象 - 到上面的数据库,文件等本地嵌入式jms,并提供如上所述的桥接器从缓冲区到JMS队列。

答案 2 :(得分:0)

如果队列管理器\代理在您描述的情况下非常常见,则采用分布式体系结构。

确切的配置取决于您使用的特定产品,但通常记录良好且易于管理

关于本地冗余,您可以在容错配置中使用两个这样的队列管理器(再次 - 创建容错簇的确切方法取决于产品) - 但这似乎是一些过度杀伤。

JMS仅标准化消息队列提供程序的API,其他