一、 4paradigm
-
交付时效提速:端到端的完成数据集成、模型训练、应用部署、模型监控全流程自动化,实现AI模型生产上线流水线级别的应用部署。同时通过标准化的生产应用产物定义实现沙箱生产一键迁移(场景模板导入导出),并借助参数化实现多环境的灵活适配(场景参数airflow)。
-
上线运维成本降低:
- 具备高可用稳定运行基座,调度运行具备一定自愈处理能力,并搭配回报处理机制实现告警接入(airflow超时、重试、超时间隔、回填机制、callback函数)。
- 系统提供标准化清理机制提升系统的稳定性(清理数据库中的scene、task、alertrule、param---清理airflow DAG、Variable---清理minio中的文件---调用k8s API清理alert rules---调用Grafana API清理Dashboard)。
- 同时内置技术+业务指标实现模型线上的智能监控(模型监控)。
1. 为什么使用airflow?
- Airflow支持用户使用Python编写DAG来创建任务之间的依赖关系,从而构建工作流。Aiflow提供完整的DAG支持,且能够编写代码动态的生产DAG或者Task,支持使用ExternalTaskSensor的方式来构建跨DAG的依赖关系。
- 提供WebUI来监控任务的运行状态,用户可以在WebUI上或者是使用REST AOI来开启、关闭、触发、重跑DAG任务,查看任务运行的日志。
- 不仅支持常规的(Bash、Python、JDBC)Operator,还支持大数据领域(HDFS、Hive、Spark)的各种Operator。且支持机器学习相关的Operator,还支持云原生(Kubernetes、Docker)各种Operator,与各种通讯Operator(Email、Dingding、Wechat)无缝衔接。
- Airflow可以使用多种方式进行部署,常规的物理机、Docker容器、K8s集群部署。我们这边采用的是Helm Chart。
- 性能优异,自airflow2.0发布之后,各个组件均可以水平扩展,task之间的流转在秒级别,scheduler可以无限的水平扩展,结合k8s使用可以实现动态的缩扩容,极大的提升资源的利用率,降低成本。
支持定时、手动的调度能力。通过代码的方式编排复杂的工作流,并且可以通过XCom机制来实现上下游传输数据,通过trigger_rule来实现复杂的依赖关系。支持DAG&task级别的重试、超时、Callback能力。有着丰富的Operator(常规的BashOperator、PythonOperator、BranchOperator、ExternalTaskSensor),还可以自定义Operator。还支持添加全局变量使得代码能够在运行时以Jinja模板来去替换。
2. Mysql清理工具
0. 数据清理:
- 输入保留最近天数
- 输入保留最近版本数
- 输出总览信息,告知用户本次清理规模
- 确认清理后开始进行数据备份`SELECT ... INTO OUTFILE`
0. 备份恢复 LOAD DATA INFILE
- 备份删除
二、百度
- 用例撰写:
- 由外向内移动,判断当前节点不是目标节点的祖先节点。拿到当前节点以及目标节点的祖先列表,如果当前节点在目标节点祖先列表中,则表示复制移动失败。
2. LTS技术架构
LTS目前支持四种任务:
- 实时任务:提交了之后立即就要执行的任务。
- 定时任务:在指定时间点执行的任务,譬如 今天3点执行(单次)。
- Cron任务:CronExpression,和quartz类似(但是不是使用quartz实现的)譬如 0 0/1 * ?
- Repeat任务:譬如每隔5分钟执行一次,重复50次就停止。
架构设计上,LTS框架中包含以下五种类型的节点:
JobClient:主要负责提交任务, 并接收任务执行反馈结果。JobTracker:负责任务调度,接收并分配任务。TaskTracker:负责执行任务,执行完反馈给JobTracker。LTS-Monitor:主要负责收集各个节点的监控信息,包括任务监控信息,节点JVM监控信息LTS-Admin:管理后台)主要负责节点管理,任务队列管理,监控管理等。
LTS的这五种节点都是无状态的,都可以部署多个,动态扩容,来实现负载均衡,实现更大的负载量, 并且框架采用FailStore策略使LTS具有很好的容错能力。
三、牛客网社区论坛项目
1. Redis(点赞、关注、存储验证码、存储登录凭证、缓存用户信息)
- 点赞使用
set类型存储,key为点赞对象(人、帖子、评论),set中保存点赞人的id;isMember()查看该用户是否点过赞
我收到的赞使用string类型存储,key为用户,并用increment(key),decrement(key)实现
like:entity:entityType:entityId -> set(userId)
like:user:userId -> int
- 点赞:首先查看set中是否有该用户id,如果有则为取消点赞-->移除并
decrement(key),如果没有则为点赞-->添加并increment(key)
- 关注使用
zSet类型存储,key为被关注者,set保存关注者以及关注时间为score
followee:userId:entityType -> zset(entityId,now)
follower:entityType:entityId -> zset(userId,now)
- 关注:关注者添加被关注者id,同时被关注者添加关注者id
- 取关:关注者移除被关注者id,同时被关注者移除关注者id
- 关注列表:
reverseRange由大到小返回,还可以分页 - 粉丝列表:同上
- 使用Redis存储验证码
- 验证码需要频繁的访问与刷新,对性能要求较高
- 验证码不需要永久保存,通常在很短的时间后就会失效
- 分布式部署时,存在Session共享问题
Cookie里存放一个验证码的key:"kaptchaOwner",Redis将Kaptcha生成的text作为value保存起来。
- 使用Redis存储登录凭证
- 处理每次请求时,都要查询用户的登录凭证,访问的频率非常高
生成登录凭证后,Redis会将该登录凭证随机生成的UUID作为key,loginTicket对象作为value保存起来;Cookie将该key:"ticket"存起来。
登录拦截器会从Cookie中拿到该key,然后从Redis中拿到检查该凭证是否有效
- 使用Redis缓存用户信息
- 处理每次请求时,都要根据凭证查询用户信息,访问的频率非常高
优先从缓存中取值,取不到时初始化缓存数据,数据变更时清除缓存数据