3

我们已经开始使用 bigquery 来记录我们游戏中的事件。

我们从 appengine 节点收集事件,并时不时地将它们放入块中,然后将其放入任务队列中。

然后后端处理此队列并将事件上传到 bigquery。

今天,我们存储了大约 6000 万个来自我们一款游戏的每日事件和 600 万个来自另一款游戏的事件。

我们还制作了 cron 作业来处理这些事件,以收集各种游戏 KPI。(即第二天的留存率、活跃用户数等)

一切都很顺利,但我们现在确实面临一个棘手的问题!

======== 问题1 ========================================= =======

由于某种原因,队列任务的删除有时会失败。不是很频繁,但它经常发生并且经常爆发。

TransientFailureException 可能是原因......我说可能是因为我们正在批处理模式下删除进程事件。IE ...

List<Boolean> Queue.deleteTask(List<TashHandle> taskstoDelete)

...所以我们实际上不知道为什么我们未能删除任务。

我们今天添加了重试代码,它将尝试再次删除那些失败的删除。

是否有处理此类问题的最佳实践?

========= 问题2 ======================================== =================

重复检测

以下 SQL 成功地找到了较小游戏的重复项,但超出了较大游戏的资源。

SELECT DATE(ts) date, SUM(duplicates) - COUNT(duplicates) as duplicates
FROM (
  SELECT ts, eventId, userId, count(*) duplicates
  FROM [analytics_davincigameserver.events_app1_v2_201308]
  GROUP EACH BY ts, eventId, userId
  HAVING duplicates > 1
)
GROUP EACH BY date

即使对于我们更大的游戏,有没有办法检测重复项? 即 bigquery 将能够破坏我们每天 6000 万行并定位重复项的查询。

提前致谢!

4

1 回答 1

1

对于问题 #2(我希望它们是单独的问题,以跳过这一步和混淆的机会):

内部查询或外部查询上的资源是否已耗尽?

这行得通吗?

SELECT ts, eventId, userId, count(*) duplicates
FROM [analytics_davincigameserver.events_app1_v2_201308]
GROUP EACH BY ts, eventId, userId
HAVING duplicates > 1

那么减少基数呢?我猜当您按时间戳分组时,可能有太多不同的存储桶可供分组。这会更好吗?

SELECT ts, eventId, userId, count(*) duplicates
FROM [analytics_davincigameserver.events_app1_v2_201308]
WHERE ABS(HASH(ts) % 10) = 1
GROUP EACH BY ts, eventId, userId
HAVING duplicates > 1
于 2013-09-16T01:40:58.863 回答