我们有如下设计,我想获得以下错误场景的意见或协议指南.
Layer1
---------------
| ^ ^
| (1) |(4) |(6)
v | | Remote entity
---------------- ---------------
Layer0-----------------(2)------------------------------->Layer0
Layer0<----------------(3)--------------------------------Layer0
Layer0<----------------(5)--------------------------------Layer0
1. New session request to remote entity.
2. Establish link + data(session request)
3. Link Establishment ongoing
4. Link Establishment pending
5. Link Established + data (session accepted)
6. session accepted.
Run Code Online (Sandbox Code Playgroud)
如果layer1在步骤4和6之间决定它不需要远程实体服务,即接收事件4并且由于某些错误而尚未接收事件6.
1)是否应该等待事件6发生并启动会话释放或
2)Layer1应该指示第0层
立即终止连接建立过程.
哪种方法正确?
(1)的问题是,即使我们知道由于错误我们将要终止会话,我们需要在event6进入之前处理其他事件.
我是快速设计失败的粉丝.一旦你知道你无法继续,你应该通知对方,然后退出.
如果由于某种原因你需要验证对方是否得到了你的退出消息,我更喜欢用UNABLE_TO_COMPLY消息响应请求,或者完全丢弃事件.问题是你可以进入半开状态.
在您已经发送失败消息之后,处理另一方等待来自其他请求的响应的情况的一种方法是使用优先级队列.您可以指示某些消息无论何时收到,都可以立即处理,而不是按接收顺序处理请求.优先级较高的消息会插入队列的前面,因此quit_on_failure事件不会被您知道无法真正处理的其他请求阻止.
我通常也不喜欢基于时间的监视器(因为开发人员选择的时间长度对于所有情况都不正确),但是对于这些类型的协议,您经常需要定义最坏情况,而另一方从不响应您的fail消息.在这些情况下,可配置的超时通常是清理的唯一方法.超时应该永远是最后的手段,永远不是第一个.