首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理和监控存储在MySQL DB中的基于时间的事件?

如何处理和监控存储在MySQL DB中的基于时间的事件?
EN

Stack Overflow用户
提问于 2012-06-02 02:53:22
回答 1查看 1.1K关注 0票数 1

我正在创建一个基于浏览器的MMO,它具有基于时间的事件:即,建造一座建筑将需要23个小时。

我可以将其记录到我的MySQL数据库中,然后使用cron脚本或watch (this question was immensely helpful)遍历事件表(或等效表)。

似乎有一个普遍的共识,我可以这样做:

(1)对于处理事件及其相关触发器的脚本,每秒运行一次cron作业。

(2)每分钟运行一次cron作业,该作业每秒循环59次,处理事件及其相关触发器。

(3)使用watch每秒运行一个php脚本。

基本上,在事件完成时,脚本将处理一些触发器,这些触发器的范围从更改状态、更新数据库、触发在最近的事件之后排队的其他“事件”等等。

我最担心的是每秒都有10,000+事件和触发器进行处理的可能性。我可以使用哪些策略来避免性能问题?这些是所有的解决方案,还是有更好的替代方案?

示例事件:

代码语言:javascript
复制
Construction of Building A - 00:43:21

快进2601秒,执行以下触发器:

代码语言:javascript
复制
Place Building A on map at Location x,y
Update resource total given by building
Start timer on next building in the queue
Construction of Building B - 02:10:49

更好地解释:在游戏的早期阶段,这些事件将花费5分钟到1小时不等。在游戏的后期阶段,这些事件将被间隔数百个小时。我需要实时处理这些事件,因为它们会影响游戏的其他方面(例如,改善每小时提供的资源数量的资源结构)。因此,无论用户是否处于活动状态,这些事件都需要由服务器处理。理论脚本将检查过期的事件,然后基于该事件,运行与所述事件的过期相关的其他几个方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-02 04:17:32

https://github.com/prggmr/prggmr

听起来像是一个事件库在这里可能对你有很大的帮助,

您可以在prggmr中编写一个简单的间隔,它将拾取将来需要发生的事件,并将它们注册到事件引擎中,以便在那时发出信号,而不是试图拥有一个监控未来发生的所有事件的“通用”。

像下面这样的东西可能会起作用,

代码语言:javascript
复制
prggmr\interval(function(){
    $query = mysql_query("SELECT event, when FROM events");
    while($event = mysql_fetch_assoc($query)) {
        prggmr\setTimeout(function() use ($event){
            prggmr\signal($event['event']);
        }, $event['when']);
    }
    // What this would do is look for any events that require signaling in the
    // in the future such as a building construction and signal it when the 
    // given amount of time in milliseconds has run
}, 3600);
// This simply tells the engine to run the function every minute

要运行这段代码,假设它存储在event_detect.php中

代码语言:javascript
复制
prggmr event_detect.php

您通常希望由另一个应用程序来管理进程,例如runit。

使用这种方法,您可以将所有可能发生在您的应用程序中的事件构建为注册的“信号处理程序”,并在后台运行一个实际的游戏引擎,该引擎在事件发生时实时等待和监视事件,而无需任何用户交互。

我们实际上正在为我们目前正在开发的一款游戏使用这种方法。逻辑上完全不同,但非用户交互事件处理都是一样的。

此外,为了提高性能,您可以非常轻松地在一秒钟或更少的时间内处理10,000个事件,具体取决于您的服务器。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10855822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档