一种超时控制的方式

简介:

版权声明:本文为本作者原创文章,转载请注明出处。感谢 码梦为生| 刘锟洋 的投稿

今天看到 这篇文章:您还有心跳吗?超时机制分析   觉得挺有意思,有兴趣的同学可以先看看他的文章,简单记录了下自己的一个想法,无论好坏,权当参与讨论,共同进步吧。

其实 lz 一直限制在了取系统时间耗时的问题上,所以,一直想变相的通过各种手法排除掉获取系统时间的逻辑,比如使用“次数”来对连接实现超时控制,但其实,使用次数来表示超时控制本身就是个伪命题, 比如,在超时次数的阀值是100,如果在90次后,就一直没有被其他线程使用,一直不到阀值,那怎么去将这个连接释放掉呢?

所以,我想到了另外一种方式解决这个问题:

首先,要明确,我认为取系统时间可以取的,但是不一定要获取连接的这个线程去做这个事情,比如交给其他线程去做,模型可能是这样:

Connection_Hash_Ring

     1. 线程A 拿到连接,调用refresh方法

     2.refresh方法中,将连接自己放到一个队列中,后返回。

     3. 某个特殊线程S不停的去队列中拿元素,并且,将拿到的元素和拿到时刻的时间记录下,封装好交给hash环 H, H是一个类似HashMap的HASH环,只不过头尾相接。

     4. Timer线程T不停的去遍历H,将超时时间大于某个阀值的连接拿掉,设置为超时连接。

不过这里需要注意到几个问题:

     1. 考虑到Connection不会无限制增多,设计成环,环并不会无限制增大,所以,可行。

     2. 更仔细点,可以将Connection中放一个标志位,标示是否正在使用,timer扫描时,超时间在使用状态,或者超时间不使用的连接(标准可能不同,在被使用的,可能时间要长一点。)都可以判定为超时连接

     3. 因为连接数有限,所以,线程S的队列中,也不会太长(每个连接一个位子)。

     4. 通过线程S的接入,将去系统时间等耗时操作从连接转移到了线程S中,提高S线程的处理速度。

     5. 线程S或许还可以一次从队列中取出多个元素,统一取一次系统时间,将取出来的多个元素设置为该时间,整个操作在毫秒内完成,可以用一个时间约等于各自连接时的真正时间,降低系统时间的获取频率。

     6……. 欢迎补充。

以一个线程S的代价,加快了各个连接所在线程的处理速率,值。

版权声明:本文为本作者原创文章,转载请注明出处。感谢 码梦为生| 刘锟洋 的投稿 

目录
相关文章
|
消息中间件 NoSQL Java
Springboot 指定重发的次数和延迟时间,定时异步执行 重发任务
Springboot 指定重发的次数和延迟时间,定时异步执行 重发任务
751 0
Springboot 指定重发的次数和延迟时间,定时异步执行 重发任务
|
3月前
|
存储 前端开发 JavaScript
面试官问:如果有100个请求,你如何使用Promise控制并发?
面试官问:如果有100个请求,你如何使用Promise控制并发?
|
29天前
SpringRetry接口重试机制
SpringRetry接口重试机制
17 1
|
4月前
|
监控
异步处理机制如何处理消息处理失败的情况?
异步处理机制如何处理消息处理失败的情况?
50 0
|
7月前
|
Python
同步调用和异步调用
同步调用和异步调用
|
7月前
|
安全 Java
Hystrix超时机制为服务接口调用超时提供安全保护
Hystrix超时机制为服务接口调用超时提供安全保护
86 1
|
Java
面试官:说一下线程池的参数,核心线程非核心线程使用方法,拒绝策略
面试官:说一下线程池的参数,核心线程非核心线程使用方法,拒绝策略
179 0
协程搬运工-取消与超时
协程搬运工-取消与超时
225 0
|
小程序 前端开发 JavaScript
小程序同步异步
小程序同步异步
153 0
|
Java 微服务 Spring
Hystrix降级逻辑中如何获取触发的异常
Hystrix降级逻辑中如何获取触发的异常
209 0