zoukankan      html  css  js  c++  java
  • 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一次。

  • 相关阅读:
    c#常用简化语句
    SQL语句使用中的笔录
    UpdateProgress 实现加载效果
    maven的下载安装,配置本地仓库
    IntelliJ IDEA启动Tomcat后,无法访问Tomcat主页
    SSM框架实现分页
    mybatis-generator-xxxx 使用方法
    Mybatis错误:Parameter 'XXX' not found. Available parameters are [1, 0, param1, param2]
    mybatis高级映射(一对一,一对多)
    SSM整合---实现全部用户查询
  • 原文地址:https://www.cnblogs.com/23lalala/p/3881287.html
Copyright © 2011-2022 走看看