ICE客户端如果发送消息失败,可能会自动重试。这一特性非常强大。在特定环境下,这一点将显著提升程序的健壮性同时不需要额外编码。
重试机制遵守一个原则:
最多一次(
at-most-once semantics)。
最多一次原则规定,ICE客户端在失败的时候,不会重试,除非能确定服务器没有接受到请求。
为了理解遵守“”最多一次”的重要性,下边看一个列子。
interface
Account
{
long
withdraw(
long
amount);
};
withdraw操作会减少账户的资金。如果withdraw执行失败,客户端在不知道服务器有没有收到请求的情况下,就重新发送请求,就有产生了2次withdraw的风险。
请求失败时的自动重试 Automatic Retries for Request Failures
当下边情况发生时,ICE就认为请求失败。
1.链接无法建立。
2.收到回复前,链接断开。
3.超时。
4.发送或接受时,发生异常。
5.服务器返回异常信息,
Automatic Retries for Request Failures。
注意:ICE把用户异常视为调用成功,因此用户异常不会引起重试。
为了决定是否重试,ICE需要解决几个问题。
1.请求失败的错误是什么类型的?
当ICE知道重试不会解决问题时,它不会浪费时间。