实时流计算
挑战
大数据的5V:Volume(大量)、Velocity(快速)、Variety(多样)、Veracity(真实)和Value(价值)。
使用场景
在线系统监控
移动数据和物联网
金融风控
实时推荐
实时流数据的特点
实时性、随机性、无序性和无限性(与批数据最大的区别)。
批处理是在固定数据集上进行不同的查询,流处理是在无限数据集上进行固定的查询。
系统架构
数据传输,选择消息中间件,考虑因素:
- 吞吐量:消息中间件每秒能够处理的消息数。消息中间件自身的吞吐量决定了实时流计算系统吞吐量的上限;
- 延迟:消息从发送端到消费端所消耗的时间。如同吞吐量一样,消息中间件自身的延迟决定了实时流计算系统延迟的下限。选择消息中间件时,需确定消息中间件本身延迟对业务没有明显限制;
- 高可用:消息中间件的一个或多个节点发生故障时,仍然能够持续提供正常服务。高可用消息中间件必须支持在转移故障并恢复服务后,客户端能自动重新连接并使用服务。千万不能让客户端进入僵死状态,否则即便消息中间件依然在提供服务,而上层的业务服务已然停止;
- 持久化:消息中间件中的消息写入日志或文件,在重启后消息不丢失。大部分业务场景下,支持持久化是一个可靠线上系统的必要条件。数据持久化从高可用角度看,还需要提供支持数据多副本存储功能。当一部分副本数据所在节点出现故障,或这部分副本数据本身被破坏时,可以通过剩余部分的副本数据恢复出来;
- 水平扩展:消息中间件的处理能力能够通过增加节点来提升。当业务量逐渐增加时,原先的消息中间件处理能力逐渐跟不上,这时需要增加新节点以提升消息中间件的处理能力。Kafka可以通过增加Kafka节点和topic分区数的方式水平扩展处理能力。
数据处理,核心,目标可分为4类:
- 数据转化:包括数据抽取、清洗、转换和加载,如常见的流式函数filter和map,分别用于完成数据抽取和转化的操作;
- 指标统计:在流数据上统计各种指标,如计数、求和、均值、标准差、极值、聚合、关联、直方图等;
- 模式匹配:在流数据上寻找预先设定的事件序列模式,我们常说的CEP(复杂事件处理)就属于模式匹配;
- 模型学习和预测:数据挖掘和机器学习在流数据上的扩展应用,基于流的模型学习算法可以实时动态地训练或更新模型参数,进而根据模型做出预测,更加准确地描述数据背后当时正在发生的事情。
通常使用DAG(Directed Acyclic Graph,有向无环图)来描述流计算过程。常见的开源流处理框架有Storm、Spark、Flink、Samza和Akka Streams等。
数据存储
数据展示,We.UI
数据采集
设计接口
风险总体上可分成两类:
- 贷款对象信用风险:关注的是贷款对象自身的信用状况、还款意愿和还款能力。信用风险评估常用的分析因素有四要素认证和征信报告,使用的风控模型主要是可解释性强的逻辑回归评分卡;
- 贷款对象欺诈风险:关注的是贷款对象是否在骗贷。分析因素:网络(如IP是否集中),用户属性(如年龄和职业),用户行为(如是否在某个时间段集中贷款),社会信用(如社保缴纳情况),第三方征信(如芝麻信用得分),还有各种渠道而来的黑名单。使用的模型:决策树、聚类分析等。
互联网金融风控的一般流程:
解读:用户在客户端发出注册、贷款申请等事件时,客户端将用户属性、行为、生物识别、终端设备信息、网络状况、TCP/IP协议栈等信息发送到数据采集服务器;服务器收到数据后,进行字段提取和转化,发送给特征提取模块;特征提取模块按照预先设定的特征清单进行特征提取,然后以提取出来的特征清单作为模型或规则系统的输入;最终依据模型或规则系统的评估结果做出决策。
Spring Boot
置空。
BIO与NIO
在请求连接数比较小、请求处理逻辑比较简单、工作线程请求处理时延很短的场景下,使用BIO连接器是很合适的。
BIO连接器的本质缺陷是接收器和工作线程执行步调耦合太紧。
当前大多数操作系统在处理上万个甚至只需几千个线程时,性能就会明显下降。
Tomcat的NIO连接器还引入选择器(包含在轮询器中)来更加精细地管理连接套接字,选择器只有在连接套接字中的数据处于可读(Read Ready)状态时,才将其交由工作线程来处理,避免工作线程等待连接套接字准备数据的过程。
NIO连接器的两点改进:
- 接收器和工作线程隔离,彼此不影响,更充分利用资源;
- 队列缓存待处理的连接套接字,NIO连接器能保持的并发连接数不再受限于工作线程数,而只受限于系统设置上限(由LimitLatch指定)。
NIO和异步
任务类型
大致可分为:
- CPU密集型任务:CPU受限型任务,处理过程中主要依靠CPU运算来完成的任务;
- I/O密集型任务:在处理过程中有很多I/O操作的任务,其执行速度会受限于I/O的吞吐能力;
- I/O和CPU都密集型任务
纤程
fiber,也叫协程(coroutine),一种用户态线程,其调度逻辑在用户态实现,从而避免过多地进出内核态进行进程调度和上下文切换
Actor
NIO配合异步编程
Netty
Netty工作原理如下图
解读:Netty用reactor线程监听ServerSocketChannel,简称SSC,每个SSC对应一个实际的端口。当reactor线程监听的SSC监测到连接请求事件(OP_ACCEPT)时,就为接收到的连接套接字建立一个SocketChannel,并将该SocketChannel委托给工作线程池中的某个工作线程做后续处理。之后,当工作线程监测到SocketChannel上有数据可读(OP_READ)时,就调用相关的回调句柄(handler)对数据进行读取和处理,并返回最终的处理结果。通常将reactor线程池称为BossGroup,而将工作线程池称为WorkGroup。
@AllArgsConstructor
private static class RefController {
private final ChannelHandlerContext ctx;
private final HttpRequest req;
public void retain() {