请教一个算法,用服务器调配多客户端

joycheney 2008-02-25 12:14:57
是这样的,我这里在开发一个客户端/服务器端的软件。其中,客户端是c++,服务器是php,简单来说流程是客户端请求服务器端-->服务器端给客户端一组指令-->然后客户端执行指令。

有多台客户端,而且客户端上线时间是不确定的。

服务器有一个指令集,其中每一条指令都有一个限定时间,只能在指定的时间以后执行。

哪台客户端在某指令的指定时间以后请求就把该指令发给该客户端执行。

客户端得到的指令不一定会得到正确的执行,所以在正确执行指令以后,客户端会返回给服务器一个已执行的标记。

正确流程是:
客户端请求服务器端-->服务器端给客户端一组指令-->然后客户端执行指令-->正确执行-->返回正确给服务器端
不正确的流程是:
客户端请求服务器端-->服务器端给客户端一组指令-->然后客户端执行指令-->不正确执行-->不返回任何信息

现在问题就来了:
因为一定要在每个限定时间以后才能执行指令,而且应该在接下来的一个小时内把指令执行完。
客户端请求服务器端指令集的间隔一定要是30分钟,一次发送一批指令过去,并且存在指令失效的可能。
客户端返回正确给服务器,不限定时间,什么时候正确执行完,什么时候返回。

1.如果这样设计流程:
客户端请求服务器端-->服务器检索在执行时间在当前时间以前的指令集合-->服务器端给客户端一组指令-->服务器删除该组指令-->客户端执行指令

倘若正确执行还好,看不出什么问题,假如指令失效,那么该组指令就永远得不到执行。

2.如果这样设计流程:
客户端请求服务器端-->服务器检索在执行时间在当前时间以前的指令集合-->服务器端给客户端一组指令-->客户端执行指令-->返回正确给服务器端-->服务器删除该组指令

这样能够保证指令得到正确执行了,但是如果第二台客户端在第一台客户端返回正确给服务器以前,请求指令,就可以得到第一台客户端的指令,这样,指令就可能会重复执行。


我想了很久,如果指令重复无法避免,怎么才能让重复的可能性变到最小。

我现在有超过50台客户端,最坏的可能会重复执行超过50次,这个很难接受,我顶多接受重复一两次,而且还是小概率事件。

或者有没有什么更好的模型或者算法,可以让服务器控制客户端执行指令,而且同时满足这三个条件:
1.一定要在每个限定时间以后才能执行指令,而且应该在接下来的一个小时内把指令执行完。
2.客户端请求服务器端指令集的间隔一定要是30分钟,一次发送一批指令过去,并且存在指令失效的可能。
3.客户端返回正确给服务器,不限定时间,什么时候正确执行完,什么时候返回。
...全文
57 点赞 收藏 7
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
hoheart 2008-02-27
客户端请求服务器端--> 服务器检索在执行时间在当前时间以前的指令集合--> 服务器端给客户端一组指令--> 服务器删除该组指令--> 客户端执行指令

就用你这个流程,再改改:

服务器返回给客户端指令时,不删除,只是做一个标记,标明已经被取走,最好用一个唯一ID标志。如果收到客户端执行正确的消息,再删除(当然你也可以不做真正的删除,因为历史是可以当镜子的嘛,)或做另外的标志。
当然,客户端不是不返回执行错误的消息吗?那么你就设置一个指令被取走的时间,当下一个客户端来取指令时,检查时间有没有超时(从你的逻辑来看应该是指令执行时间再加一个小时)。当然,最好做一个有返回错误信息的客户端。

在整个过程当中,一定要注意数据更新(主要是指令记录)时一定要加锁,因为这是异步程序了,PHP这一方面比较差,所以可以借助文件(PHP有文件锁)或者数据库(理论上可以)。
回复
you_kind 2008-02-27
基于lz目前的规则,好像是没啥办法

1 如果指令执行失败,客户端通知服务端失败消息
或者 2 指令重复下发多次,如果客户端a返回成功,则服务端通知客户端b放弃该条指令
回复
joycheney 2008-02-26
up
回复
xiaojing7 2008-02-25
up
回复
joycheney 2008-02-25
up
回复
joycheney 2008-02-25
客户端不是http浏览器。。。。大哥有没有仔细看?

客户端就是我自己写的插件
回复
兔子党-连长 2008-02-25
需要在客户端安装插件
回复
相关推荐
发帖
基础编程
创建于2007-09-28

2.1w+

社区成员

从PHP安装配置,PHP入门,PHP基础到PHP应用
申请成为版主
帖子事件
创建了帖子
2008-02-25 12:14
社区公告
暂无公告