新网站怎么做才能可以在百度上搜索到,关于中秋节网页设计实训报告,wordpress 替代插件,o2o平台排名2019独角兽企业重金招聘Python工程师标准 假如有个直播间#xff0c;在数据有更新的时候#xff0c;能及时反映在客户端上。通信方式来说#xff0c;有两种#xff1a; 1、拉取模式。 2、推送拉取模式#xff08;或者纯推送#xff09; 拉取模式#xff0… 2019独角兽企业重金招聘Python工程师标准 假如有个直播间在数据有更新的时候能及时反映在客户端上。通信方式来说有两种 1、拉取模式。 2、推送拉取模式或者纯推送 拉取模式技术简单。但轮询间隔设置比较难如果设置得太大数据更新不及时如果设置得太小那么服务端可能会多余很多无用请求数据本来并无更新。 推送模式可以在数据有更新的情况下才选择通知客户端。但如果在同一秒内数据更新得太频繁可能会造成推送风暴。 这时候做一个简单优化如果距离上一次推送不超过一秒当前数据更新不推送。那么也会有个问题最后更新的数据可能在很长一段时间内都更新不到客户端。 下面介绍一个设计方法如下是一个时间轴 0 0.2 1 1.3 2 3 4 |------------------------|------------------------|------------------------|------------------------| 0 0.2 1 1.3 采用ThreadPoolExecutor来处理时间轴上面0/0.2/1/1.3的请求Task而BlockingQueue则采用DelayedQueue来实现进入线程池的任务的Task都实现Delayd接口并且设置延迟1秒。 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueueRunnable workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) 那么Task真正执行的时间点就如时间轴下面的数字。而由于设置了规则距离上次推送间隔小于1秒的时候不再继续推送。所以 红色的数字 0 和 1 表示会执行推送而 蓝色的数字 0.2 和 1.3 就不会推送。那么反馈到客户端层面当 红色的数字 0 执行推送会把当时 绿色的0/0.2/1状态推送给客户端因为是全量更新所以只需要查询当前最新数据而当 红色的数字 1 执行推送会把当时 绿色的1.3状态推送给客户端。那么这个过程中最晚的更新数据也不会超过1秒的延迟到达客户端。同时只发生了两次推送。 上面的任务执行过程中涉及到上一次推送的时间变量的比较。那么这个时间变量存储在哪里呢 简单的单进程当然是在进程内定义一个变量就完事了。 假如是多进程那么为了最大化优化性能逻辑我们可以分别设置本地变量缓存以及全局的redis变量缓存。方法有很多下面只介绍一种同步方式 当进程内的任务执行先对比本地变量如果系统时间减去本地变量小于一秒那么不继续执行任务如果系统时间减去本地变量大于一秒那么通过redis的get获取到上一次推送的时间戳如果系统时间减去该全局时间戳小于一秒那么不继续执行任务并更新本地缓存如果系统时间减去该全局时间戳大于一秒通过redis的getsetvalue是系统时间返回的全局时间戳这时的时间戳如果还大于1秒那么就推送并且更新本地缓存为当前系统时间否则不继续执行其它进程执行了推送。 转载于:https://my.oschina.net/u/223522/blog/1560038