JMS容错异步发布服务器

问题描述:

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

  1. 发布调用可能不会阻止应用程序,即使代理不可用;
  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> 
+0

好吧,但我怎么做第二个经纪人本身容忍连接损失?经纪人之间的什么类型的连接应该是防止第二人在网络连接恢复后死亡,挂起和保证消息传递? – Shcheklein 2011-03-02 16:48:06

+1

嵌入式代理通常有一个文件存储区,用于将传入消息写入。桥应该容忍连接丢失(从我记忆中)。请参阅http://activemq.apache.org/jms-to-jms-bridge.html。 – Justin 2011-03-02 16:55:24

+0

带故障转移传输的嵌入式代理至今仍在运行。但是,Active MQ中存在一个错误,它可以防止在订户进程中使用嵌入式代理:[AMQ-3213](http://issues.apache.org/jira/browse/AMQ-3213)。有时,即使使用一个嵌入式代理(发布者)和一个远程代理也会发生同样的问题。解决方案似乎是正确的,AMQ似乎是越野车。 – Shcheklein 2011-04-12 15:39:53

,我能想到的唯一的办法是沿着你所建议的线 -

  1. 具有本地嵌入式代理,并从该嵌入式代理到基于网络的经纪人提供了一个桥梁。即使是当地的一个虽然可以往下走,所以你可以有你的资源之间的事务发布(DB和JMS基础设施)
  2. 不要直接发布,而是有其缓冲它的抽象 - 到数据库,文件,或像上面到一个本地嵌入式jms,并从缓冲区向JMS队列提供如上所示的桥接。
+0

我想,如果嵌入式代理出现故障,可以考虑像致命错误出版商,如果数据库层是这样下来 – Shcheklein 2011-03-02 14:00:03

+0

“的抽象,它缓冲... “ - 完全!但我希望能够提供这种功能。为什么我需要JMS,如果我不得不为其编写额外的缓冲和持久层? – Shcheklein 2011-03-02 14:03:22

+0

@Shcheklein,真的,如果消息源(数据库说)和目的地(jms队列)可以被拉入到一个公共事务(XA) – 2011-03-02 14:45:50

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

的确切配置取决于您使用的具体产品,但它通常是有据可查的,易于管理

关于本地冗余,可以使用两个这样的队列管理器的容错配置(再次 - 确切的方法创建容错集群依赖于产品) - 但这看起来有些过度。

JMS规范只有消息队列提供的API,其他

+0

这是JMS“规范”中最令人沮丧的方面(安全性也没有定义)。您可以编写完美的可移植JMS代码,但不能部署即可使用。 – Justin 2011-03-03 01:35:27