做在线算法服务平台的的时候搞了这么一套东西,刚开始的时候完全没有意识到它能有这方面的用途。等到项目基本结束的时候,突然发现这个daemon当真具备了群控平台的基础:打开/关闭应用、与本地app/服务器实时通信,最重要的是它具备了硬件设备的热加入功能。
框架分工
整个框架中大致有三种角色:用户、集群控制器兼服务器、终端集群,其中集群控制器处于最核心的位置,它担负着用户与终端设备间信息交换的责任。
- 用户的主要职责就是通过集群控制器对外提供的接口,向控制器传送服务需求与原始输入,然后等待集群控制器把最后的输出返回给自己。
- 终端集群的职责也比较简单,接收控制器中转过来的用户输入,执行相应的任务并将最终生成的结果传送给控制器,由控制器转达用户。
- 集群控制器的核心任务是管理整个集群,通过它能够非常方便的添加移除终端设备,能够对终端设备进行操纵式控制,比如打开/关闭/安装/卸载指定应用、模拟点击、关机重启、截录屏等等。除了管理集群功能、在用户与终端间中转数据进而达成分布式计算任务是这套系统的最终目标。
实现细节
建立连接
为了实现终端设备的热加入功能以及控制器与终端间的实时通信,通信协议毫无疑问地选择了TCP长连接的方式。如此控制器定然要对外提供一套TCP服务,终端通过TCP连接到服务器并报告自己的终端身份以及所具体的服务能力。控制器将这些信息加入到自己的任务管理列表中。用户提交任务后,控制器便可以到任务管理列表中查找有任务处理能力的终端,根据一定的规则选择终端并调度其执行任务。
集群的管理与控制
只有具备了与终端的实时通信能力,集群控制器对集群各终端的管理与控制才成为可能。iOS平台的特殊性注定了终端设备上的TCP连接程序不可能基于上层应用中,其长时间运行、开机自动运行等行为特征也是上层应用所不具备的。显然iOS平台上的另外一种程序类型-daemon服务是惟一的选择。
该daemon服务的职责与终端的职责基本重合,惟一的不同是执行的任务类型。daemon服务所执行的服务一般都是系统级别的任务,比如开关机、截屏、安装打开关闭应用、模拟点击等,但对于一些涉及到应用内部行为的任务无能为力,比如调用应用内部的某个算法接口。
Socket Client是负责与控制器通信的TCP长连接,它会接收服务器发来的各种数据并处理,同时也会主动向服务发送心跳包以保持稳定的连接状态,同样也会转发由Socket Server接收到的数据包。而这个Socket Server正是为了上面所说的特殊任务面存在的。
应用控制
为了控制应用做出其工作范围之外的动作,必须在应用的代码里值入插件代码,这种插件有个学名叫Tweak,这里不在做具体介绍。如果在插件代码里同样集成TCP连接的代码,就能将应用与daemon服务连接起来。如此daemon作为服务器就可以控制前台应用作Tweak中设定好的额外动作了。
总信息流
像下图一次典型的信息处理流程,通过客户发起,经过层层转发,到最终找到处理程序处理,返回数据同样经过层层转发回客户。如此效率可能成为该系统的一个瓶颈,所幸的是客户同样可以选择一次提交大区量的数据,而该系统的分布式特点正好可以发挥其作用了,因此效率方面完全不是问题,当然前提条件是该集群系统拥有大量的终端设备,钱的问题都不是问题(实际上还是问题,尤其是iOS平台)。
总结
该集群系统是我在在线算法服务平台的基础上提取出来的,该服务平台已经基本搭建完毕,并拟向外界开放,欢迎有兴趣的朋友前来咨询与交流。