豌豆荚近日发布了应用搜索的新版本,主要针对安全、隐私等问题做出了改善,InfoQ 就相关技术问题对其工程师进行了采访。
InfoQ:首先请二位做下自我介绍?
陈兴润:我叫陈兴润,是豌豆荚的后台工程师,和吉昌一样也是早期的团队成员,主要负责应用搜索。
丁吉昌:我叫丁吉昌,我跟兴润是同期来豌豆荚的,现在我们也在一个团队,我现在算是应用搜索的负责人。
InfoQ:豌豆荚应用搜索迄今在架构上经历了几个阶段?
陈兴润:主要是三个阶段,第一个阶段,我们当时是为了追求全,就收录尽可能多的应用。在这个阶段我们会有爬虫不断的去爬取各大市场的应用。当时机器比较少,人也比较少,所以更新频率不是很快,大概是一天更新一次,就是从爬虫到最后展现给用户需要一天的时间;第二个阶段,因为对实时性要求不断提高,我们对架构进行了一些调整,大概从爬虫爬到以后,到最后展现给用户需要六个小时;第三个阶段是从今年 6 月份开始做的,现在从爬虫爬到到最后展现给用户,能够在秒级完成,大概五秒以内就能够在首页出现,用户在 30 秒内就能够搜到。
InfoQ:搜索的实时性是怎么来做提高的?
陈兴润:第一个阶段实时性不高是因为我们做了页面的静态化,所有用户看到的内容是一样的;第二个阶段,我们去掉了页面静态化的逻辑,加入了一些后端数据库的缓存,这样子在性能没有太多损失的情况下,提高了实时性;第三阶段我们用了一系列的消息中间件,还有使用订阅和发布机制来保证整套系统能够在秒级的时间内更新。 并且最早的时候我们主要是靠爬虫去各个应用商店抓取内容,最近有很多应用商店愿意和我们合作,他们会把数据主动的推给我们,这样能够更快、更实时的拿到最新的数据。
InfoQ:豌豆荚应用搜索这次发布的“绿色标签”和“优质开发者认证”主要是在安全方面做出了改善,这些背后是怎样一个机制?
陈兴润:我们主要有四个标签:
第一个是安全标签,我们接入了三家安全厂商,每收录一个应用,就会把这个应用交给这些厂商,请他们帮我们做病毒扫描。如果全部都能扫描通过的话,我们就会打上“安全”标记;如果有一家不通过,其他家通过的话,我们就会标上“可疑”标记;如果两家或全部都不通过就会标上“危险”标记,标记为“危险”的应用不会出现在页面上、用户也是搜索不到的;
第二个是广告标签,我们会收集一些广告 SDK 的特征清单,对我们拿到的每个应用,利用这个清单进行过滤,如果应用用到了这个清单中的 SDK,我们就认为这个应用里面有广告。同样,如果有那种比较恶劣的通知栏广告应用,我们也是不会让它出现在应用搜索的首页上;
第三个是权限标签,我们整理了一些可能危害用户隐私的权限,比如说打电话、发短信、访问他的联系人数据等,如果一个应用用到了这些权限,我们就认为他有可能会触犯用户的隐私,除非他有很好的理由说用这个权限的确是合理的;
第四个标签是 Google Play 验证标签,主要是针对有些在 Google Play 上的国外应用。它的原理是:豌豆荚会去爬 Google Play 上的应用安装包,拿到以后会分析出这个应用的签名,把它存在数据库里,对我们爬到的每一个应用做签名认证。如果他的签名和它在 Google Play 上的签名是一样的,我们就会给他打上 Google Play 认证标签。因为有些应用可能会经过国内很多破解或者汉化等加工,加工以后有可能损害用户的利益:破解者可能加一些广告,或者加一些危害用户隐私的代码。如果我们标上了 Google Play 验证的标签,就说明用户看到的这个应用包和 Google Play 上的包是一样的,这样就可以一定程度保证这个包没有被第三方非法篡改过;
丁吉昌:还有一个优质开发者标签。其实刚才兴润基本上把原理都讲了,像安全就是我们为什么引入三家、四家?因为我们发现所收录的应用,每家安全厂商对其判断标准还是挺不一样的,比如 29% 的应用腾讯觉得没问题,360 却觉得有问题;同样有接近 30% 的应用,360 觉得没有问题,腾讯觉得有问题,所以我们也就引入了多家安全厂商来做辅助判断。对于广告,豌豆荚会针对超过 1000 个广告特征进行扫描,是国内做的比较早的。这四个标签对我们的分析来说都比较重要,因为没有任何一个指标能完全保证应用质量是靠谱的,既使是像 Google Play 这种审核比较严格的市场,也有 3% 左右的应用是有安全问题的,所以我们就把更多标签都放上去。除了这些标签之外,我们还做了一个用户不可见的事情:相信“用户投票”的结果,用户好评低于 30% 的应用也不会出现在首页。在做应用排序的时候会通过 4 个绿色标签和优质开发者认证来做一个优先级排序,这是一个智能的筛选策略,也是本次重构的重点。
InfoQ:你们在实现这些绿色标签的时候,技术上会有哪些挑战?
丁吉昌:安全方面,我们觉得实现的难点可能是商务谈判上,即如何把不同的安全厂商接入进来,让他们愿意合作;第二就是广告扫描,如何跟的上广告特征增加的速度,因为广告平台在不停的增加,包括他们的特征也不停的增加,这些是需要持续维护的一件事情。
InfoQ:实际上对于广告和权限就是直接看它是否有声明?
丁吉昌:我们会解开他的代码来解析;同时我们还在使用“用户投票”的结果,就是我们会根据用户自己的选择结果来判断哪个应用最受欢迎、哪个应用的签名最受欢迎。对于我们完全没有办法进行验证的应用,我们会用这个策略来判断,同时这里面涉及到的计算量会比较大,因为我们有几千万用户,所以这里面也有些技术难度。
InfoQ:这个是做实时计算吗?
丁吉昌:对,实时计算。
InfoQ:现在我们怎么来做这一块的?有多大的一个集群?
陈兴润:我们是有一个集群,现在其实是有数十台机器跑在 Hadoop 上。
丁吉昌:主要是 Hadoop,一开始我们计算的时候要两天,后来重构算法以后可以做到几乎实时,包括现在豌豆荚上看到那些安装量也都是实时的,当然现在还没有做到每秒去更新,因为计算量比较大;
InfoQ:当应用被收录之后豌豆荚会做哪些工作?
陈兴润:我们的爬虫是以全为目的,尽可能多的收录应用。但是收录进来的应用不一定能让用户看到。会根据一些原则来进行处理,例如违法等应用不会显示也不能搜索到;
丁吉昌:其实收录以后会进行安全、广告校验,也会对完整性、非法性做基本的校验,只有满足这些条件的,才会入到我们最终的库里面展现给用户。
InfoQ:豌豆荚的推荐算法是怎么来应用的?
彭跃辉:目前我们做了“豌豆猜”。为什么做这个东西呢?是因为我们发现用户在豌豆荚里面下载应用,Top200 的应用好像就已经占了下载量的 95% 以上,这样会有一个问题,即大部分应用其实用户都接触不到。做“豌豆猜”当时的目的就是想把一些优质的应用展现给用户。另一方面是应用不像音乐,用户的搜索行为不是太多,用户主要是靠浏览去下载应用;还有就是我们想对一些用户历史行为进行挖掘,去发现一些用户的兴趣点,然后把他感兴趣的应用推荐给他。
InfoQ:挖掘这个算法能够稍微介绍一下吗?
彭跃辉:其实上周六的时候,我们去参加了推荐系统的大会,在会上也简单介绍过。我们发现一个很有意思的点是我们做这件事情的过程和 Hulu 做推荐系统的演变过程基本上是一样的。我们在最开始的时候,可能是一种基于 item 的协同过滤算法。随着我们对应用领域的了解,我们发现其实可以把一些应用的特征加进去,就加入了一些基于内容的推荐。这样的话,第二个版本就是一些基于 item 的协同过滤加上一个基于内容的推荐。做完这部分之后,我们发现这两种策略还是有一些 bad case,主要体现就是它经常给出的是一些相似的应用,但不是一些相关的应用。举例来说,比如你下了一个愤怒的小鸟,他会给你推荐一个愤怒的小鸟 2。但是相关的想法是,比如说你下了“知乎”,要可以给你推荐“点点”,或者给你推荐“豆瓣读书”这样的应用。我们为了让应用相关性更强就引进了一些 topic model 的算法。目前我们会对一些应用抽取 topic,建立这些应用和 topic 之间的关联。我们目前就是做到第三步这个阶段;
InfoQ:豌豆荚应用搜索下一步有什么打算?
丁吉昌:就如兴润刚才所讲,我们之前目标是做全,现在的目标是要做精。再长远一点,我们会考虑做一些事情:第一个提供给用户的安装包,首先是安全的,没有广告、弹窗,或者隐私这种问题。但同时还要考虑用户手机是不是能够安装上,因为 Android 分裂的特别严重,所以也不是每个开发者都有精力来做到所有的手机适配,我们会将适配加入到应用搜索中;另外是运营方面也有一些策略,比如现在正在做的优质开发者,对于优质开发者的应用将会在各种排序和策略上优先展示;
陈兴润:有些事情其实我们还没有特别确定,比如说我们现在做的事情可能是过去三、五个月摸索的时候,发现用户有很多抱怨或者有需求没有满足的时候才开始做的。最终做成什么样,还要根据用户的反馈;
评论