高性能展示跟踪

时间:2012-07-13 22:03:47

标签: php solr redis gearman

基本上,我想跟踪的某些指标的一部分是某些对象在我们的营销平台上获得的展示次数。 如果您想象我们显示了很多对象,我们希望每次提供一个对象时进行跟踪。

每个对象都通过单个网关/接口返回给客户端。因此,如果您想象一个请求进入具有某些搜索条件的页面,然后搜索请求被代理到我们的Solr索引。

然后我们得到10个结果。

这10个结果中的每一个都应被视为一种印象。

我很难找到一个非常快速和准确的实现。

有关如何执行此操作的任何建议?你可以投入任何数量的技术。我们目前使用Gearman,PHP,Ruby,Solr,Redis,Mysql,APC和Memcache。

最终所有的印象最终都应该保存到mysql,我可以每小时做一次。但我不确定如何快速将展示次数存储在内存中,而不会影响实际搜索请求的加载时间。

想法(我刚刚添加了选项4和5)

  1. 一旦结果返回给客户端,客户端就会在我们的平台上请求base64编码的URI,其中包含所有已提供服务的对象的ID。然后将此对象传递给gearman,然后将计数保存到redis。每小时一次,redis被刷新,并且mysql中每个对象的计数都是递增的。

  2. 从Solr返回结果后,循环并直接保存到Redis。 (没有对此进行基准测试以获得速度)。每小时重复刷新一次mysql。

  3. 从Solr返回项目后,将单个作业中的所有ID发送给gearman,然后提交给Redis ..

  4. 新主意由于返回的大多数项目大约为20,我可以设置一个X-Application-Objects标头,其中包含返回ID的base64标头。这些ID(在标题中)然后可以被nginx剥离,并且使用自定义LUA nginx模块,我可以从nginx直接将ID写入Redis。这可能有点矫枉过正。这样做的好处是我可以告诉nginx在写入redis时立即返回响应对象。

  5. 新主意使用fastcgi_finish_request()将请求刷新回nginx,然后将结果插入Redis。

  6. 还有其他建议吗?

  7. 编辑以回答问题:

    这些数据的可靠性并不重要。只要是最好的猜测。我不希望看到30%的印象下降。但我会允许10%的容忍度 - / + acurracy。

2 个答案:

答案 0 :(得分:2)

我认为你的两个最佳选择是:

  1. 使用递增命令I redis在您拉动dis时递增计数器。使用Id作为密钥并在Redis中增加它。 Redis可以轻松地每秒处理数十万个增量,因此应该足够快,不会对客户产生明显的影响。如果PHP语言绑定支持,您甚至可以管理每个请求。我认为确实如此。

  2. 将redis用作普通缓存。在此选项中,您只需使用Redis列表并执行包含由例如分隔的ID的字符串的rpush。一个逗号。您可以使用一天中的小时作为键。然后你可以通过抓住前一个小时并按摩它然后你想要进入MySQL来有一个单独的过程。我会在一段时间后将密钥过期,或者只是在后处理过程中删除密钥。

  3. 如果您拥有非常高的redis流量,或者只是想卸载它并获得它的备份奖励,您也可以使用读取从机来导出到MySQL。如果这样做,您可以将主redis实例设置为不刷新到磁盘,从而提高写入性能。

    关于更多地使用redis'功能进行此类跟踪的其他选项,请参阅this answer您还可以避免使用MySQL部分并从redis中提取数据,从而使整个系统更加简单。

答案 1 :(得分:0)

我会做#2之类的事情,然后将数据交给最快的队列,你可以更新Redis计数器。我对Gearman并不熟悉,但我敢打赌它的速度很慢。如果您的Redis客户端支持异步写入,我会使用它,或者将它放在一个单独的线程上的队列中。您不希望减慢等待更新计数器的响应速度。