周梦康 发表于 2016-08-16 2065 次浏览 标签 : redis
class ActivityService
{
    const MAX_FAIL_TIME = 20; // 数据上报最大次数
    const KEY_TTL = 120; // 生命周期
    const SERVICE_LOCK_TTL = 600; // 服务器故障锁时长

    private static function rpcClient($api, $params = [], $method = 'GET')
    {
        if (!self::getServiceStatus()) {
            return null;
        }

        // curl ....

        $cons = curl_exec($ch);

        if (curl_errno($ch) || !strpos(explode("\r\n",$cons)[0],"200")){
            self::failedTimesInc();
            curl_close($ch);
            return false;
        }

        $body = explode("\r\n\r\n",$cons)[1];

        curl_close($ch);

        return json_decode($body, true);
    }

    private static function getServiceStatus()
    {
        $lockKey = "activity:service:lock";
        $redis = RedisProxy::getRedis();

        if ($redis->get($lockKey)){
            return false;
        }

        return true;
    }

    /**
     * 失败次数记录
     * 
     */
    public static function failedTimesInc(){
        $countKey = "activity:service:error:num";
        $lockKey = "activity:service:lock";
        $redis = RedisProxy::getRedis();

        $count = $redis->get($countKey);

        // 没有得时候返回的是 bool false;
        if ($count === false){
            $redis->setEx($countKey, self::KEY_TTL, 0); // 之后返回的是 string "0"
        }

        $redis->incr($countKey);

        if ($count >= self::MAX_FAIL_TIME){
            $redis->setEx($lockKey,self::SERVICE_LOCK_TTL,1);
        }
    }
}

如果你的代码不是分布式部署的话,本地文件,或者shmop来对服务加倒计时锁也是不错的选择。

👇 下面是我的公众号,高质量的博文我会第一时间同步到公众号,给个关注吧!

评论列表