2016年6月12日,佛罗里达州奥兰多一家名为“脉搏”(Pulse)的同志酒吧发生的一起大规模枪击案,共造成约50人死亡,53人受伤。这是美国历史上最严重的大规模枪击事件。初步认定行凶者为29岁的美国公民奥马尔·马丁(Omar Mateen),其父母为阿富汗移民。事后,Facebook在宣布启用“Safety Check”(安全确认)功能,这也是Safety Check功能首次在美国本土启用。
什么是Safety Check功能?
Facebook的“Safety Check”是一项帮助大家在自然灾害或重大突发事件发生后向亲友报平安的功能。这一功能起始于2011年的日本大地震,Facebook日本的员工由此开发一款产品Disaster Message Board(灾难信息留言板),让人们在灾难发生时能快速获知自己的朋友家人是否安全,演变成今天的 Safety Check。
在Facebook在受灾地区启动Safety Check后,如果你处在受灾地区,会收到Facebook的一条消息,问你“Are you safe”(你是否安全?)如果你是安全的,可以选择“I'm safe”按钮,这条消息就会发到News Feed里,你的朋友会在提醒里看到这条消息。如果你有朋友在受灾区,点开提醒里的消息,就会进入到Safety Check的书签一栏,这里显示你所有在受灾区朋友的状况,绿色勾表示安全,灰色勾表示可能处于危险之中。同样的,你的朋友确认你安全后也可以帮你标记。
Safety Check于2014年10月正式发布,一开始只定位于自然灾害,一直到2015年11月,发生巴黎恐怖袭击事件(130人死亡,368人受伤,法国二战以来最大的一次伤亡事件),这是Facebook第一次就社会重大暴力事件启动Safety Check,并为Facebook赢得了“反应迅速”的称赞。
这一功能最引人注目的一点是:信息传递的即时性。一旦启动Safety Check功能,Facebook就能通过算法在5分钟内找到大多数在灾难发生地的用户,以至于人们感觉它是即时发生没有延迟的。那么这一功能是如何实现的?雷锋网发现了一篇在Highscalability上的文章,讲述了这一功能的背后故事,雷锋网(公众号:雷锋网)选编如下:
《当灾难发生时,Facebook是如何在5分钟内告诉你的朋友你是否安全?》
当有灾难发生时,人们会迫切需要知道自己所爱之人是否安全。无论是9.11还是1989年的的洛马普列塔地震,都让我深深地有这样的感觉。
地震转瞬即来。当我们确认建筑不会崩塌后,第一反应会想去确认亲人的安全,但在这时想要拨出电话基本是不可能的。电话在一瞬间从全国各地涌入湾区,信息堵塞。我们只能紧张地看着电视里播报的灾难消息,满心焦灼但无能为力。
经过了四分之一个世纪后,这种情况是否有所改变?
Facebook的“Safety Check”功能做到了这一点。当有灾难发生时,他们会给在灾难区域的人们发送一条推送以确认安全,当确认你的安全后Facebook会立即告诉你的朋友:“别担心,他还安全。”
这一功能由Facebook工程师Brian Sa在2011年的神户大地震后激发的灵感。地震发生后,Brain在Facebook的首页放了一个各种帮助信息的Banner,但随后他进一步去想开发一个新功能,以便更好帮助受灾者,这便是“Safety Check”的雏形。
Brain是这么认为的:
解决那些在某种程度上非你(Facebook)不可的现实世界的问题。打破常规,想想你和你的公司能发挥多独特的作用。
为什么只有Facebook能创造Safety Check?
Facebook不仅拥有你所希望的资源,更是一家会让员工去开发Safety Check这种疯狂举动的公司。此外,Facebook拥有超过15亿用户,按“六度空间”理论,人与人之间的间隔度仅为4.74,并且Facebook的用户都是社交狂人,能实现信息的即时传递。
那么,Facebook开发“Safety Check”又是基于什么样的想法呢?Peter和Brian是这么认为的:
你可以把Facebook想象成一锅可以复制的“原始汤”,像病毒营销这样的案例很容易随着时间在数十亿的平台疯狂发展,取得(超过)1000倍的传播效果。
如ReadWriterWeb、支持同性婚姻的彩虹滤镜等Facebook上的案例让他们有了“在灾难期间,帮助他人更好确保朋友知道自己安全”的想法:在灾难期间,人们可以更新自己的状态表示自己“安全”。
但是,这并不是一个让别人知道自己还“安全”的最佳解决方案,因为:
你需要:1.告诉朋友们你还安全;2.你朋友得到信息确定你还安全
首先,不是你所有的朋友都能看到这个更新
其次,用户没有办法得到所有处在灾难中的朋友的名单
Brain想用更结构化的方法来再Safety Check解决这一问题。那么,它是如何运行的?
如果你处在受灾区域,Facebook会发给你一条推送,询问你是否安全;
如果你还OK,点击“我很安全”按钮,确定自己是安全的;
你所有的朋友都会被提醒你还安全;
你的朋友们也可以看见一个所有在受灾区域朋友的名单。
所以问题来了:你是如何建立一个用户是否在灾难发生地?一个容易想到的解决方案是构建地理索引(GeoIndex)的确是,但它有很多不足:
人们在不断移动的,数据不能实时更新;
为十五亿用户建立地理索引太过庞大,Brain小组并没有足够的资源去支撑它——记住,他们只是Facebook这个大公司里试图实现这个解决方案的小团队;
而且:比起考虑如何保留一个平时几乎用不到的的数据通道,解决方案必须考虑事件的突发性,即:一旦突发事件发生时,这个功能是动态即时可用的。最后解决方案综合了社交图谱的轮廓及属性:
当灾难发生时(例如尼泊尔地震),Safety Check会检查每个独立信息流载入过程中被触发“钩子”;
当用户检查他们的信息流时,“钩子”就会生效。如果用户载入信息时不在灾难发生地(尼泊尔)那么任何事情都不会发生;
但当有人处在尼泊尔又去查询了他的信息流,Duang。
接下来Safety Check会检查用户的所有好友,如果他们在同一个区域,Safety Check就会立即发送一个推送通知,询问他们是否还安全。
这个过程会不断重复,对于每一个被确认在灾难地域的人,最主要的工作就是去检查他们的好友,然后发送通知。
在实践过程中,这个方案是非常有效的。算法可以很快地寻找到人,以至于让人觉得它是即时发生,没有延迟。例如说,一群人在同一个房间的人会在同一时间收到他们的提示信息。这是如何做到的?
秘诀在于:
Facebook上人与人链接的图谱是是密集且有联系的。在Facebook上,十五亿用户任意两名之间的间隔度只有4.47而不是6,平均来讲,只要5步就能在Facebook上找到任何人。一旦系统在推送消息的时候随机挑选了一个更活跃而且且朋友数更多的用户,这样就过滤掉了很多无效的用户,不需要再进行数十亿的无用计算了。
但另一个问题又出现了:Safety Check能够自由地使用并行服务器去处理不同的用户请求,包括用户的好友。这个时候,分布式解决方案可能会出现这样的问题:
两台在不同的数据中心机器检测到同一个用户,这意味着遍历了分离度边缘后,有个用户会收到两条通知。
设身处地想象一下:如果户一下子收到多个确认他平安的通知,这会反而会增加用户的焦虑感。
解决方法是:
用一个数据库来储存状态,这样就只有一台机器被用来检查用户了。
在尼泊尔地震中:
不到五分钟就有三百万人收到更新状态的请求,超过1亿在尼泊尔的人得到安全确认。
五分钟之内,三分之二的FACEBOOK用户被系统遍历了一回。
在经历了一些麻烦后,Safety Check发布了第一个版本。
但由于Facebook系统本身的复杂性,这个功能被暂时隐藏了,只有当发生紧急情况时,它才得以被启用。例如刚刚发生的奥兰多枪击案。
雷锋网原创文章,未经授权禁止转载。详情见转载须知。