跳到主要内容

在PubSub+ JCSMP API中配置连接超时和重试

您可以配置客户端应用程序连接到事件代理的连接超时时间和重试次数。您可以通过 PubSub+ JCSMP API 的通道属性来实现这一点。有关如何设置这些属性的信息,请参阅:

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

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

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

连接超时

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

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

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

使用 PubSub+ JCSMP API 时的注意事项

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

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

查看 JCSMP 参考指南以获取更多信息。

要设置连接超时值,请使用 JCSMPChannelProperties.setConnectTimeoutInMillis(...)

连接重试

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

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

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

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

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

要设置连接重试次数,请使用 JCSMPChannelProperties.setConnectRetries(...)

重新连接重试

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

有效范围是大于或等于 -1。值为 -1 表示始终重试;值为 0 表示不自动进行重新连接尝试。

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

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

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

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

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

有关如何在身份验证期间启用重复客户端连接替换的信息,请参阅配置重复客户端的连接行为。

要设置重新连接重试次数,请使用 JCSMPChannelProperties.setReconnectRetries(...)

重新连接重试等待

重新连接重试等待属性设置在不成功的尝试重新连接到客户端连接到的同一个主机之后等待的时间(以毫秒为单位)。此时间到期后,可以再次进行重新连接尝试。重新连接重试等待属性的有效范围是 1 或更大。

要设置重新连接重试等待时间,请使用 JCSMPChannelProperties.setReconnectRetryWaitInMillis(...)

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

每个主机的连接重试次数

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

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

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

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

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

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

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

要设置每个主机的连接重试次数,请使用 JCSMPChannelProperties.setConnectRetriesPerHost(...)

连接重试场景示例

下图显示了当使用主机列表时,连接尝试和重试属性如何影响客户端的连接尝试行为。为了演示目的,此示例展示了最坏的情况,即所有潜在的连接尝试都失败了。

连接重试属性的行为因使用的消息传递 API 而异。有关详细信息,请参阅连接重试。

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

img

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

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