业务日志设计

        当一个项目足够大的时候,我们需要将统计系统完全独立出去,那么就无法避免数据采集的问题,我们可以在业务触发处增加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 任务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/950153.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

“AI 视频图像识别系统,开启智能新视界

咱老百姓现在的生活啊,那是越来越离不开高科技了,就说这 AI 视频图像识别系统,听起来挺高大上,实际上已经悄无声息地融入到咱们日常的方方面面,给咱带来了超多便利。 先讲讲安防领域吧,这可是 AI 图像识别的…

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…

NVIDIA在CES 2025上的三大亮点:AI芯片、机器人与自动驾驶、全新游戏显卡

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

PDFMathTranslate: Star13.8k,一款基于AI的PDF文档全文双语翻译PDF文档全文双语翻译,保留格式神器,你应该需要它

嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法 PDFMathTranslate是一个开源项目,旨在为用户提供便捷的PDF科学论文翻译解决方案。它不仅能够翻译文本,还能保留公式、图表、目…

h264之多视点mvc编码及解码过程(JMVC平台举例)

h264标准参考平台JMVC是针对MVC标准的,JMVC支持多视点编码、合流、多视点解码操作。可以利用JMVC生成h264 mvc码流和解码。 JMVC的下载地址是:jvet / JMVC GitLabH.264/AVC multi-view coding (MVC) extension JMVC reference softwarehttps://vcgit.hh…

LabVIEW软件侵权分析与应对

问:如果涉及到LabVIEW软件的仿制或模仿,特别是在功能、界面等方面,如何判断是否构成侵权?该如何应对? 答:LabVIEW软件的侵权问题,尤其是在涉及到仿制或模仿其功能、界面、设计等方面&#xff0…

条款07:为多态基类声明virtual析构函数

1.工厂方法举例&#xff1a;多态基类析构函数不声明为virtual会发生什么 #include <iostream> using namespace std;class Base { public:~Base(){} };class Box :public Base { public:const static int s_i 0; };class Box1 :public Base { public:const static int …

【C++】字符数|组输入与处理全解析

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;1. 基础方法&#xff1a;scanf 和 cin 的使用1.1 使用 scanf 实现简单字符串输入示例代码行为分析示例输入与输出优缺点改进建议 1.2 使用 cin 实现字符串输入示例代码行为…

Python爬虫教程——7个爬虫小案例(附源码)_爬虫实例

本文介绍了7个Python爬虫小案例&#xff0c;包括爬取豆瓣电影Top250、猫眼电影Top100、全国高校名单、中国天气网、当当网图书、糗事百科段子和新浪微博信息&#xff0c;帮助读者理解并实践Python爬虫基础知识。 包含编程资料、学习路线图、源代码、软件安装包等&#xff01;【…

apex安装

安装过程复杂曲折&#xff0c;网上说的很多办法&#xff0c;貌似成功了&#xff0c;实际还是没起作用。 先说成功过程&#xff0c;执行下面命令&#xff0c;安装成功&#xff08;当然&#xff0c;前提是你要先配置好编译环境&#xff09;&#xff1a; &#xff08;我的环境&a…

谷粒商城-高级篇-Sentinel-分布式系统的流量防卫兵

1、基本概念 1.1、熔断降级限流 1、什么是熔断 A 服务调用 B 服务的某个功能&#xff0c;由于网络不稳定问题&#xff0c;或者 B 服务卡机&#xff0c;导致功能时间超长。如果这样子的次数太多。我们就可以直接将 B 断路了&#xff08; A 不再请求 B 接口&#xff09;&#…

Django的runserver

当年执行 python manage runserver命令时 1. 先执行 runserver 中的 handle方法 2. 执行 self.run()方法 3. 执行 self.inner_run() 3.1 inner_run 下 run方法的封装 3.1.1 接着看 handle 怎么来的 封装了一个方法 接着找返回函数 3.1.2在 basehttp 下 3.1.3 get_wsgi_appl…

MySQL 如何赶上 PostgreSQL 的势头?

原文地址 我与 MySQL 社区的前辈交谈时&#xff0c;经常遇到这个问题&#xff1a;「为什么 MySQL 这么棒&#xff0c;而且&#xff08;至少根据 DB-Engines 的计算&#xff09;仍然比 PostgreSQL 更流行&#xff1b;但它的地位在下降&#xff0c;PostgreSQL 却势不可挡地越来越…

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

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

c/c++ 里的进程间通信 , 管道 pipe 编程举例

&#xff08;1&#xff09;以下是一个网上的使用 pipe 编程的范例&#xff1a; #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/wait.h>int main() {int pipefd…

java项目之网上租贸系统源码(springboot+mysql+vue)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的网上租贸系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 基于Spring Boot的网上租贸…

数据库回滚:大祸临头时

原文地址 什么是数据库回滚&#xff1f; 数据库技术中&#xff0c;回滚是通过撤销对数据库所做的一项或多项更改&#xff0c;将数据库返回到先前状态的操作。它是维护数据完整性和从错误中恢复的重要机制。 什么时候需要数据库回滚&#xff1f; 数据库回滚在以下几个场景中很…

Next.js 实战 (七):浅谈 Layout 布局的嵌套设计模式

业务场景 在目前常见的中后台管理系统中&#xff0c;比较常见的是固定的布局方式包裹页面&#xff0c;但一些特殊页面&#xff0c;比如&#xff1a;登录页面、注册页面、忘记密码页面这些页面是不需要布局包裹的。 但在 Next.js AppRouter 中&#xff0c;必须包含一个根布局文…

【UE5 C++课程系列笔记】23——多线程基础——AsyncTask

目录 概念 函数说明 注意事项 &#xff08;1&#xff09;线程安全问题 &#xff08;2&#xff09;依赖特定线程执行的任务限制 &#xff08;3&#xff09;任务执行顺序和时间不确定性 使用示例 概念 AsyncTask 允许开发者将一个函数或者一段代码逻辑提交到特定的线程去执…

2025-01-04 Unity插件 YodaSheet1 —— 插件介绍

文章目录 1 介绍2 工作原理2.1 ScriptableObject -> YadeSheetData2.2 YadeDatabase 存储多个 YadeSheetData 3 用途4 缺点5 推荐 1 介绍 ​ Yade 提供类似于 Excel 或者 Google Sheets 的表格编辑器&#xff0c;可以轻松地在 Unity 编辑器中 编辑&#xff0c;搜索&#xf…