【原创】心跳包对状态机的影响

本文以rabbitmq-c使用的AMQP协议为例,详细说明了Heartbeat机制如何影响协议状态机,并提供了状态机在考虑与不考虑Heartbeat情况下的对比分析,包括稳定态和可能的网络卡顿点。同时,阐述了如何在Heartbeat超时情况下进行正确处理,以及在FSM中记录当前状态的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文以 rabbitmq-c 使用的 AMQP 协议为例说明 heartbeat 对协议状态机的影响。而实际上该问题具有一定普适性。

背景:基于rabbitmq-c源码改造了基于libevent实现的版本,增加了部分功能(一些属性的支持),也省略了部分功能(原代码中的心跳处理)。
问题:在后续需要使用 AMQP 心跳协议进行保活时,发生了状态机遗漏和错乱的情况。

图例


没有考虑 heartbeat 情况下,rabbitmq  Producer  的最简状态转换


rabbitmq Consumer 的最简状态转换


简单观察上面的状态切换是发现不了问题的,下给出结合 代码状态机实现 + 实际网络情况 的图示。

没有考虑 heartbeat 情况下,给出 rabbitmq  Producer  状态转换时 FSM 的稳态以及可能出现网络卡顿的地方。


rabbitmq Consumer 状态转换时 FSM 的稳态以及可能出现网络卡顿的地方。


上面图中的 稳态 是指 FSM 实现中的某个稳定状态(一般来说,无限循环的状态机都至少应该有一个稳态);而 网络卡顿 是指由于网络原因或服务器原因导致的协议包延迟到达的现象。

      在 事件驱动+FSM 的实现模型下,遇到网络卡顿时,可以对超时情况进行记录,并重新触发新一轮的状态处理。就上面的 consumer 而言,当处于 basic.deliver 状态下,在指定时间内没有收到对应协议帧时,只需要重新进入该状态再次等待接收该协议帧即可。

当添加了 heartbeat 处理后,状态机变化如下:

rabbitmq  Producer  状态转换时 FSM 的稳定态以及可能出现网络卡顿的地方。


rabbitmq  Consumer   状态转换时 FSM 的稳定态以及可能出现网络卡顿的地方。


可以看到,情况变的稍微复杂了点。这种情况下,需要程序能够处理
  • 针对 heartbeat 超时次数进行统计
  • 需要统一发送态下 heartbeat 超时时间和接收态下 heartbeat 超时时间(Producer中的情况),否者会出现判定错误
  • 需要在处理 heartbeat 协议帧前,正确记录当前的状态,以便后续重新恢复到该状态
另外值得说一句的是,FSM 中的稳态其实是和代码实现强相关的,就像上面图中 Producer 的稳态就实现在了 idle 中,而 Consumer 的稳态却安排在了 basic.deliver 。而会出现网络卡顿的点也需要仔细考量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值