锁定老帖子 主题:一个简单的delay server
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-09-08
最后修改:2010-09-08
Hooopo 写道 ray_linn 写道 记录下duration和start time在数据库里
duration,start_time 5, 12:30:52 客户端的javascript access服务器端(比如login,或者客户端计时器到期)的时候,一条select,一条update. 是用户在线时利用前端的timer,不在线时在登录时候同步吗? 这样有一个问题: 比如建造一个房子 如果玩家A在未建造完成之前下线, 虽然玩家A再次上线的时候会得到建造完成的房子, 但是在其他玩家在查看玩家A的建筑的时候是看不到玩家A的房子的... 在其他玩家view你的地理坐标也可以同时触发这个事件吧。。。事实上 currenttime > start_time+duration 可以作为判断标记,来决定显示不显示这个房子。 说得更具体的:假设有个城 (破三国),城里有各种设施,比如厕所、停尸房之类的^_^,城和设施是个一对多的关系: ----- 设施---------------------------------------------- id, city_id, name,type,setup_duration,start_time,level,X-cordinator,Y-Cordinator -------------------------------------------------------- 每次有人(包括自己或者别人)来看这个城的时候,先根据current_time >start_time + duration 来update一下table, 简单的说就是把level+1,start_time清空,再一句select * from 设施 where start_time is empty 就搞定了。 这里用start_time+duration,是因为好像还可以盖某些设施来缩短duration,是个可变量,你也可以用expected_completet_time来代替之。 |
|
返回顶楼 | |
发表时间:2010-09-09
ray_linn 写道 Hooopo 写道 ray_linn 写道 记录下duration和start time在数据库里
duration,start_time 5, 12:30:52 客户端的javascript access服务器端(比如login,或者客户端计时器到期)的时候,一条select,一条update. 是用户在线时利用前端的timer,不在线时在登录时候同步吗? 这样有一个问题: 比如建造一个房子 如果玩家A在未建造完成之前下线, 虽然玩家A再次上线的时候会得到建造完成的房子, 但是在其他玩家在查看玩家A的建筑的时候是看不到玩家A的房子的... 在其他玩家view你的地理坐标也可以同时触发这个事件吧。。。事实上 currenttime > start_time+duration 可以作为判断标记,来决定显示不显示这个房子。 说得更具体的:假设有个城 (破三国),城里有各种设施,比如厕所、停尸房之类的^_^,城和设施是个一对多的关系: ----- 设施---------------------------------------------- id, city_id, name,type,setup_duration,start_time,level,X-cordinator,Y-Cordinator -------------------------------------------------------- 每次有人(包括自己或者别人)来看这个城的时候,先根据current_time >start_time + duration 来update一下table, 简单的说就是把level+1,start_time清空,再一句select * from 设施 where start_time is empty 就搞定了。 这里用start_time+duration,是因为好像还可以盖某些设施来缩短duration,是个可变量,你也可以用expected_completet_time来代替之。 其实由于前端timer的不可靠性,后台再加上你说的这个同步机制是可以解决问题的。 但是,这样就会检查更新逻辑(可能不止一种这样的场景)混到了其他逻辑(你这个例子里的查看坐标)。。。 这样最终会使很多action里面充斥着各种同步状态的逻辑...很难维护。 |
|
返回顶楼 | |
发表时间:2010-09-09
Hooopo 写道 ray_linn 写道 Hooopo 写道 ray_linn 写道 记录下duration和start time在数据库里
duration,start_time 5, 12:30:52 客户端的javascript access服务器端(比如login,或者客户端计时器到期)的时候,一条select,一条update. 是用户在线时利用前端的timer,不在线时在登录时候同步吗? 这样有一个问题: 比如建造一个房子 如果玩家A在未建造完成之前下线, 虽然玩家A再次上线的时候会得到建造完成的房子, 但是在其他玩家在查看玩家A的建筑的时候是看不到玩家A的房子的... 在其他玩家view你的地理坐标也可以同时触发这个事件吧。。。事实上 currenttime > start_time+duration 可以作为判断标记,来决定显示不显示这个房子。 说得更具体的:假设有个城 (破三国),城里有各种设施,比如厕所、停尸房之类的^_^,城和设施是个一对多的关系: ----- 设施---------------------------------------------- id, city_id, name,type,setup_duration,start_time,level,X-cordinator,Y-Cordinator -------------------------------------------------------- 每次有人(包括自己或者别人)来看这个城的时候,先根据current_time >start_time + duration 来update一下table, 简单的说就是把level+1,start_time清空,再一句select * from 设施 where start_time is empty 就搞定了。 这里用start_time+duration,是因为好像还可以盖某些设施来缩短duration,是个可变量,你也可以用expected_completet_time来代替之。 其实由于前端timer的不可靠性,后台再加上你说的这个同步机制是可以解决问题的。 但是,这样就会检查更新逻辑(可能不止一种这样的场景)混到了其他逻辑(你这个例子里的查看坐标)。。。 这样最终会使很多action里面充斥着各种同步状态的逻辑...很难维护。 我们只是把数据库更新延迟再延迟到有人来查看、改变城的状态(比如敌我查看城市、攻打城市等等),而这个操作可以完全写成一个SP,独立于所有的action,这样就解决了这个问题。。 |
|
返回顶楼 | |
发表时间:2010-09-09
最后修改:2010-09-09
hooooopo这个需求让我想到了各种邪恶的网盘. .
由于各种门的存在.网盘的需求量很高.但是网盘不能让你无限制的下载. 然后每次下载都要有delay时间. 类似freakshare这个网盘会记录你的下载记录. 第一次一般等待60秒. 第二次就会变成10分钟. 这个其实也是一个delay server. 有些类似的功能. 不过他不需要保证 建造中断问题.如果离线他会重读60秒. 60秒/10分钟结束会发起一次请求.获得一个下载地址.跟update数据库其实是一样的. 或许可以参考.也是两次请求. 况且现在EM模式并没有解决delay的问题.大家实际上还是在排队.. 还有空间啊. |
|
返回顶楼 | |
发表时间:2010-09-09
很显然是第一种
|
|
返回顶楼 | |
发表时间:2010-09-12
可以在数据库上做一个trigger,不扫表更方便.在做一个UDF发送你的请求.
|
|
返回顶楼 | |
发表时间:2010-09-12
我靠,高射炮打蚊子啊。。。。
假设建造一个房屋需要100秒,玩家点击确认后开始计时。 不需要搞什么后台任务,只需要把这个任务写入数据库。当客户端有请求时,才取出数据进行计算。如果时间未到,服务端直接忽略就行了。 所有其他工作都由客户端进行,比如“还剩下xx秒”都在客户端进行,说白了就是一个模拟计算的过程。 |
|
返回顶楼 | |
发表时间:2010-09-12
xds2000 写道 可以在数据库上做一个trigger,不扫表更方便.在做一个UDF发送你的请求.
如果系统使用了二级缓存,像cache_money..在数据库上做trigger,就会出现数据库数据与缓存不同步的现象。。 |
|
返回顶楼 | |
发表时间:2010-09-16
不存在数据库中可以吗
|
|
返回顶楼 | |