activemq-artemis/docs/user-manual/zh/client-reconnection.xml

117 lines
9.0 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?xml version="1.0" encoding="UTF-8"?>
<!-- ============================================================================= -->
<!-- Copyright © 2009 Red Hat, Inc. and others. -->
<!-- -->
<!-- The text of and illustrations in this document are licensed by Red Hat under -->
<!-- a Creative Commons AttributionShare Alike 3.0 Unported license ("CC-BY-SA"). -->
<!-- -->
<!-- An explanation of CC-BY-SA is available at -->
<!-- -->
<!-- http://creativecommons.org/licenses/by-sa/3.0/. -->
<!-- -->
<!-- In accordance with CC-BY-SA, if you distribute this document or an adaptation -->
<!-- of it, you must provide the URL for the original version. -->
<!-- -->
<!-- Red Hat, as the licensor of this document, waives the right to enforce, -->
<!-- and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent -->
<!-- permitted by applicable law. -->
<!-- ============================================================================= -->
<chapter id="client-reconnection">
<title>客户端重新连接与会话恢复</title>
<para>通过配置HornetQ的客户端在与服务器的连接出现故障时可以自动地重新建立连接并恢复与服务器的通迅。</para>
<section>
<title>100%透明的会话恢复re-attachment</title>
<para>如果网络出现暂时性连接故障,并且服务器没有重启的情况下,当前的会话还会存在服务器中,其状态如同客户端
没有断开超过连接TTL<xref linkend="connection-ttl"/>时间。</para>
<para>在这种情况下当客户端重新连接上服务器后HornetQ自动将客户端和会话与服务器端的会话重新连接起来。整个过程
对于客户端是完全透明的,在客户端就好像什么都没有发生一样。</para>
<para>具体工作原理如下:</para>
<para>客户端再向服务器发送命令时,它将每个命令保存到内存的一块缓存中。当连接出现故障时客户端会尝试与该服务
器恢复会话。做为恢复协议的一部分服务器在会话恢复时通知客户端最后一个成功接收的命令id。</para>
<para>根据这个命令id客户端可以判断它的缓存中是否有命令还未被服务器成功接收。如果有客户端可以重新发送
这些命令。</para>
<para>缓存的大小由<literal>ConfirmationWindowSize</literal>参数决定。当服务器成功接收了
<literal>ConfirmationWindowSize</literal>字节的命令时,会向客户端发送一个命令确认,以使客户端
及时清除缓存。</para>
<para>如果使用JMS服务并且JMS的连接工厂是注册到JNDI的话相应的参数是<literal
>hornetq-jms.xml</literal>文件中的<literal
>confirmation-window-size</literal>项。如果你并不将JMS连接工厂注册到JNDI则你需要在
<literal>HornetQConnectionFactory</literal>上使用相应的方法直接设置该参数。</para>
<para>如果使用核心服务,你可以直接在<literal>ClientSessionFactory</literal>实例上直接设置该参数。</para>
<para>参数的单位是字节。</para>
<para>如果该参数是值设为<literal>-1</literal>,则关闭缓存,即关闭了重新恢复功能,迫使进行重新连接。默认
值是<literal>-1</literal>(表示没有自动恢复)。</para>
</section>
<section>
<title>会话重新连接</title>
<para>有时服务器发生故障后进行了重启。这时服务器将丢失所有当前的会话,上面所述的会话恢复就不能做到完全透明了。</para>
<para>在这种情况下HornetQ自动地重新建立连接并<emphasis role="italic">重新创建</emphasis>会话
和接收者。这一过程与向备份服务器进行失效备援failover完全一样。</para>
<para>客户重新连接的功能还用在其它一些模块上,如核心桥,以使它们能够重新连接到目标服务器上。</para>
<para>要全面理解事务性会话和非事务性会话在失效备援/重连接情况下的细节,以及如何保证<emphasis role="italic">
一次并且只有一次</emphasis>的消息传递,请参见<xref linkend="ha.automatic.failover"/>的有关内容。</para>
</section>
<section>
<title>重新连接/会话恢复的配置参数</title>
<para>下面是客户端用于重新连接的参数:</para>
<itemizedlist>
<listitem>
<para><literal>retry-interval</literal>。可选参数。它决定了两次重新连接尝试间隔的时间。单位
是毫秒。默认值是<literal>2000</literal>毫秒。</para>
</listitem>
<listitem>
<para><literal>retry-interval-multiplier</literal>。可选参数。它表示下一次重试时间间隔的
系数。即下一次重试的时间间隔是本次时间间隔乘以该参数。</para>
<para>这样可以实现重试间隔的<emphasis>指数延迟exponential backoff</emphasis></para>
<para>让我们看一个例子:</para>
<para>假设<literal>retry-interval</literal><literal>1000</literal> ms并且我们
<literal>retry-interval-multiplier</literal>设为<literal>2.0</literal>,如果
第一次尝试失败,则等待<literal>1000</literal>毫秒后进行第二次重试,如果再失败,则每三次重
试要在<literal>2000</literal>毫秒后进行,第四次要等待<literal>4000</literal>毫秒,
以此类推。</para>
<para>默认值是<literal>1.0</literal>,表示每次重试间隔相同的时间。</para>
</listitem>
<listitem>
<para><literal>max-retry-interval</literal>。可选参数。它决定了重试间的最大时间间隔。
使用<literal>retry-interval-multiplier</literal>可以使重试的时间间隔以指数级增加。
有可能造成时间间隔增加到一个非常大的数值。通过设置一个最大值可对其增长进行限制。默认
值是<literal>2000</literal>毫秒。</para>
</listitem>
<listitem>
<para><literal>reconnect-attempts</literal>。可选参数。它表示要进行多少重试后才放弃
并退出。<literal>-1</literal>表示进行无限次重试。默认值是<literal>0</literal></para>
</listitem>
</itemizedlist>
<para>如果使用JMS并且将JMS的连接工厂绑定到JNDI服务中则需要在<literal>hornetq-jms.xml</literal>
文件中对这些参数进行配置,如下例所示:</para>
<programlisting>
&lt;connection-factory name="ConnectionFactory"&gt;
&lt;connectors>
&lt;connector-ref connector-name="netty"/&gt;
&lt;/connectors>
&lt;entries&gt;
&lt;entry name="ConnectionFactory"/&gt;
&lt;entry name="XAConnectionFactory"/&gt;
&lt;/entries&gt;
&lt;retry-interval&gt;1000&lt;/retry-interval&gt;
&lt;retry-interval-multiplier&gt;1.5&lt;/retry-interval-multiplier&gt;
&lt;max-retry-interval&gt;60000&lt;/max-retry-interval&gt;
&lt;reconnect-attempts&gt;1000&lt;/reconnect-attempts&gt;
&lt;/connection-factory&gt;
</programlisting>
<para>如果使用JMS但是直接实例化JMS连接工厂你可以使用适当的方法在 <literal
>HornetQConnectionFactory</literal> 对象上直接设置这些参数。</para>
<para>如果使用核心接口直接创建 <literal
>ClientSessionFactory</literal>实例,则用它的适当的方法可以设置这些参数。</para>
<para>如果客户端重新连接后发现会话已经丢失(如服务器重启或超时),则无法完成恢复。如果在连接上或会话上注册了
<literal>ExceptionListener</literal><literal>FailureListener</literal>
它们将会被通知。</para>
</section>
<section id="client-reconnection.exceptionlistener">
<title>ExceptionListeners and SessionFailureListeners</title>
<para>请注意当客户端进行重新连接或恢复会话时注册的JMS <literal
>ExceptionListener</literal> 或核心接口的 <literal>SessionFailureListener</literal>
将会被调用。</para>
</section>
</chapter>