PHP使用memcache长连接作为RPC客户端需要注意的地方

memcache扩展版本 3.0.8

一. retry_interval

$retry_interval 某个rpc服务器端失败后故障转移的时间,retry_interval的时间内,该节点会被一直标记为不可用,隔离掉,为小于0的数一直隔离。

int mmc_server_valid(mmc_t *mmc TSRMLS_DC) /*
    checks if a server should be considered valid to serve requests {{{ */
{
    if (mmc != NULL) {
        if (mmc->tcp.status >= MMC_STATUS_DISCONNECTED) {
            return 1;
        }

        if (mmc->tcp.status == MMC_STATUS_FAILED &&
            mmc->tcp.retry_interval >= 0 && (long)time(NULL) >= mmc->tcp.failed + mmc->tcp.retry_interval) {  
       //这里用当前时间和故障发生时间+隔离时间作对比
return 1; } } return 0; }

二.重试策略

请求某个节点超时或者失败会有一次重试的机会,但是当服务器重启以后,貌似没有做重试,只是标记了连接状态为不可用。当第二次用到这个连接的时候才会重建连接,这样重启前有多少连接,就会有多少请求不可用。

/* read more data from socket */
if (php_stream_eof(mmc->readreq->io->stream)) {  //服务器端主动断开连接的情况,stream读到EOF
    result = mmc_server_failure(mmc, mmc->readreq->io, "Read failed (socket was unexpectedly closed)", 0 TSRMLS_CC);
    if (result == MMC_REQUEST_FAILURE) {
        /* take server offline and failover requests */
        mmc_server_deactivate(pool, mmc TSRMLS_CC);
    }
    if (result == MMC_REQUEST_RETRY) {
        mmc_select_retry(pool, mmc, mmc->readreq TSRMLS_CC);
    }
}
break;

红字是我后加的,原来扩展虽然标记了result为MMC_REQUEST_RETRY,但是没做重试。简单的方法也可以在扩展中再new Memcache(),addServer一次。

原文地址:https://www.cnblogs.com/23lalala/p/3881287.html