Http和Rpc重试机制

重试机制定义:

重试机制是在设置的超时时间到了之后没有返回结果或者服务端出现异常后服务调用端进行再次调用。

首先,不是所有接口都适合重试,如果一个服务是不等幂,那么不适合重试的机制,因为会存在重复提交的问题,否则是可以进行重试的。比如提交一个订单的接口是不能进行重试的,而把订单信息推给wms系统接口是可以重试的。

一般两个部署在不同网段的系统不能通过dubbo的rpc调用,只能用最原始的http调用,比如在占用库存的时候调用库存中心或者将配送信息推送给wms时,由于网络的波动或者商品数量多导致处理时间长等原因,需要对调用接口进行重试,具体代码如下:

private final int MAX_RETRY = 4;
int retries = 1;
JSONObject jsonObject = null;
do {
    long startTime = System.currentTimeMillis();
    jsonObject = HttpServer.httpPostFormEntity(url, params, httpClient);
    long endTime = System.currentTimeMillis();
    float seconds = (endTime - startTime) / 1000F;
    logger.info(order_id + "=== 执行时间:" + seconds + "s");
    logger.info(order_id + "=== 推送订单到wms出参:{}", new Object[]{jsonObject});
    if (jsonObject.get("returnCode").equals("0")) {
        long waitTime = DateHelper.getWaitTime(retries);
        try {
            Thread.sleep(waitTime);
        } catch (InterruptedException e) {
            logger.error("Error", e);
        }
    } else {
        return jsonObject;
    }
} while (retries++ < MAX_RETRY);
return jsonObject;
//waitTime按幂重试
public static long getWaitTime(int retryTime) {
    long waitTime = (long)Math.pow(2.0D, (double)retryTime) * 1000L;
    return waitTime;
}

以上是http调用的重试机制,比较简单。

DUBBO通过rpc调用时消费端设置额超时时间不能随心所欲,需要根据业务实际情况来设定,太短导致在设定的超时时间内无法完成正常的业务处理。太长的话会造成进程假死。就是所有的进程都在等待状态。

当消费端达到超时时间,dubbo会进行重试机制(如果配置了dubbo.reference.retries>1),重试机制大于1次会给服务提供端带来压力,而压力是正常值*dubbo.reference.retries倍,最终dubbo的消费端会出现RpcException提示retry了多少次还是失败。这种情况就是没有合理设置接口超时时间带来的问题。 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值