php – 高性能展示跟踪

基本上,我想跟踪的某些指标的一部分是某些对象在我们的营销平台上获得的展示次数.

如果您想象我们显示了大量对象,我们希望每次提供对象时进行跟踪.

每个对象都通过单个网关/接口返回给客户端.因此,如果您想象一个请求进入具有某些搜索条件的页面,然后搜索请求被代理到我们的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模块,我可以从nginx直接将ID写入Redis.这可能有点矫枉过正.这样做的好处是我可以告诉nginx在写入redis时立即返回响应对象.
> new idea使用fastcgi_finish_request()将请求刷新回nginx,然后将结果插入Redis.
>还有其他建议吗?

编辑回答问题:

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

最佳答案 我认为你有两个最好的选择:

>使用递增命令I redis在您拉动dis时增加计数器.使用Id作为密钥并在Redis中增加它. Redis可以轻松地每秒处理数十万个增量,因此应该足够快,不会对客户产生明显的影响.如果PHP语言绑定支持,您甚至可以管理每个请求.我认为确实如此.
>使用redis作为普通缓存.在此选项中,您只需使用Redis列表并执行包含由例如分隔的ID的字符串的rpush.一个逗号.您可以使用一天中的小时作为键.然后你可以通过抓住前一个小时并按摩它然后你想要进入MySQL来有一个单独的过程.我会在一段时间后将密钥过期,可以将它们清理干净,或者只是通过后处理过程删除密钥.

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

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

点赞