Chapter 36. 核心桥

桥的功能是从一个源队列中接收消息,再将消息转发到目的地址。通常这个目的地址在另外一个HornetQ服务器中。

源与目的不需要在同一个集群中。所以桥很适合将消息从一个集群中可靠地转发到另一个集群。比如通过一个WAN,或 internet,等连接不稳定的网络。

桥有处理故障的能力。如果目的服务器的连接失败(像网络故障),桥会重试与目的服务器的连接,直接连接成功 为止。当连接成功后,桥则继续进行工作。

总之,桥是可靠连接两个HornetQ服务器的一种手段。使用核心桥时源和目的服务器必须都是HornetQ服务器。

桥可以通过配置提供一次且只有一次的传递保证。其采用的方法是重复检测(详细 描述在Chapter 37, 重复消息检测)。

Note

核心桥的功能与JMS桥的功能相似,但是不能将它们混淆!

核心桥用来连接两个HornetQ节点,它不使用JMS接口。JMS桥使用的是JMS接口,它连接的是任何两个符合 JMS 1.1规范的服务器。因此,JMS桥可以将两个不同的JMS服务器连接起来。从性能角度考虑,核心桥由于采用 重复检测来实现一次且只一次的传递保证,可以提供更高的性能。 JMS桥则需要使用XA这种复杂的机制来提供同样的传递保证,因些性能要比核心桥低。

36.1. 桥的配置

桥的配置在hornetq-configuration.xml文件中。让我们先看一个配置的例子 (它实际上出自bridge例子):

<bridge name="my-bridge">
    <queue-name>jms.queue.sausage-factory</queue-name>
    <forwarding-address>jms.queue.mincing-machine</forwarding-address>
    <filter-string="name='aardvark'"/>
    <transformer-class-name>
        org.hornetq.jms.example.HatColourChangeTransformer
    </transformer-class-name>
    <retry-interval>1000</retry-interval>
    <retry-interval-multiplier>1.0</retry-interval-multiplier>
    <reconnect-attempts>-1</reconnect-attempts>
    <failover-on-server-shutdown>false</failover-on-server-shutdown>
    <use-duplicate-detection>true</use-duplicate-detection>
    <confirmation-window-size>10000000</confirmation-window-size>
    <connector-ref connector-name="remote-connector" 
        backup-connector-name="backup-remote-connector"/>     
    <user>foouser</user>
    <password>foopassword</password>
</bridge>                        
        

在上面的配置中包括了桥的所有参数。在实际应用中可能其中很多的参数可以使用默认值,不需要在配置中 指定。

下面我们对每个参数分别说明:

  • name参数。所有桥都必须有一个唯一的名字。

  • queue-name。本地队列的名字。桥从本地队列中接收消息。 这是一个必要的参数。

    这个队列在桥的启动之前必须已经存在。

    Note

    如果使用JMS,JMS的配置文件hornetq-jms.xml在核心配置文件 hornetq-configuration.xml之后装载。所以如果你的桥要从JMS 队列接收消息,就需要保证JMS队列同时要作为核心队列部署。具体方法可以参见 bridge例子。

  • forwarding-address。目的服务器中的地址。消息将被转发到这个地址。 如果没有指定这个转发地址,消息的原始地址将会保留。

  • filter-string。一个可选的过滤器表达式。它表示只有过滤器表达式选择 的消息才被转发。过滤器表达式的语法参见 Chapter 14, 过滤器表达式

  • transformer-class-name。可选的转换器类名。这是一个用户定义的 类,它需要实现接口org.hornetq.core.server.cluster.Transformer

    如果指定了这个类,每当一个消息被转发之前,它的transform()方法 就会被调用。用户利用这个机会可以对消息本身或消息头信息进行修改。

  • retry-interval。这个可选参数决定了在进行连接重试时,两次重试 之间的时间间隔。默认值是2000毫秒。

  • retry-interval-multiplier。这个可选参数基于前一次重试连接 的时间间隔来计算下一次重试的间隔,即前一次的间隔乘以该参数。

    这样可以实现重试间隔的指数延迟(exponential backoff)

    让我们看一个例子:

    假设retry-interval1000 ms,并且我们 将retry-interval-multiplier设为2.0,如果 第一次尝试失败,则等待1000毫秒后进行第二次重试,如果再失败,则每三次重 试要在2000毫秒后进行,第四次要等待4000毫秒, 以此类推。

    默认值是1.0,表示每次重试间隔相同的时间。

  • reconnect-attempts。可选参数。它表示要进行多少重试后才放弃 并退出。-1表示进行无限次重试。默认值是-1

  • failover-on-server-shutdown。可选参数。它指定了当目的服务器正常 退出时桥是否尝试失效备援(failover)到备份服务器(如果配置了的话)上。

    桥的连接器可以配置一个主服务器和一个备份服务器。如果配置了备份服务器,并且这个参数是 true时,在主服务器正常退出时,桥会自动地连接到备份服务器上继续工作。 如果桥的连接器没有配置备份服务器,则这个参数不起作用。

    你的桥配置了备份服务器后,有时你需要临时将主服务器关闭进行一些维护,此时并不希望桥连接到备份服务 器中。使用该参数就可以达到这个目的。

    这个参数的默认值是false

  • use-duplicate-detection。可选参数。它控制桥是否在转发的消息中自动 添加一个重复ID的属性。

    添加这样一个属性可以使目的服务器对来自源服务器的消息进行重复检测。当出现连接故障或服务器崩溃时, 桥在恢复时将重新转发那些没有被通知的消息。这在目的服务器端有可能造成重复发送。使用重复检测功能,可 以将重复发送的消息过滤掉。

    使用这个功能,服务器就可以保证 一次并且只有一次的传递,而不需要使用 重量级的方法,如XA(参见 Chapter 37, 重复消息检测)。

    默认的值是true.

  • confirmation-window-size。这个可选参数决定了向目的服务器转发消息时 所使用的确认窗口的大小。详细的描述在Chapter 34, 客户端重新连接与会话恢复

    Warning

    当桥从一个设置了max-size-bytes参数的队列接收并转发消息时,一个重要的事情就是要将 confirmation-window-size的值设置为小于等于 max-size-bytes的值,以避免造成消息流的停止。

  • connector-ref。这是一个必需的参数。它指定了桥用来连接目的服务器的 连接器

    connector包含了所用的传输(TCP, SSL, HTTP等),以及服务器连接参数 (如主机名,端口等)。关于连接器的详细信息请参见(Chapter 16, 传输层的配置)。

    connector-ref有两个参数:

    • connector-name。这个指的是核心配置文件hornetq-configuration.xml中定义的连接器的名字。桥使用 这个连接器创建与目的服务器的连接。这个参数是必需指定的。

    • backup-connector-name。这个可选参数同样指定一个在核心 配置文件hornetq-configuration.xml中定义的连接器名字。 当目的服务器出现故障时,或者正常退出但是参数failover-on-server-shutdown的值设为true时,桥使用这个参数指定的连接器通过失效备援(failover)连接 到备用的服务器。

  • user。这个可选参数指定了桥在创建与远程服务器连接时所用的用户名。如果 没有指定用户名,在配置文件hornetq-configuration.xmlcluster-user所定义的默认集群用户名将被使用。

  • password。这个可选的参数给出的是桥创建与远程服务器连接所使用的密码。 如果没有指定密码,在配置文件hornetq-configuration.xmlcluster-password所定义的默认集群密码将被使用。