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

  • 相关阅读:
    delegate和event的区别 (zz)
    delegate和event的区别 (zz)
    delegate和event的区别 (zz)
    delegate和event的区别 (zz)
    以太坊网络服务分析
    以太坊:P2P网络数据处理流程
    以太坊:P2P网络数据交互
    以太坊虚拟机的基本介绍
    Solidity概述及基本代码展示
    Solidity编译器和简单调试
  • 原文地址:https://www.cnblogs.com/23lalala/p/3881287.html
Copyright © 2020-2023  润新知