趣店线上监控报警系统设计与实现

2023-10-09 01:38

本文主要是介绍趣店线上监控报警系统设计与实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

           

理想很丰满,现实很骨感,线上业务系统,绝对不会万事如意,外在因素太多,总会出现这样那样的问题,所以,智能监控和报警,变得尤为重要;线上问题永远都是最重要的问题,必须尽早发现尽早解决。

           

一、背景

一张网络图,比较形象的描述线上业务系统的状况,虽然有点儿夸张,但这不假:

二、大纲

  • 业务监控系统架构分析

  • 监控模块的设计与优化

  • 监控智能化的一些尝试

三、业务监控系统架构

没有完美的架构,任何架构都是平衡妥协的结果

3.1 设计背景

  • 监控项不完善,需要快速完善监控项(痛点:快速实施)

  • 运营活动频繁,报警收到麻木(痛点:报警太多)

  • 上线调整时无实时直观的参考(痛点:不及时,不直观)

3.2 主流架构

3.2.1 案例

阿里:

蘑菇街:

3.2.2 特点
  • 架构的核心关键字是:海量、实时

  • 侧重于大数据的处理,报警分析偏弱,没有解决当时的痛点问题

  • 公司已有大数据部门在做类似的事情

  • 监控人手紧张且缺乏相关经验,存在一定风险

思考:大数据是否应该属于监控系统的一部分?

3.3 趣店当前监控架构

  • 基于现有业务监控开发,利用已有资源

  • 利用队列将系统拆分成不同模块,方便升级

  • 利用现有的优秀开源软件

四、监控模块设计与优化

各个模块可以随时被更优的方案替换

4.1 采样模块

  • 采集源:

    SQL、API、ElasticSea ch (实时日志收集)、其他更多

  • 运行方式:

    crontab定时运行,Laravel队列执行采集任务

4.1.1 问题
  • 某个采集变慢,导致整个采集不可用

  • 大数据表性能雪崩

  • 采集需要额外监控

4.2 存储计算模块

4.2.1 时序数据库

时序数据库(Time Series  Database,简称TSDB)是用于管理时间序列数据的专业化数据库。区别于传统的 关系型数据库,时序数据库针对时间序列数据的存储、查询和展现进行了专门的优化, 从而获得极高的数据 压缩能力、极优的查询性能,特别适用于物联网应用场景(物联网应用往往需要处理海量的时间序列数据)。

4.2.2 关键特性
  • 针对时间特别优化,以时间为维度的高效查询

  • 很方便的向下采样(downsampling)

  • 海量存储能力

  • 自动简单高效处理过期数据

4.2.3 TSDB排行榜

4.2.4 趣店的选择-InfluxDB

  • 无外部依赖

  • 快速使用

  • 优雅的RESTFUL API

  • 强大的类似SQL的查询语言

  • 水平扩展

  • 纯go编写

1)、InfluxQL具体表现:
# demo 1
SELECT <stuff> FROM <measurement_name> WHERE <some_conditions># demo 2
SELECT * FROM "foodships"# demo 3
SELECT * FROM "foodships" WHERE "planet"='Saturn'# demo 4
SELECT * FROM "foodships" WHERE "planet"='Saturn' AND time > '2015-04-16 12:00:01'# demo 5
SELECT * FROM "foodships" WHERE time > now() - 1h
2)、使用中遇到的问题:
  • 集群功能不再开源(社区已有项目在跟进,国内七牛公司有解决方案)

  • 单点问题(InfluxDB Relay)

  • influxDB为什么比Mysql高效?

3)、单点问题的解决方案:

通过写多份数据来保持高可用

4.3 展示模块

4.3.1 开源项目Grafana

  • 界面比较漂亮

  • 完整的API支持

  • 丰富的数据源支持

  • 报表功能很完善

4.3.2 基本概念
  • 数据源 (Grafana只是一个时序数据展现工具,它展现所需的时序数据有数据源提供)

  • 组织 (Grafana支持多组织,单个实例就可以服务多个相互之间不信任的组织)

  • 用户 (一个用户可以属于一个或者多个组织,且同一个用户在不同的组中可以分配不同级别的权限)

  • 行 (在仪表板中行是分割板,用于对面板进行分组)

  • 面板 (面板是最基本的显示单元,且每一个面板会提供一个查询编辑器)

  • 查询编辑器 (查询编辑器暴露了数据源的能力,并且不同的数据源有不同的查询编辑器)

  • 仪表板 (仪表板是将各种组件组合起来最终展现的地方)

4.3.3 丰富的数据源
  • Graphite

  • ElasticSearch

  • CloudWatch

  • InfluxDB

  • OpenTSDB

  • KairosDB

  • Prometheus

4.3.4 使用中遇到的问题
  • Grafana默认存储为sqlite,存在单点风险

  • 采集周期未满时显示问题

4.4 报警通知模块

4.4.1 设计特点
  • 多种通知方式(短信,邮件,电话)

  • 灵活的通知策略

  • 基于组的通知人管理

4.4.2 遇到的问题
  • 短信,邮件发送失败 (重要指标需要有多种通知方式)

  • 重复报警频率限制,减少骚扰

  • 人员入职离职修改麻烦 (基于组来管理)

4.5 异常决策模块

4.5.1 异常决策的难点在哪?
  • 系统监控和业务监控相比,业务监控的问题更难定义

  • 运营推广频繁加剧问题定义的难度

  • 互联网金融行业对监控的要求更高

4.5.2 异常决策策略
1)、基于样本数据的对比策略

  • 样本为近7天的值, 去除最高最低后的平均值

  • 数据量小时,样本随机性高, 容易误报    

     

    • 延长统计周期 (实物订单数)

    • 调整统计策略 (风控通过率)

    • 降低异常判定敏感度(变化幅度,持续时间)

  • 策略调整,运营活动频繁,样本经常不具有参考价值    

     

    • 定义不变量指标 (白条客单价)

    • 定义活动,告知决策模块指标的预期变化

2)、基于预测趋势的对比策略

  • 前提:

    正常曲线不会出现骤升或骤降

  • 使用:

    灰色预测模型

  • 特点:

    所需要的数据量比较少,预测比较准确,精度较高;

    如:

    新版Zabbix利用非线性回归预测磁盘空间占满的时间

  • 问题:

    • Q1:曲线存在固有的骤升骤降情况

    • A1:使用实际数据与样本数据的比值来作为预测序列

    • Q2:异常曲线缓慢变化

    • A2:尽量多维度监控

4.6 智能化监控的一些尝试

让指标之间建立起某种联系

  • 规则引擎

  • 神经网络

4.6.1 规则引擎
1)、作用
  • 规则外部化,即有利于规则知识的复用,也可避免改变规则时带来的代码变更问题

  • 由规则引擎使用某种算法进行推理过程,不需要编写复杂晦涩的逻辑判断代码

  • 开发人员的不需要过多关注逻辑判断,可以专注于逻辑处理

2)、举例
  • IF     

    • 登录数增加

    • 订单量增加

    • 新用户授信风控通过率下降

    • 新用户授信风控申请数增加

  • THEN     

    • 用户召回活动

4.6.2 神经网络

神经网络解决手写数字识别问题(MNIST问题)

  • 下载MNIST数据

  • 定义模型

  • 训练模型

  • 验证模型

在趣店监控系统中的实际应用和表现:

五、总结、经验、教训

  • 线上问题,永远都是最紧急最重要的问题

  • 异常判断问题本质上也是分类问题

  • 监控系统设计过程中,一定要预防决策方式的局限性    

     

    • 盲人摸象:

      局部&整体

    • 血压高与高血压的关系

  • 业务监控需要持续运营与优化,并且需要业务部门共同维护

  • 必须要具备完善的异常处理流程

目前趣店集团监控系统已经覆盖到所有产品线的注册、登录、下单、授信、风控、放款、还款等流程, 接下来会继续在全面、准确、及时各方面进行优化升级,为趣店集团线上业务的稳定性保驾护航, 更是为广大趣用户放心使用我们的产品,提供绝对可靠的保证!

这篇关于趣店线上监控报警系统设计与实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/169418

相关文章

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

MySQL双主搭建+keepalived高可用的实现

《MySQL双主搭建+keepalived高可用的实现》本文主要介绍了MySQL双主搭建+keepalived高可用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、测试环境准备二、主从搭建1.创建复制用户2.创建复制关系3.开启复制,确认复制是否成功4.同

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义