用Elasticsearch+Redis构建投诉监控系统,看Airbnb如何保证用户持续增长

如今,我们如何了解到用户日益增长的新问题?

对特定某个人来说,这个问题似乎很好回答——对于每家公司来说,都是明确易答的问题。但实际上,我们发现这个问题没那么简单。

当然,我们的数据库存储有用户问题的数据,但对于上述问题,我们也没有很好的答案。我们缺乏有效的方法来总结问题的趋势,也没有能力实时监控问题。大多情况下,当我们发现趋势出现时,想要解决就已经太迟了。考虑到这种情况,我们开始设计相应的解决方案。

相关的一点背景: 从Airbnb开站以来,我们已经接待了800亿名访客,用户量增长十分迅猛。随之,我们的工程师团队一直在寻求解决之道,以应对具有挑战性的新问题。

在Airbnb的实际运营中,有很大一部分来自房东与房客们的问题要靠客服人员来处理。挑战之一在于:了解我们数量巨大的表单,并找出其中的趋势或者实时探测到不希望出现的问题。我们需要一种监控方式,当特定问题频繁出现时提醒并警告我们。

我们所构建的:

我们构建了一个基于web的服务,可以根据用户提交的表单来计算趋势,并可将指定时间内的主要趋势可视化。包含表单的一些不同属性,比如问题类型、浏览器版本、用户国家、标题、来源等等。有了这些数据,我们就能分析一定时间内所有表单的各项属性,并通过算法排序,以找出其峰值或趋势。实际上,我们同时运行着两种不同的算法,以便在优化的同时仍保留之前的基准,以便进行比对。

工作方式

基础架构

需要我们将其划分为一些不同的部分,首先是存储表单的数据存储模块,负责存储并在数据处理时也可以快速查询。我们使用了Elasticsearch来负责这个部分。然后,我们还需要运行负责接受新表单数据请求的web服务,这里我们使用了Node.js应用来处理新的表单。

此外,我们还运行着一个单独的任务实例,能够持续计算表单趋势。它可以负责查询表单数据的Elasticsearch实例,并将结果存储到Redis实例中。Redis中存有表单趋势结果的缓存,以便Node.js在web中进行渲染。整个前端都构建于React之上,因此想要开发丰富的UI来展示数据就非常简单了。

数据存储

我们决定按照表单创建的方式,以流数据的形式将其实时录入Elasticsearch的集群中。之后通过定期运行的批处理操作来处理这些数据,计算表单的趋势。将这些表单存储在Elasticsearch中使得扩展与执行数据组相关的聚集查询都非常简单。根据所存储数据的类型,对表单字段进行索引。

任务worker

我们的任务worker是负责查询存储数据,并及结算各个表单组的趋势分数的。我们使用了单独的实例,用web worker来执行这项任务,因为我们不希望处理的时间太长,而导致负责新表单数据请求录入的API出现延迟。之后,结果趋势数据会被发送给Redis,另一个web实例会拿取相应数据。

如何找出趋势

探测趋势是所有这些工作的核心。我们先是在Elasticsearch中运行multi-search查询,得出一定时间内的表单,所有表单附有各项所需的表单属性,然后使用这些属性来总结趋势。之后将评分模型运用于所有的时间序列,将结果归类并返回所有高于最小阈值的趋势属性。这些结果就成为了相应时间段的趋势。

评分模型的任务就是按周期进行调整,删除干扰项,让图谱曲线更加平滑,然后确定该曲线中是否存在波峰。为了对周期趋势进行平滑和调整,我们通过傅里叶变换(Fourier transform)将图谱转化为频率范围,找出频率峰值,只留接近的频率,删除其它所有。这样调整之后的曲线,就是我们的表单在某个周期之内的统计呈现。在修剪过原始图谱之后,我们就能得出现有图谱与预计数值的差异。根据最终调整完成的图谱,依据其中的一些因素,比如最大改变值与某段时间内的总表单数量,得出最终分值。

当计算出每小时各个表单字段的得分后,我们会将存储中得分较高的那些存入Redis,供前端使用。

Web UI

一旦我们计算得出的数据被存入Redis,显示起来就很快了。我们添加了相应功能,比如查看过去某段时间内的趋势,以及较长一段时间内最热门的项目。

背景故事

自从发布以来,我们的面板对快速探测问题起了很大作用,例如:我们发现了一个峰值——用户纷纷报告在搜索时看不到结果。刚开始使用的新用户通常都会遇到这类问题,因此客户人员并未太过关注。此外,由于并不是完全没有结果返回,这种问题更经常出现在微妙的边界情况下,因此工程师团队没有立刻发现这是个问题。但是,由于我们探测到了表单波峰,因此很确定有问题出现,需要修复。我们的工程师们很快修复了这个问题,过了没多久表单提交数量就出现回落,让我们确信问题已经修复。没有这个面板的话,这个问题可能会持续数日甚至数周,造成客服的高负荷以及用户的不满。

经验心得

在Airbnb,这个面板我们已经用了有半年多,还找出了一些很难发觉的问题。我们捕捉到了多个波峰,包括一些很小的bug,也包括一些可能会发展成大问题的小问题。这个表单面板并未取代现有的宕机与系统错误监控系统,而是用于解决各类问题。

事实证明,这个新的表单监控系统在我们看来,是每个大型公司都应当拥有的无价之宝。通过将影响最大的问题曝露出来,获得及时修复而减少了用户的问题。我们预计,该表单面板能够减少表单总量的3%。

该项目是Airbnb的一个hackathon项目演化成的系统。有时候看到一个由两人写就的编程马拉松(hackathon)项目最终为Airbnb的用户节省了大量的时间,并让一切步上正轨可真是疯狂。

原文: https://medium.com/airbnb-engineering/how-airbnb-manages-to-monitor-customer-issues-at-scale-b883301ca461#.pikn6t8bk
译者: 孙薇 微博@Verawala

未经允许不得转载:氢网 » 用Elasticsearch+Redis构建投诉监控系统,看Airbnb如何保证用户持续增长

支付宝扫码打赏 微信打赏

欢迎点击上方按钮对我打赏

分享到:更多 ()

评论 抢沙发

评论前必须登录!