服务发现通信行为
启动行为
服务发现将根据服务实例处于以下三个阶段之一:
• 初始等待阶段
• 重复阶段
• 主要阶段
一旦系统启动并且用于服务实例的接口连接已建立,服务发现将进入该服务实例的初始等待阶段。
在进入初始等待阶段并在发送第一条服务实例的消息之前,服务发现实现应根据初始延迟(INITIAL_DELAY)进行等待。
初始延迟(INITIAL_DELAY)应定义为最小延迟和最大延迟。
等待时间应通过在最小延迟和最大延迟之间选择一个随机值来确定。
为了将不同类型的多个条目合并为较少的消息数,服务发现应使用相同的随机值。
在发送第一条消息之后,进入该服务实例/这些服务实例的重复阶段。
服务发现实现应根据 REPETITIONS_BASE_DELAY 在重复阶段进行等待。
在重复阶段发送的消息之间的延迟会加倍。
在重复阶段期间,服务发现应仅发送 REPETITIONS_MAX 个数据包。
如果 REPETITIONS_MAX 设置为0,则应跳过重复阶段,并在初始等待阶段后进入服务实例的主要阶段。
在重复阶段之后,将进入服务实例的主要阶段。
在重复阶段,如果配置了 CYCLIC_OFFER_DELAY,则应周期性地发送Offer Messages和Publish Messages。
在进入主要阶段后,等待1*CYCLIC_OFFER_DELAY时间后再发送第一条消息。
在发送特定服务实例的消息后,服务发现会在发送下一条服务实例的消息之前等待1*CYCLIC_OFFER_DELAY时间。
对于请求/订阅,应使用参数CYCLIC_REQUEST_DELAY实现与Offer相同的周期行为,而不是CYCLIC_OFFER_DELAY。
示例:
初始等待阶段:
• 等待范围为(INITIAL_DELAY_MIN, _MAX)的随机延迟
• 发送消息
重复阶段 (REPETITIONS_BASE_DELAY=100ms, REPETITIONS_MAX=2):
• 等待 2^0*100ms
• 发送消息
• 等待 2^1*100ms
• 发送消息
• 等待 2^2*200ms
主要阶段 (只要消息处于活动状态且定义了CYCLIC_OFFER_DELAY):
• 发送消息
• 等待 CYCLIC_OFFER_DELAY
服务器响应行为
服务发现应该延迟多播/广播应答,以响应对于查找服务条目和查找事件组条目的请求,以及对于请求服务条目和订阅事件组条目的多播/广播应答。延迟的时间由REQUEST_RESPONSE_DELAY定义。
如果通过单播消息回答单播消息,则不应用REQUEST_RESPONSE_DELAY。
延迟仅适用于Instance ID设置为ANY(0xFFFF)的查找服务和查找事件组消息。
Instance ID非0xFFFF的查找服务和查找事件组消息应立即回答,无需延迟。
REQUEST_RESPONSE_DELAY应指定最小值和最大值。
实际延迟时间应在REQUEST_RESPONSE_DELAY的最小值和最大值之间随机选择。
如果上次提供的服务是在发送上次消息时距离1/2 CYCLIC_OFFER_DELAY之内(对于请求/订阅则是1/2 CYCLIC_REQUEST_DELAY之内),则接收到Unicast标志设置为1的查找消息应以单播响应方式回答。
如果上次提供的服务是在1/2 CYCLIC_OFFER_DELAY或更长时间之前发送的(对于请求/订阅是1/2 CYCLIC_REQUEST_DELAY或更长时间之前),则接收到Unicast标志设置为1的查找消息应以多播响应方式回答。
接收到Unicast标志设置为0(多播)的查找消息应以多播响应方式回答。
状态机
在本节中,将展示客户端和服务器的状态机。