自从互联网和物联网诞生以来,人与人、人与物、物与物之间的互联和互动愈加紧密和频繁,大量丰富多彩的数据在互联和互动的过程中产生。海量的数据洪流将我们的时间和空间愈占愈满,以至于让我们开始疲于奔命,鲜有时间和能力再去感受和思考那些一瞬间的百万种可能。
武林江湖中留传着一句至理名言:“天下武功,无坚不摧,唯快不破!”。
更快更完整地获取数据,更快更充分地挖掘出数据价值,业已成为大数据时代各行各业的共识。在线系统监控、移动数据和物联网、金融风控、推荐系统等,虽然行业各不相同,但是它们有个共同点——“实时流计算”技术在这些领域发挥着越来越重要的作用。
01 “流”好在哪里?
“流”是一种非常好的编程模式。
▲图1:代表流计算模式的有向无环图DAG首先,“流”与“异步”不谋而合。“流”的各个节点通过队列传递消息,不同节点的执行正好就是完全异步的。并且由于有队列隔离,不同节点的执行完全不用考虑并发安全的问题。“流”在内部执行时是异步和并行的,能最大限度提高资源使用效率,提高程序执行性能。可以说,“流”是“异步”的一种重要表现方式,“异步”则是“流”在执行时的内禀性质。▲图2:“流”和“异步”,傻傻分不清楚!其次,如果“流”的执行节点间使用的是阻塞队列,那么整个流的各个执行环节就天然地带有了反向压力能力,让我们不必担心很多异步系统在高负载而又临时处理能力不足时造成的OOM问题。再次,“流”能够非常自然地描述业务执行的流程。不管是大到整个产品线的各个服务模块,还是小到每个服务模块中的具体实现步骤。就像“分形”一样,“流”能够做任意细力度的划分。这是一种非常普遍的描述事情发生过程的模式。最后,通过类似于Kafka这样消息中间件的隔离,可以非常清晰地定义模块和模块之间的边界,从设计模式中高内聚、低耦合的角度来看,是一种非常不错的实践!02 流计算解决了什么问题?总的来说,我们使用流计算主要是为了计算以下几类问题。1. 流数据操作流数据操作可以说是流计算系统与生俱来的能力,它本身是针对数据流的转化或转移处理,所以实现和使用起来都相对更加直观。流数据操作的内容主要包括了三类:对数据进行清洗、规整和结构化,对不同来源的数据进行关联及合并,以及在不同系统之间搬运数据。这三类操作通过一些常用的流式API就可以实现。2. 单点特征计算一个事件中包含的用户是否在黑名单中?发生事件的设备是否是模拟器?温度传感器传来的温度事件是否已经超出正常温度范围?发送消息设备的IP是否是代理?一次交易的金额是否属于大额交易?手机是否有SIM卡?诸如此类的问题,要么可以通过黑白名单,要么能够通过特定的规则计算而得到答案,实现起来相对简单,所以我们将这类特征计算称之为单点特征。3. 时间维度聚合特征计算相同设备的1小时内注册事件次数、相同银行卡号的7天交易事件次数、过去30天内同一IP段上交易金额、过去1分钟高温事件的次数、过去5分钟日志告警事件的次数……诸如此类特征在诸如风控、预警、监控等各种场景都非常广泛的应用。分析不难发现,这类特征都有个共同特点,它们均需要在时间维度对数据进行聚合运算。因此,我们称这类特征为时间维度聚合特征。4. 关联图谱特征计算除了时间维度的聚合分析外,我们还经常进行“空间”维度的聚合分析。不过这种分析有个更专业的名字,即“关联图谱”分析。比如在一些风控场景中,我们需要计算用户账户使用IP的个数、同一手机号码发生在不同城市的个数、同一设备上关联用户的数目、同一用户关联设备的数目、同一推荐人推荐的用户数等特征。以设备关联用户数为例,如果某个设备上注册的用户很多,那么它的风险就比较高,毕竟正常情况下我们都只会用自己的手机注册自己的账号,而不会是帮其他几十、上百人注册账号的。5. 事件序列分析数据流中的数据不是单纯在时间上有着先来后到的关系,而是在数据和数据之间也有着联系。考虑用户在手机上安装新APP的过程,它可能是先点击了某个广告