【发布时间】:2012-07-13 19:18:54
【问题描述】:
基本上,我想跟踪的部分指标是某些对象在我们的营销平台上获得的展示量。 如果您想象我们展示了很多对象,我们希望在每次提供对象时进行跟踪。
每个对象都通过单个网关/接口返回给客户端。因此,如果您设想一个请求进入了具有某些搜索条件的页面,然后该搜索请求被代理到我们的 Solr 索引。
然后我们得到 10 个结果。
这 10 个结果中的每一个都应被视为一次展示。
我正在努力寻找一个令人难以置信的快速和准确的实现。
关于如何做到这一点的任何建议?你可以投入任意数量的技术。我们目前使用的是 Gearman、PHP、Ruby、Solr、Redis、Mysql、APC 和 Memcache。
最终所有的印象最终都应该被持久化到 mysql 中,我每小时都可以这样做。但我不确定如何在不影响实际搜索请求的加载时间的情况下快速将展示次数存储在内存中。
想法(我刚刚添加了选项 4 和 5)
将结果返回给客户端后,客户端随后会在我们的平台上请求一个 base64 编码的 URI,其中包含已提供服务的所有对象的 ID。然后将此对象传递给 gearman,然后将计数保存到 redis。每小时一次,redis 被刷新一次,并且 mysql 中每个对象的计数都会增加。
从 Solr 返回结果后,循环并直接保存到 Redis。 (尚未对此进行速度基准测试)。每小时重复一次刷新到mysql。
从 Solr 返回项目后,将单个作业中的所有 ID 发送给 gearman,然后将其提交给 Redis..
新想法 由于返回的项目数最多约为 20,因此我可以设置一个 X-Application-Objects 标头,其中包含返回的 ID 的 base64 标头。然后,这些 ID(在标头中)可以被 nginx 剥离,并使用自定义 LUA nginx 模块,我可以将 ID 从 nginx 直接写入 Redis。不过,这可能有点矫枉过正。这样做的好处是我可以告诉 nginx 在写入 redis 时立即返回响应对象。
新想法 使用
fastcgi_finish_request()将请求刷新回 nginx,然后将结果插入 Redis。还有其他建议吗?
编辑回答问题:
这些数据的可靠性并不重要。只要是最好的猜测。我不希望看到 30% 的展示次数下降。但我会允许 10% -/+ 的精度。
【问题讨论】:
-
数据有多重要?如果你失去了,比如说,100 次展示,那是不是很糟糕?如果你输了1,那是不是很糟糕?如果在这方面有一定的灵活性,那么也许有某种缓存的地图,它有一个活跃的线程来持久化它。
-
另外,这个数据的检索需求是什么?您是否需要能够立即查询并获得及时的结果?或者您可以将印象转储到某种日志中,然后在批处理作业中每晚进行处理?
-
Marvo,数据不重要。它用于向对象的所有者提供统计信息。向他们提供详细信息,例如点击率等。丢失一些数据是可以的。我希望经常丢失一些(例如当我重新启动服务器并且过去几个小时的结果没有被刷新回 mysql 时)。我打算从 Redis 获取结果并推送到 mysql。
-
我们在谈论什么样的数字?有多少对象和展示次数,以及您是否有任何增长估算。
-
您好,我也在尝试跟踪展示次数。您是否担心在结果中也包含机器人流量?这可能会使您的准确度指针超过您的允许阈值。如果是这样,您想出什么方法来过滤此流量?我很想知道:)