跳到主要内容

配置连接超时和重试

您可以配置客户端应用程序连接到事件代理的连接超时时间和重试次数。您可以使用JCSMP API的通道属性,或者Java RTO、C和.NET API的会话属性。有关如何设置这些属性的信息,请参阅:

  • 连接超时
  • 连接重试
  • 重新连接重试
  • 重新连接重试等待
  • 每个主机的连接重试次数

有关这些会话属性在客户端连接尝试时如何相互作用的示例,请参阅“连接重试示例场景”,有关列出多个主机的更多信息,请参阅“主机”。

不同API的连接超时、重试和重试等待时间的默认值有所不同。要查看默认值,请参阅不同PubSub+消息API的参考文档。

连接超时

连接超时属性是指会话建立与事件代理连接的最大时间(以毫秒为单位)。

当使用主机列表时,连接超时属性设置的时间将应用于对每个主机的连接尝试。例如,如果列出了四个主机条目,在最坏的情况下,应用程序可能需要等待每个主机条目的连接超时时间,乘以连接尝试次数,才能收到连接成功或连接失败的通知。此等待时间还会因每次连接到主机失败后发生的“重新连接重试等待”时间而延长。

如果套接字层检测到连接失败,连接尝试可能会更快终止。

使用JCSMP时的注意事项

当使用JCSMP时,还适用以下注意事项:

  • 如果客户端应用程序使用的操作系统设置了最大TCP连接超时值,且该值小于API连接超时值(ConnectTimeoutInMillis),则操作系统的最大TCP连接超时值将决定连接尝试何时超时。
  • 如果客户端无法在为读取超时(readTimeoutInMillis)属性配置的时间内完成认证,则会话将被断开连接。如果发生这种情况,您可以增加读取超时值。
  • 当发布大型JMS消息(90MB或更大)时,处理时间可能会超过默认的10秒读取超时周期。您可以通过以下命令更改读取超时值:
setReadTimeoutInMillis
public void setReadTimeoutInMillis(int readTimeoutInMillis)

请参阅JCSMP参考指南以获取更多信息。

设置连接超时值

PubSub+消息API属性
JCSMPJCSMPChannelProperties.setConnectTimeoutInMillis(...)
Java RTOSessionHandle.PROPERTIES.CONNECT_TIMEOUT_MS
CSOLCLIENT_SESSION_PROP_CONNECT_TIMEOUT_MS
.NETSessionProperties.ConnectTimeoutInMsecs
JavaScript和Node.jssolace.SessionProperties.connectTimeoutInMsecs

连接重试

连接重试属性设置会话尝试与主机事件代理建立初始连接的重试次数。

连接重试属性的有效范围为-1或更大。值为-1表示无限重试;值为0表示不自动重试连接(即尝试一次后放弃)。

如果使用主机列表,API将尝试连接到列表中的第一个事件代理。如果该尝试失败,API将等待“重新连接重试等待”属性设置的时间,然后再次尝试连接到同一个主机(“每个主机的连接重试次数”属性的值决定了在尝试连接到下一个主机之前,对一个主机的连接尝试次数)。API将按列表中列出的顺序依次尝试连接到主机条目。

如果连接重试属性大于0,API可以在无法连接到列表中的任何主机后,从主机列表的开头重新开始连接尝试。每次API遍历主机列表而未建立连接都被视为一次连接重试。例如,对于连接重试值为2的情况,API可能会在未连接到任何主机的情况下,最多三次遍历所有列出的主机:一次用于初始连接尝试,然后两次用于每次连接重试。每次连接重试都从列表中的第一个主机开始。

对于JCSMP

连接重试值指的是包括初始连接尝试在内的总连接尝试次数。例如,在JCSMP中将连接重试值设置为3,将导致最多3次连接尝试:一次初始尝试和两次重试。

对于Java RTO、C和.NET API

连接重试值严格指的是总连接重试次数,不包括初始连接尝试。例如,在Java RTO、C或.NET API中将连接重试值设置为3,将导致最多4次连接尝试:一次初始尝试和三次重试。

设置连接重试次数

PubSub+消息API属性
JCSMPJCSMPChannelProperties.setConnectRetries(...)
Java RTOSessionHandle.PROPERTIES.CONNECT_RETRIES
CSOLCLIENT_SESSION_PROP_CONNECT_RETRIES
.NETSessionProperties.ConnectRetries
JavaScript和Node.jssolace.SessionProperties.connectRetries

重新连接重试

重新连接重试属性设置在已连接的会话中断后,尝试重新连接到主机的次数。

有效范围为大于或等于-1。值为-1表示无限重试;值为0表示不自动尝试重新连接。

如果使用主机列表,此属性设置API将尝试重新连接到列表中的一个主机的次数。也就是说,如果API无法连接到列表中的第一个事件代理(即首选事件代理),它将尝试连接到下一个列出的事件代理,依此类推。API将尝试连接到每个主机的次数由“每个主机的连接重试次数”属性设置的值决定,然后尝试连接到下一个主机。

每次连接尝试失败后,API将等待“重新连接重试等待”属性设置的时间到期,然后尝试连接到同一个主机、下一个列出的主机,或者在所有列出的主机都尝试过之后,再次尝试连接到列表中的第一个主机。

在启用了事件代理冗余的情况下(即列出的主机IP地址被一对冗余事件代理使用),应该指定多次重新连接。禁用重新连接重试可能会影响在使用主动/主动冗余时可能发生的活动切换,并可能导致服务中断。例如,在故障切换场景中,如果没有启用重新连接重试,则无法尝试连接到冗余事件代理。

Solace建议您将重新连接重试值设置为在转向替代错误处理方法之前愿意尝试的最大尝试次数。在这种情况下,您可能遇到了无法通过重新连接会话到主机来解决的问题,需要进一步考虑。例如,调查事件代理的问题。

对于JCSMP

自动重新连接频率限制用于防止客户端在四秒内(默认值)重新连接超过十次。如果事件代理允许在认证期间替换重复的客户端连接,当使用具有相同客户端用户名的多个客户端时,它们可能会进入一个循环,其中一个客户端连接后,另一个客户端连接时将其断开。如果这些客户端的“重新连接重试”值不为零,每次一个断开连接的客户端成功重新连接时,它会断开另一个已连接的客户端。自动重新连接频率限制确保这种客户端连接/重新连接循环不会无限期发生。

有关如何在认证期间启用重复客户端连接替换的更多信息,请参阅“配置重复客户端的连接行为”。

设置重新连接重试次数

PubSub+消息API属性
JCSMPJCSMPChannelProperties.setReconnectRetries(...)
Java RTOSessionHandle.PROPERTIES.RECONNECT_RETRIES
CSOLCLIENT_SESSION_PROP_RECONNECT_RETRIES
.NETSessionProperties.ReconnectRetries
JavaScript和Node.jssolace.SessionProperties.reconnectRetries

重新连接重试等待

重新连接重试等待属性设置在尝试重新连接到客户端之前连接的主机失败后等待的时间(以毫秒为单位)。此时间到期后,可以再次尝试重新连接。重新连接重试等待属性的有效范围为1或更大。

如果API遍历主机列表中的所有条目而未建立连接,并且允许连接重试(因为连接重试属性大于0),API将等待“重新连接重试等待”属性设置的时间,然后再次尝试连接到主机列表中的第一个主机。

设置重新连接重试等待时间

PubSub+消息API属性
JCSMPJCSMPChannelProperties.setReconnectRetryWaitInMillis(...)
Java RTOSessionHandle.PROPERTIES.RETRY_WAIT_MS
CSOLCLIENT_SESSION_PROP_RECONNECT_RETRY_WAIT_MS
.NETSessionProperties.ReconnectRetriesWaitInMsecs
JavaScript和Node.jssolace.SessionProperties.reconnectRetryWaitInMsecs

每个主机的连接重试次数

当使用主机列表时,“每个主机的连接重试次数”属性设置在尝试连接或重新连接会话到一个主机失败后,尝试连接或重新连接到下一个主机之前的次数。

值为0表示进行一次连接或重新连接尝试(即0次重试)。值为-1表示尝试无限次连接或重新连接重试(在这种情况下,API仅尝试连接或重新连接到列表中的第一个主机)。

如果对主机的连接或重新连接尝试不成功,API必须 等待“重新连接重试等待”属性设置的时间,然后才能进行另一次连接或重新连接尝试。

应用程序断开连接和保证消息

如果客户端应用程序断开连接,API将尝试重新连接到它之前连接的事件代理,如果失败,则尝试连接到下一个列出的主机,依此类推。如果应用程序在重新连接到新主机之前已发布保证消息,则新主机可能没有所需的保证消息发布者状态,以与API就最后接收/确认的消息达成一致。因此,API将重置发布者流状态,重新编号并重新发送任何未确认的消息。

如果新主机被配置为原始主机的复制伙伴,则重新发送消息可能会导致重复,因为原始消息可能已成功发送到伙伴,尽管从API的角度来看它们未被确认。在这种情况下,由接收应用程序以适当的方式解决这种重复。

对于API版本7.1.2之前的版本,如果在发布保证消息后重新连接到不同的主机,API将关闭新创建的会话并引发会话事件——应用程序负责重新连接并重新发送任何未确认的已发布消息。要使用这种传统行为,您必须将通道或会话属性的重新连接失败操作更改为适当的非默认值。有关更多信息,请参阅PubSub+消息API。

设置每个主机的连接重试次数

PubSub+消息API属性
JCSMPJCSMPChannelProperties.setConnectRetriesPerHost(...)
Java RTOSessionHandle.PROPERTIES.CONNECT_RETRIES_PER_HOST
CSOLCLIENT_SESSION_PROP_CONNECT_RETRIES_PER_HOST
.NETSessionProperties.ConnectRetriesPerHost
JavaScript和Node.jssolace.SessionProperties.connectRetriesPerHost

连接重试示例场景

下图展示了当使用主机列表时,连接尝试和重试属性如何影响客户端的连接尝试行为。为了演示目的,此示例展示了最坏的情况,即所有可能的连接尝试均未成功。

连接重试属性的行为因使用的消息API而异。有关更多信息,请参阅“连接重试”。

使用主机列表时的连接尝试行为

img

每次API遍历主机列表中的所有条目而未建立连接时,都被视为一次连接尝试或重试。因此,如果在初始连接尝试期间未建立与列出的主机之一的连接,则连接重试值为2意味着API可以再次遍历主机列表两次(同样,每个列出的主机可以在每次连接重试中尝试两次)。每次连接重试都从第一个主机开始,并按列出的顺序依次尝试。

因此,在最坏的情况下,API可能会在未连接到主机的情况下,最多三次遍历主机列表(一次用于初始连接尝试,然后两次用于连接重试),并且由于每个主机的连接重试值为2,每个主机将尝试两次,因此最多可以进行32次连接尝试。