当前位置: 首页 > news >正文

业务日志设计

        当一个项目足够大的时候,我们需要将统计系统完全独立出去,那么就无法避免数据采集的问题,我们可以在业务触发处增加log日志来记录当前变化的原始数据,提供统计系统进行采集

        设计一个统计系统的日志记录机制时,主要需要考虑日志的结构、数据存储方案、查询效率和系统扩展能力。

一、日志设计

1.日志结构
  • 时间戳 : 记录事件发生的时间。
  • 业务系统标识: 标识记录来源于哪个业务系统。
  • 事件类型: 描述业务中发生的具体事件(例如:创建、更新、删除)。
  • 用户标识: 记录哪个用户触发了事件(如果适用)。
  • 事件详情: 事件的具体内容,可以是 JSON 格式,包含更多关键信息(如影响的数据、变更的值等)。
  • 状态: 事件的状态,如成功、失败等。
2.日志存储形式
  • 批量写入:
    • 为了提高性能,可以使用批量写入的方式,将多个日志记录合并后一起写入数据库。
  • 异步处理:
    • 主业务流程中的日志记录操作可以异步进行(例如,通过消息队列),避免对主流程的性能影响。

二、数据库选择

1.NoSql数据库
  • MongoDB:
    • 特别适合存储 JSON 格式的日志记录,灵活的文档模型能很好地应对结构变化。
    • 自带水平扩展能力,适合大规模日志数据存储。
    • 虽然 MongoDB 不支持传统的 SQL JOIN,但可以通过手动查询、$lookup 聚合管道等方式实现关联查询(引用)。
  • Elasticsearch:
    • 适合进行复杂的查询和分析,良好的全文搜索功能。
    • 实时数据分析能力强,能快速从海量日志中检索信息。
    • 适合用于构建实时的监控和统计系统。
​​​2.系型数据库
  • PostgreSQL:
    • 功能强大的关系数据库,支持 JSON 数据类型,可以存储灵活的日志记录。
    • 适合需要复杂查询和强一致性的场景。
  • MySQL:
    • 传统的关系型数据库,支持高并发读写。
    • 可以通过使用合适的分区策略来处理大规模日志。
3.数据库对比
  • MongoDB vs MySQL:
    • 如果应用需要处理非结构化数据、灵活的数据模型和高并发的写入,MongoDB 是更好的选择。MySQL 的结构化数据模型在特定情况下可能会造成性能瓶颈。
  • PostgreSQL vs MySQL:
    • PostgreSQL 通常在处理复杂查询、支持高级功能(例如窗口函数、CTE、JSONB 等)方面超越 MySQL。如果需要复杂的数据分析,大型项目通常倾向于使用 PostgreSQL
  • MongoDB vs Elasticsearch:
    • 如果你的应用程序需要存储、更新和处理柔性数据结构,并且需要一些基本的查询能力,MongoDB 可能更合适。
    • 如果你的需求主要集中在快速搜索、分析和实时数据处理,Elasticsearch 可能是更合适的选择。

三、据采集与分析

  • 数据采集:
    • 使用ETL(提取、转换、加载)工具或自定义脚本,定期将日志数据从数据库或消息队列中提取到统计系统中。
  • 统计分析:
    • 使用数据分析工具(如 Apache Spark、Presto 等)进行批量数据处理和分析。
    • 对于实时统计需求,可以直接从日志数据库(如 Elasticsearch)进行查询和分析

四、性能和扩展

  • 设计日志收集系统时,请考虑日志的写入性能和查询性能。
  • 随着数据量的增加,监控性能,并基于需求进行扩展(如读写分离、增加节点、分区等)。

五、ETL工具推荐

1.Apache Nifi
  • 特点: 一个易于使用、强大的数据处理和分发工具,支持实时数据流处理。
  • 优点: 可视化的数据流设计界面,支持多种数据源和目标,能够处理数据流的路由、转换和操作。
  • 官网: Apache NiFi
  • 与 PHP 的结合: 可通过 REST API 与 PHP 集成。您可以使用 PHP 发出 API 请求来管理数据流、启动流程等操作。
  • 推荐方式: 创建一个 PHP 应用,使用 cURL 或其他 HTTP 客户端库与 Nifi 的 REST API 进行交互。
2.Apache Airflow
  • 特点: 一个调度工作流的工具,可以编排 ETL 任务。
  • 优点: 高度灵活,可扩展的工作流管理,支持定时和依赖性任务管理。
  • 官网: Apache Airflow
  • 与 PHP 的结合: 可以通过 Airflow 的 REST API 来调度任务,您可以使用 PHP 发送 API 请求来管理 DAG(有向无环图)和任务执行。
  • 推荐方式: 使用 PHP 创建自动化脚本来调用 Airflow API,推进 ETL 流程
3.Singer
  • 特点: 采用“音乐”协议的开源工具,专注于数据提取和加载。
  • 优点: 易于扩展和构建,提供许多预构建的连接器,可以通过编写 TAP 和 TARGET 轻松集成。
  • 官网: Singer | Open Source ETL
  • 与 PHP 的结合: Singer 的 TAP 和 TARGET 可以用任何编程语言实现,包括 PHP。您可以编写 Singer 的目标应用程序来提取数据并加载到目标位置。
  • 推荐方式: 使用 PHP 实现自己的 Singer TAP 或 TARGET。
4.阿里云 DataWorks
  • 中文支持: 阿里云的 DataWorks 是一个大数据开发和管理平台,整个界面和文档均为中文。
  • 特点: 提供丰富的数据集成、处理和分析功能,适合生产环境。
  • 与 PHP 集成: 阿里云的 DataWorks 可以通过 API 进行集成。您可以在 PHP 程序中使用阿里云的 API 调用数据工作流和任务。
  • 推荐方式: 使用 PHP 代码调用 DataWorks 的 REST API,以启动作业或管理工作流。
5.DataX (阿里巴巴开源)
  • 中文支持: DataX 是阿里巴巴开源的 ETL 工具,相关文档和社区交流多为中文。
  • 特点: 适合大规模数据的实时和离线同步,支持多种数据源和目标。
  • 与 PHP 集成: DataX 是一个命令行工具,因此可以通过 PHP 调用所在服务器中对应的执行命令。也可以在定期任务中结合 PHP 与 DataX 进行数据迁移。
  • 推荐方式: 创建 PHP 脚本,使用 exec() 或 shell_exec() 来运行 DataX 任务。

相关文章:

业务日志设计

当一个项目足够大的时候,我们需要将统计系统完全独立出去,那么就无法避免数据采集的问题,我们可以在业务触发处增加log日志来记录当前变化的原始数据,提供统计系统进行采集 设计一个统计系统的日志记录机制时,主要需要…...

对话|全年HUD前装将超330万台,疆程技术瞄准人机交互“第一屏”

2024年,在高阶智驾进入快速上车的同时,座舱人机交互也在迎来新的增长点。Chat GPT、AR-HUD、车载投影等新配置都在带来新增量机会。 高工智能汽车研究院监测数据显示,2024年1-10月,中国市场(不含进出口)乘用…...

【论文笔记】QLoRA: Efficient Finetuning of Quantized LLMs

🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 基本信息 标题: QLoRA: Efficient Finetun…...

计算机网络之---物理层的基本概念

物理层简介 物理层(Physical Layer) 是 OSI(开放系统互联)模型 中的第 1 层,它主要负责数据在物理媒介上的传输,确保原始比特(0 和 1)的传输不受干扰地从一个设备传送到另一个设备。…...

Burpsuite20241102macM1版安装

1、安装jdk11 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" brew update brew install openjdk11 echo export PATH"/opt/homebrew/opt/openjdk11/bin:$PATH" >> ~/.zshrc source ~/.zshrc j…...

缓存常见问题

缓存问题: 1. 缓存穿透:访问一个不存在的缓存 2. 缓存击穿:大批用户访问热点数据的时候,热点数据缓存失效,大量访问数据库 3. 缓存雪崩:大批量缓存全部失效 Redis和Memcached区别: 1. Redi…...

C++ 入门第25天:线程池(Thread Pool)基础

往期回顾: C 学习第22天:智能指针与异常处理-CSDN博客 C 入门第23天:Lambda 表达式与标准库算法入门-CSDN博客 C 入门第24天:C11 多线程基础-CSDN博客 C 入门第25天:线程池(Thread Pool)基础 前…...

微信小程序中的 storage(本地存储)和内存是两个完全不同的存储区域

这是一个非常关键且容易混淆的概念 既然 this.globalData.appId appId 是将 appId 存储在内存中,为什么微信小程序中的 wx.getStorage 和 wx.setStorage(本地存储)中没有 appId,并且您提出了一个非常重要的疑问:stor…...

WLAN基本原理与配置

一、WLAN概述 二、WLAN的基本概念 AC与Fit AP的组网架构: 1.二层组网 AC和Fit AP在一个广播域中 2.三层组网 AC和Fit AP需要跨三层通信 CAPWAP(无线接入点控制和配置协议): 该协议定义了如何对AP进行管理、业务配置&#…...

KaliLinux 2022.1安装和相关配置

一、安装系统和设置中文 (一)下载安装KaliLInux2022.1 以直接下载虚拟机映像文件为例,下载地址:https://www.kali.org/get-kali/#kali-virtual-machines,下载完成后直接解压,再用VMware打开后开机&#x…...

HarmonyOS开发:ArkTS初识

ArkTS基本语法 ArkTS语言简介 ArkTS是鸿蒙生态的应用开发语言。基本语法风格与TypeScript(简称TS)相似,在TS的生态基础上进一步扩展,继承了TS的所有特性,是TS的超集。 基本语法概述 扩展能力 基础语法&#xff1a…...

Unity的四种数据持久化方式

目录 什么是数据持久化 数据持久化之PlayerPrefs 概述 API及用法 电脑中存放的位置 优缺点 主要用处 封装PlayerPrefs 数据持久化之XML XML是什么 读取XML信息 C#读取XML的方法有几种 读取xml文件信息 读取元素和属性信息 总结 写入XML信息 选择存储目录 存储…...

机器学习笔记 - 单幅图像深度估计的最新技术

1、深度估计简述 单眼深度估计是一项计算机视觉任务,AI 模型从单个图像中预测场景的深度信息。模型估计场景中对象从一个照相机视点的距离。单目深度估计已广泛用于自动驾驶、机器人等领域。深度估计被认为是最困难的计算机视觉任务之一,因为它要求模型理解对象及其深度信息之…...

Postman接口测试02|接口用例设计

目录 六、接口用例设计 1、接口测试的测试点(测试维度) 1️⃣功能测试 2️⃣性能测试 3️⃣安全测试 2、设计方法与思路 3、单接口测试用例 4、业务场景测试用例 1️⃣分析测试点 2️⃣添加员工 3️⃣查询员工、修改员工 4️⃣删除员工、查询…...

C#语言的学习路线

C#语言的学习路线 C#(读作“C Sharp”)是一种由微软开发的现代编程语言,具有强大的功能和灵活性,广泛应用于桌面应用程序、Web开发、游戏开发以及企业级应用等多个领域。无论你是编程新手还是有一定基础的开发者,掌握…...

双目的一些文章学习

文章1 PSMNet https://arxiv.org/pdf/1803.08669PSMNet文章博客PSMNet文章中牵涉到的一些知识,空洞卷积,SPPNet网络,计算视差时用soft argmin代替argmin文章中引入了空洞卷积和SPPNet网络来融合多尺度的信息,又引入3D卷积来增加模…...

开源模型应用落地-qwen2-7b-instruct-LoRA微调合并-ms-swift-单机单卡-V100(十三)

一、前言 本篇文章将使用ms-swift去合并微调后的模型权重,通过阅读本文,您将能够更好地掌握这些关键技术,理解其中的关键技术要点,并应用于自己的项目中。 二、术语介绍 2.1. LoRA微调 LoRA (Low-Rank Adaptation) 用于微调大型语言模型 (LLM)。 是一种有效的自适应策略,…...

【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】

目录😋 任务描述 相关知识 一、类的声明和使用 1. 类的声明基础 2. 类的访问控制 3. 类的使用 二、类的声明和对象的声明 1. 类声明中的函数定义 2. 对象声明的多种方式 三、构造函数和析构函数的执行过程 1. 构造函数 2. 析构函数 实验步骤 测试说明…...

性能测试05|JMeter:分布式、报告、并发数计算、性能监控

目录 一、JMeter分布式 1、应用场景 2、原理 3、分布式相关注意事项 4、分布式配置与运行 二、JMeter报告 1、聚合报告 2、HTML报告 三、并发用户数(线程数)计算 四、JMeter下载第三方插件 五、性能监控 1、Concurrency Thread Group 线程组…...

关于Java面试题大全网站无法访问的解决方案

如果Java面试题大全网站无法访问,你仍然可以通过以下渠道获取高质量的Java面试题资源: 1. 国内网站 牛客网: 网址:https://www.nowcoder.com/特点:提供大量Java面试题和在线编程练习,适合刷题和模拟面试。推…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...