php 判断接口有无响应,处理外部服务接口未响应

处理外部服务接口未响应

由 学院君 创建于2周前, 最后更新于 2周前

版本号 #2

98 views

0 likes

0 collects

处理服务未响应异常

队列任务中调用的外部服务接口除了返回 500 错误码之外,有时候可能没有任何响应,要处理这种情况,我们可以在发起请求时主动设置一个超时时间:

f4d650bd6fa0920c5934e0b1d13447ff.png

假设我们为请求设置了一个 10s 的超时时间,则 10s 之后未响应会抛出 ConnectionException 异常,然后在运行熔断器的时候捕获这个异常:

eedbe3f3f22077511257048c769a0521.png

现在,熔断器会在十次请求失败后开启,直到熔断器关闭之前,都不能再运行这个任务了,在此期间,队列处理器进程可以正常处理其他任务。

隔离超时任务

不过,如果服务未响应的话,则至少需要 10s 才能开启熔断器,在此期间,队列处理器也不能运行任何其他任务。

要阻止这种情况发生,可以限定处理该任务的队列处理器数量,一种方式是指定进程处理的队列:

php artisan queue:work --queues=slow,default // 开启5个进程

php artisan queue:work --queues=default // 开启5个进程

这样一来,超时请求服务处理任务位于 slow 队列,在服务未响应的情况下,至多让五个队列处理器进程处于阻塞状态,其他五个可以正常运行。

使用 Redis 限流器

要隔离超时任务,除了使用上述队列处理命令参数外,还可以引入队列限流中间件进行处理,这里我们使用基于漏斗算法的 Redis 限流器实现:

f31f785cc9c28e76d00e739e9c2c5b66.png

这样一来,同时最多只允许 5 个队列处理器进程处理该任务,如果队列处理器进程总数还是 10 个的话,剩下的 5 个就不会阻塞,转而可以去处理其他队列任务了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值