Android 轮询执行策略项目设计

作者: DevSiven | 来源:发表于2018-04-14 17:14 被阅读372次
引用

策略,顾名思义是指在执行某些行为时的方式。当然不同的时间、不同的位置、不同的环境可能都会应用不同的策略,说明策略具有可变性。即在要求最优化的实现目标时,不断应用不同策略而达到理想的目标
【转发请注明来源,谢谢!】

项目场景:

在项目模块中主要存在一些定时任务的策略,00:00 到 24:00针对不同的设备配置最多能存在24条策略包。在线策略包应用优先级会高于离线策略包,当时如果设备是离线状态的话,就应用于离线策略包。

设计

在前面的项目场景,可以概况需要做的三件事情
1、处理分包职责(针对设备配置、是否有效、是否应用于当前这个设备),即分包处理管理
2、离线策略包与在线策略包调配
3、策略包的应用,即管理策略定时任务

先说下下面几个Manager的意义

  • StrategyManager 策略的集中管理控制类,负责协调策略应用的所有Manager(下面所有)
  • StrategyPackageManager 根据规定的协议,负责拆包、组包有效策略包
  • OnlineManagerOfflineManager ,分别管理在线策略包和策略包。OnlineManager主要是在request获取时候获取的策略、OfflineManager则是从数据库获取时候获取的策略。
  • PoolManager 管理有效的策略池
  • AlarmManagerService 负责一些定时任务操作
(一) StrategyPackageManager 分包处理管理

处理分包主要应用了代理模式,真正控制策略的管理者StrategyManager不会去处理分包的管理工作。这样设计有个优势,StrategyManager只需要关心如何去处理有效策略池的应用,如何处理分包对他是透明无知的。如果以后策略包规则修改了,由StrategyPackageManager去做适应即可。

(二) OnlineManager 与 OfflineManager 离线策略包与在线策略包调配

首先,曾经从服务器获取到的策略包会缓存在本地数据库中,并且由OfflineManager进行管理,这里统一称离线策略。实时从服务器获取(推送或http),由OnlineManager进行管理,这里统一称在线策略。在模块启动时刻,由于避免网络差异性问题会优先使用离线策略,当然如果成功从服务器中获取到新的策略会重新应用最新的策略,并将新的策略缓存于OfflineManager中等到下次应用。

通过(一)、(二)我们就可以将策略包应用在StrategyManager中的PoolManager中了。PoolManager主要是StrategyManager与AlarmManagerService(闹钟服务,后面会讲到)交互的桥梁。PoolManager主要维护了一个策略池。通过(一)、(二)的操作后获得的有效策略包都会统一存储到这里,例如图所示

image.png

简单说明下上图:无论是 OnlineManager,还是OfflineManager 经过处理分包的StrategyPackageManager得到的有效策略包都会add进去poolManager的策略池。

(三) 管理策略定时任务

前面提到的AlarmManagerService,这是一个理由Android中的alarmmanager来提供策略的闹钟服务。每次poolManager都会push一个有效的策略,让alarmmanager来启动一个定时任务。当定时任务到点执行了对应的action之后,通过广播让poolManager pop掉这个应用完的策略,再重新push一个有效的策略让alarmmanager进行下一个定时任务,以此类推。

当然,这里在pop之后,有个校验机制checkAction。如果当前策略池已经pop完了,就再不会push策略给alarmmanager了。poolManager会通过回调通知告诉StrategyManager:"我策略用完了,请再喂我策略吧!"。此时如果没有推送触发、或者网络请求,就会告诉OfflineManager重新应用之前的那套策略包,这样一直工作下去。如图所示:

image.png
总结:

这边文章并没有长篇大论描述下设计原理,只是大概讲了整个设计的思维模型。当时设计与实现距离现在也半年多了,突然想起总结总结。希望对阅读的朋友有些思维触发什么的吧~能力有限,正在努力哈!

My Email : sy.wu@foxmail.com

Siven Wu
2018.4.14

相关文章

  • Android 轮询执行策略项目设计

    引用 策略,顾名思义是指在执行某些行为时的方式。当然不同的时间、不同的位置、不同的环境可能都会应用不同的策略,说明...

  • 今日复盘

    01.目标 新项目阶段策略设计执行方案完成。 02.记录 001.周一例行晨会; 002.新项目阶段策略设计执行方...

  • 今日复盘

    01.目标 新项目阶段策略设计执行方案完成。 02.记录 001.周一例行晨会; 002.新项目阶段策略设计执行方...

  • Android Timer:系统时间同步后引起的计时间隔异常

    Android开发中,我们通常会使用Timer/TimerTask实现计时器轮询,但轮询的任务执行间隔在系统...

  • TMD其一 - 资深UX设计

    职位描述: 1、负责效率工程产品的UX设计工作(包括Web、iOS、Android端),从设计策略到设计执行的全流...

  • 五、负载均衡与配置详解

    负载均衡概述 nginx提供的负载均衡策略有2种:内置策略和扩展策略。内置策略为:轮询、加权轮询、ip hash。...

  • Nginx负载均衡配置

    基于轮询(Round Robin)的负载均衡配置 Nginx的负载均衡策略默认就是轮询。 Nginx负载均衡策略支...

  • kafka生产者分区分配策略

    三种策略,轮询策略(Round-robin),随机策略,按消息键保序策略

  • 【问答】中间件

    nginx的请求转发算法,如何配置根据权重转发 负载均衡策略:内置策略:轮询(默认)、加权轮询(处理1次连接则权重...

  • Ribbon-负载均衡器

    id 策略名称 策略对应的类名 实现原理1 轮询策略(默认) RoundRobinRule 轮...

网友评论

本文标题:Android 轮询执行策略项目设计

本文链接:https://www.haomeiwen.com/subject/lsvghftx.html