@nalan90
2018-09-27T11:43:01.000000Z
字数 1121
阅读 882
抓单推单系统技术点
工作
数据抓取
- DB/MQ配置
- 分表(以正则方式进行拆分): order_info_[0-127]
- DB数据的抓取
- 尽可能多的获取有效字段,方便后期的扩展
- 原始DB表名与本地ES表名的对应关系
- 对分表的数据进行合并(主键ID的设计)
- 增量数据偏移量的存储,锁的设计
- 补拉数据的设计
- MQ数据的抓取
- 多个进程消费同一个队列是否会获取相同的消息?
- 若多个进程会获取重复数据,有没有方法可以解决,还是只能使用单进程
- 抓取数据任务触发及存储
- DB
- crontab一分钟触发一次
- 获取DB的配置进行拆分,生成单表级别的队列任务
- 多进程(可调整进程个数)读取任务队列,去指定表抓取数据
- 读取偏量移之后的数据
- 判断当前是否有进程锁定该任务 (random + is_lock)
- 数据写入ES之后触发队列任务 (队列内容: index + type + id)
- 多进程读取队列,进行数据的清洗处理(字段映射),写入ES总表(order_info, order_goods)
- 数据写入ES总表成功之后,触发队列进行推送操作
- MQ
- 实时处理
- 读取数据写入ES之后触发队列任务 (队列内容: index + type + id)
- 多进程读取队列,进行数据的清洗处理(字段映射),写入ES总表(order_info, order_goods)
- 数据写入ES总表成功之后,触发队列进行推送操作
数据清洗
- 数据字段映射 (数据的清洗)
- 技术难点
- 描述: order_info表的数据抓取完成,order_goods表与之对应的数据未同步,在进行数据清洗匹配时,会出现指定的订单找不到对应的商品信息,无法进行数据的存储,如何处理?
- 解决方案: 使用Laravel任务延迟机制,重试三次,若还是失败写入失败队列,发送报警(待定)。
数据推送
- 后台配置的设计
- 本地ES数据与推送字段的映射,级联关系如何通过配置表示?
- 不同服务商(zaful、gearbest)与第三方联盟平台(LC、CJ)的关联关系,如何知道某一笔订单要推送到哪个平台?
- 补推机制,后台如何设计?
监控报警
- 系统监控
- Supervisor进程管理程序的监控
- ES是否可用
- MySQL是否可用
- MQ是否可用
- 业务监控
- 队列的长度是否超过指定阀值
- 站点可用性 (CURL请求判断HTTP Response Status)
- 业务错误级别发送报警
- 报警
- 建立钉钉群,添加自定义的机器人
- 所有报警信息直接上送钉钉机器人即可
日志
- 类型
- 文件
- 收集
- 使用Filebeat收集推送到Logstash, Logstash再推送到Elasticsearch (推送)
- 使用Logstash收集推送到Elasticsearch (不推荐, Logstash太重)