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一次。