论坛首页 编程语言技术论坛

一个简单的delay server

浏览 10275 次
该帖已经被评为良好帖
作者 正文
   发表时间: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来代替之。


0 请登录后投票
   发表时间: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里面充斥着各种同步状态的逻辑...很难维护。
0 请登录后投票
   发表时间: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,这样就解决了这个问题。。
0 请登录后投票
   发表时间:2010-09-09   最后修改:2010-09-09
hooooopo这个需求让我想到了各种邪恶的网盘. .

由于各种门的存在.网盘的需求量很高.但是网盘不能让你无限制的下载.

然后每次下载都要有delay时间. 类似freakshare这个网盘会记录你的下载记录. 第一次一般等待60秒. 第二次就会变成10分钟.

这个其实也是一个delay server. 有些类似的功能. 不过他不需要保证 建造中断问题.如果离线他会重读60秒.

60秒/10分钟结束会发起一次请求.获得一个下载地址.跟update数据库其实是一样的.

或许可以参考.也是两次请求.


况且现在EM模式并没有解决delay的问题.大家实际上还是在排队..

还有空间啊.
0 请登录后投票
   发表时间:2010-09-09  
很显然是第一种
0 请登录后投票
   发表时间:2010-09-12  
可以在数据库上做一个trigger,不扫表更方便.在做一个UDF发送你的请求.
0 请登录后投票
   发表时间:2010-09-12  
我靠,高射炮打蚊子啊。。。。

假设建造一个房屋需要100秒,玩家点击确认后开始计时。

不需要搞什么后台任务,只需要把这个任务写入数据库。当客户端有请求时,才取出数据进行计算。如果时间未到,服务端直接忽略就行了。

所有其他工作都由客户端进行,比如“还剩下xx秒”都在客户端进行,说白了就是一个模拟计算的过程。
0 请登录后投票
   发表时间:2010-09-12  
xds2000 写道
可以在数据库上做一个trigger,不扫表更方便.在做一个UDF发送你的请求.

如果系统使用了二级缓存,像cache_money..在数据库上做trigger,就会出现数据库数据与缓存不同步的现象。。
0 请登录后投票
   发表时间:2010-09-16  
不存在数据库中可以吗
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics