文档章节

spymemcached :某个mc节点操作连续超时超过998次就 Auto-Reconne...

旁观者-郑昀
 旁观者-郑昀
发布于 2013/02/08 22:46
字数 791
阅读 162
收藏 0
spymemcached 中,一个 mc client 与某一个 mc node 之间已建立的 connection 上,
如果执行操作屡屡超时(net.spy.memcached.OperationTimeoutException),
那么,有一个计数器专门记录超时次数(connected或reconnecting就清零)。
当某一个 mc node 的连续超时次数达到一定阈值(如 998 次),
就会……
  1. 关闭原来的 socket channel,并将该 mc node 放入重连队列 reconnectQueue :lostConnection(mn),
  2. 遍历 reconnectQueue ,逐一尝试重新建立 socket 连接:attemptReconnects(),
  3. 然后不管连没连上,rehash 队列中的操作:redistributeOperations(retryOps)。(rehash 指重新计算hash值,看是否要连接其他的节点)。
 
这个超时次数阈值,既可以在 spring 里如下这样设置,也可以采用默认值 998 次:
  <beanid="memcachedClient"class="net.spy.memcached.spring.MemcachedClientFactoryBean"> ……     <propertyname="opTimeout"value="1000"/>操作超时时间是1秒,如果不设置的话,默认是 DEFAULT_OPERATION_TIMEOUT,即2.5秒     <propertyname="timeoutExceptionThreshold"value="1998"/>设置超时次数上限是1998次,默认是DEFAULT_MAX_TIMEOUTEXCEPTION_THRESHOLD,即998次 ……   </bean>
 
相关代码:
每一次 handle io over the connections 时,都会检测一下这个 connection 对应的节点上登记的“连续超时次数”是否已经达到阈值:
MemcachedConnection.java
  private final int timeoutExceptionThreshold;
……
  timeoutExceptionThreshold = f.getTimeoutExceptionThreshold();
……
  /**
   * MemcachedClient calls this method to handle IO over the connections.
   */
  public void handleIO() throws IOException {
……
    // see if any connections blew up with large number of timeouts
    for (SelectionKey sk : selector.keys()) {
      MemcachedNode mn = (MemcachedNode) sk.attachment();
      if (mn.getContinuousTimeout() > timeoutExceptionThreshold) {//检查一下
        getLogger().warn("%s exceeded continuous timeout threshold", sk);
        lostConnection(mn);//断开连接,放入重连队列
      }
    }
 
    if (!shutDown && !reconnectQueue.isEmpty()) {
      attemptReconnects();//重新连接
    }
    // rehash any operations that are in retry state
    redistributeOperations(retryOps);//
    retryOps.clear();
 
如果配置文件也没配 timeoutExceptionThreshold ,初始化时也没传这个参数,
那么 DefaultConnectionFactory 就取默认值 DEFAULT_MAX_TIMEOUTEXCEPTION_THRESHOLD,即998次(anyway,也许是1000次)
DefaultConnectionFactory.java
  /**
   * Maximum number + 2 of timeout exception for shutdown connection.
   */
  public static final int DEFAULT_MAX_TIMEOUTEXCEPTION_THRESHOLD = 998;
DefaultConnectionFactory.java
  public int getTimeoutExceptionThreshold() {
    return DEFAULT_MAX_TIMEOUTEXCEPTION_THRESHOLD;
  }
 
针对每一个 memcache node 设置一个“连续超时次数”计数器:
TCPMemcachedNodeImpl.java
  // operation Future.get timeout counter
  private final AtomicInteger continuousTimeout = new AtomicInteger(0);
……
  public void setContinuousTimeout(boolean timedOut) {
    if (timedOut && isActive()) {
      continuousTimeout.incrementAndGet();
    } else {
      continuousTimeout.set(0);
    }
  }
MemcachedConnection.java
  /**
   * helper method: increase timeout count on node attached to this op.
   *
   * @param op
   */
  public static void opTimedOut(Operation op) {
    MemcachedConnection.setTimeout(op, true);
  }
 
 
参考资源:
1)智深,2012, spymemcached源码深入分析
2)2011, Issue 173:  Spymemcached fail reconnect to local memcahed under high load ..;
2) 电商课题V:分布式锁  (2012-11-17 22:16)
3) 电商课题:cookie防篡改  (2012-11-17 22:24)
4) 电商课题VI:分布式Session  (2012-11-17 22:30)
5) 电商课题:RBAC权限控制  (2012-11-17 22:47)
6) 电商课题:幂等性  (2012-11-22 23:52)
7) 电商课题:客户端的IP地址伪造、CDN、反向代理、获取的那些事儿  (2012-09-19 01:17) 9) 电商课题VII:支付交易一般性准则  (2012-12-14 01:38)
赠图一枚
http://ww3.sinaimg.cn/bmiddle/61b889f5jw1e0fm79k5fxj.jpg

© 著作权归作者所有

旁观者-郑昀
粉丝 100
博文 77
码字总数 162700
作品 0
朝阳
私信 提问
关于 Multiget hole:spymemcached对此的实现方法

火丁说: 『 Multiget的无底洞问题 Facebook在Memcached的实际应用中,发现了Multiget无底洞问 题,具体表现为:出于效率的考虑,很多Memcached应用都已Multiget操作为主,随着访问量的增加,...

旁观者-郑昀
2013/02/08
127
0
memcached使用那些事

背景介绍 截至编写此文,A系统已经成功上线2年有多,作为国内主流电商公司核心的基础公共服务系统之一,每天承载了数十亿级别流量。自上线以来成功地经受住了双十一,周年店庆等大促的检验,...

VIPSHOP_FCS
2017/12/10
0
0
spymemcached源码深入分析

spymemcached深入分析 author:智深 version:0.7 日志:http://my.oschina.net/astute QQ:2548921609(技术交流) 一、简介 spymemcached 是一个 memcache 的客户端, 使用 NIO 实现。 分析 ...

智深
2012/12/03
8.2K
7
三个实例演示 Java Thread Dump 日志分析

jstack Dump 日志文件中的线程状态 dump 文件里,值得关注的线程状态有: 死锁,Deadlock(重点关注) 执行中,Runnable 等待资源,Waiting on condition(重点关注) 等待获取监视器,Waiti...

旁观者-郑昀
2013/02/08
215
0
三个实例演示 Java Thread Dump 日志分析

jstack Dump 日志文件中的线程状态dump 文件里,值得关注的线程状态有: 死锁,Deadlock(重点关注) 执行中,Runnable 等待资源,Waiting on condition(重点关注) 等待获取监视器,Waiti...

mal
2014/05/19
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周五乱弹 —— 你已经是个成熟的熊猫了

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @Sharon啊 :#今日歌曲推荐# 分享黑鸭子的单曲《羞答答的玫瑰静悄悄的开》 《羞答答的玫瑰静悄悄的开》- 黑鸭子 手机党少年们想听歌,请使劲儿...

小小编辑
6分钟前
13
3
结合Spring Security进行web应用会话安全管理

在本文中,将为大家说明如何结合Spring Security 和Spring Session管理web应用的会话。 一、Spring Security创建使用session的方法 Spring Security提供4种方式精确的控制会话的创建: alwa...

fightinging
11分钟前
2
0
83、Mybatis和Hibernate重要区别

Mybatis;入门简单,程序容易上手开发,节省开发成本。Mybatis需要程序猿自己编写sql语句,是一个不完全的ORM框架,对sql修改和优化非常容易实现。 Mybatis适合开发需求变更频繁的系统,比如...

lianbang_W
今天
5
0
设计模式之状态模式

定义 Allow an object to alter its behavior when its internal state changes.The object will appear to change its class.(当一个对象内在状态改变时允许其改变行为,这个对象看起来像改...

陈年之后是青葱
今天
6
0
Python常用模块之os.path

os.path.abspath(path) 输入相对路径,返回绝对路径 Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] on win32Type "copyright", "credits" or "lic......

松鼠大帝
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部