1 为了解决什么样的问题

伴随着信息科技日新月异的发展,信息呈现出爆发式的膨胀,人们获取信息的途径也更加多样、更加便捷,同时对于信息的时效性要求也越来越高。
举个搜索场景中的例子,当一个卖家发布了一条宝贝信息时,他希望的当然是这个宝贝马上就可以被卖家搜索出来、点击、购买啦,相反,如果这个宝贝要等到第二天或者更久才可以被搜出来,估计这个大哥就要骂娘了。
再举一个推荐的例子,如果用户昨天在淘宝上买了一双袜子,今天想买一副泳镜去游泳,但是却发现系统在不遗余力地给他推荐袜子、鞋子,根本对他今天寻找泳镜的行为视而不见,估计这哥们心里就会想推荐你妹呀。其实稍微了解点背景知识的码农们都知道,这是因为后台系统做的是每天一次的全量处理,而且大多是在夜深人静之时做的,那么你今天白天做的事情当然要明天才能反映出来啦。

2 实现实时计算系统需要解决那些问题

如果让我们自己设计一个实时计算系统,我们要解决哪些问题。
(1)低延迟:都说了是实时计算系统了,延迟是一定要低的。
(2)高性能:性能不高就是浪费机器,浪费机器是要受批评的哦。
(3)分布式:系统都是为应用场景而生的,如果你的应用场景、你的数据和计算单机就能搞定,那么不用考虑这些复杂的问题了。我们所说的是单机搞不定的情况。
(4)可扩展:伴随着业务的发展,我们的数据量、计算量可能会越来越大,所以希望这个系统是可扩展的。
(5)容错:这是分布式系统中通用问题。一个节点挂了不能影响我的应用。
(6)通信:设计的系统需要应用程序开发人员考虑各个处理组件的分布、消息的传递吗?如果是,发人员可能会用不好,也不会想去用。
(7)消息不丢失:用户发布的一个宝贝消息不能在实时处理的时候给丢了,对吧?

3 应用场景

Storm处理数据的方式是基于消息的流水线处理, 因此特别适合无状态计算,也就是计算单元的依赖的数据全部在接受的消息中可以找到, 并且最好一个数据流不依赖另外一个数据流。
因此,常常用于

  • 日志分析,从海量日志中分析出特定的数据,并将分析的结果存入外部存储器用来辅佐决策。
  • 管道系统, 将一个数据从一个系统传输到另外一个系统, 比如将数据库同步到Hadoop
  • 消息转化器, 将接受到的消息按照某种格式进行转化,存储到另外一个系统如消息中间件
  • 统计分析器, 从日志或消息中,提炼出某个字段,然后做count或sum计算,最后将统计值存入外部存储器。中间处理过程可能更复杂。

4 案例

一淘-实时分析系统

一淘-实时分析系统:实时分析用户的属性,并反馈给搜索引擎。最初,用户属性分析是通过每天在云梯上定时运行的MR job来完成的。为了满足实时性的要求,希望能够实时分析用户的行为日志,将最新的用户属性反馈给搜索引擎,能够为用户展现最贴近其当前需求的结果。

携程-网站性能监控

携程-网站性能监控:实时分析系统监控携程网的网站性能。利用HTML5获得可用的指标,并记录日志。Storm集群实时分析日志和入库。使用DRPC聚合成报表,通过历史数据对比等判断规则,触发预警事件。

游戏实时运营

一个游戏新版本上线,有一个实时分析系统,收集游戏中的数据,运营或者开发者可以在上线后几秒钟得到持续不断更新的游戏监控报告和分析结果,然后马上针对游戏的参数 和平衡性进行调整。这样就能够大大缩短游戏迭代周期,加强游戏的生命力。

实时计算在腾讯的运用

实时计算在腾讯的运用:精准推荐(广点通广告推荐、新闻推荐、视频推荐、游戏道具推荐);实时分析(微信运营数据门户、效果统计、订单画像分析);实时监控(实时监控平台、游戏内接口调用)

实时计算在阿里的运用

为了更加精准投放广告,阿里妈妈后台计算引擎需要维护每个用户的兴趣点(理想状态是,你对什么感兴趣,就向你投放哪类广告)。用户兴趣主要基于用户的历史行为、用户的实时查询、用户的实时点击、用户的地理信息而得,其中实时查询、实时点击等用户行为都是实时数据。考虑到系统的实时性,阿里妈妈使用Storm维护用户兴趣数据,并在此基础上进行受众定向的广告投放。