记一次关于如何做好系统的操作日志记录解决方案的探索

2023-05-16

操作记录的3种实现方式

  • 零、导语
  • 一、简单粗暴式操作记录
  • 二、面向切面编程AOP
  • 三、消息中间件MQ
  • 四、篇后语

零、导语

操作记录对于一个系统来说重要性不言而喻,轻则供系统用户简单查看历史操作信息,重则能用来排查系统故障原因。而如何实现操作记录呢?这个问题一经抛出,我脑海中能浮现出来的内容有三点:直接植入操作记录逻辑、面向切面编程、消息中间件。这也是我想谈的操作记录“三步走”的问题。

一、简单粗暴式操作记录

直接植入操作记录逻辑,这是我想谈的操作记录“一步走”。例如在营销门户的用户登录、用户登出、新增用户等这些模块方法中直接植入操作记录逻辑,由植入的操作记录逻辑进行写表入库来完成当前操作的记录数据持久化。下面以用户登录场景为例,流程请见图1.1。

图1.1 用户登录同步写入操作记录流程图

这种记录操作信息的方式是很“直白”的,起码在以前我很“推崇”这种实现方式,因为这很容易想得到,易于按着正常的思维逻辑来逐步进行编码实现。当然,这种处理方式在今天看来简直不可思议,因为有点“蠢”。“蠢”在哪里?用比较关键字眼来描述就是:强耦合、低复用率等,业务逻辑与操作记录逻辑之间的强耦合、操作记录逻辑代码的低复用率,将操作记录代码逻辑融入到具体业务逻辑中,这样一来,操作记录稍有改动,牵一发而动全身,所有的业务逻辑代码都要改动,如果工程模块数量很大,这个改造会浪费很多原本不必要的工作量。

这个问题能解决吗?能。既然强耦合、低复用率,那我怎么样来调整业务与非业务之间的处理逻辑呢?怎样来解决这个在喉之鲠呢?随着营销门户的项目规模逐渐庞大,这一需求越发明晰与强烈,面向切面编程这一重要思想,开始发挥了作用。

二、面向切面编程AOP

上面已经提到,我们的关注点落在了业务逻辑与非业务逻辑之间如何平衡、如何调整的问题上,那么,面向切面编程思想就是为此而来,操作记录的实现方式就有了"二步走"。Spring AOP通过面向切面技术将与业务无关却被业务模块所共用的逻辑代码封装起来,以提高代码的复用率,降低模块之间的耦合度。Spring AOP将应用分为核心关注点与横切关注点两部分,业务处理逻辑为核心关注点,被业务逻辑所依赖的公共部分为横切关注点。横切关注点的特点是其行为经常发生在核心关注点的多处,而多处操作基本类似。
这里还以上面提到的用户登录、用户登出、新增用户场景为例,对于这三个场景我都需要持久化操作记录,并且操作记录的代码逻辑是基本一致的,所以这里我们就可以把操作记录这块处理逻辑给抽象成切面给摘出来,如图2.1所示。此外,面向切面思想在具体模块中的体现,请见图2.2。

图2.1 用户登录、登出与新增用户场景及切面抽象关系图
图2.1 用户登录、登出与新增用户场景及切面抽象关系图

图2.2 用户登录通过切面写入操作记录流程图
图2.2 用户登录通过切面写入操作记录流程图

利用面向切面编程思想实现操作记录,既解决了业务逻辑与非业务逻辑之间强耦合,又提高了操作记录模块的代码复用率,倘若某天随着需求的变化,对操作记录的记录字段等提出了新的要求,那我们只需要关注并调整操作记录这个模块的代码即可,而不需要对其他业务逻辑代码进行调整,既能解决突出问题,又能提高效率。

不得不说,面向切面编程这种思想用到操作记录的实现上,堪称是特定场景采用特定解决办法的典范,通过操作记录切面,统一处理各个涉及操作记录的业务模块,优点十分明显。仔细想来,还有没有能够优化的地方呢?还是有的。

我们看到,通过面向切面编程这种方式,通过操作记录切面统一处理操作记录,并在切面逻辑中实现写表入库的操作,这样就实现了业务逻辑与非业务逻辑的解耦,可以将核心业务逻辑摆在更加突出而重要的位置。细细想来,这样不就够了吗?不已经实现我们的目的了吗?事实上,操作记录与业务逻辑处理相比,业务逻辑处理自然是要求实时响应的,越快越好,但是对于操作记录的写表入库则一般没这么高的要求,换句话说,只要我的业务服务能够实时响应,我并不是特别关心操作记录写表入库的时效,甚至在我业务处理完毕后一段时间再写入操作记录也没问题。这就引出了新的可以改进的地方,那就是按照我们设想,业务逻辑处理优先,相关的操作记录写表入库慢慢来。换个说法就是我们希望业务逻辑执行后,异步处理操作记录的写表入库。这就是接下来要谈的"三步走"。

三、消息中间件MQ

"三步走"阶段主要想谈的是异步操作记录写表入库的问题,为啥提到异步操作记录会写到消息中间件呢?事实上,消息中间件在实现异步操作记录写表入库方便,堪称一大利器。大致的逻辑是这样的, 捡重点说就是用户登录成功后,会通过操作记录的切面,统一整合本次需要写表入库的操作数据,整合后并不直接完成写表入库这一动作,而是将整合后的操作记录数据直接发送给MQ,然后操作记录切面就完成了自身的任务。接下来,就有监听程序消费MQ中的操作记录的数据,有监听程序来实际完成操作记录写表入库这一动作。这样一来,我们就完成了重复呢的解耦,做到了"职能界限"分明。业务逻辑专注于自身业务处理、操作记录切面专注于整合待写表入库的记录数据并发给MQ、监听程序则专注于通过消费MQ中的操作记录数据并完成操作记录的写表入库动作。流程如图所示。

图3.1 用户登录MQ异步写入操作记录流程图
图3.1 用户登录MQ异步写入操作记录流程图

四、篇后语

基于面向切面编程与消息中间件,实现操作记录参数的统一处理与操作记录的异步写表入库,这既能将业务核心逻辑给突显出来,又能满足高并发的需要,在很大程度上能够提高业务系统的性能。

本文阐述的操作记录实现方式的演变过程可以说是系统建设过程的一个缩影,“一步走”阶段我们解决从无到有的问题,“二步走”阶段我们解决从有到好的问题,“三步走”阶段我们解决从好到优的问题。无论是业务的探索、技术的适配,还是到系统的建设,每个环节都能寻得到“三步走”的影子,但是仅有“三步走”往往不够,我们还要持续探索。

随着时间的推移,可能出现的业务发展新模式、技术热点甚至创新点,都会在无形中敦促我们持续探索,持续适配,持续优化,为此,我们不能满足于现阶段的“三步走”,而要一直走。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

记一次关于如何做好系统的操作日志记录解决方案的探索 的相关文章

  • skip-GANomaly复现总结

    文章目录 skip GANomaly复现总结附MvTec数据集介绍实验结果总结谈谈我对于skip GANomaly的看法最后的感想 代码 skip GANomaly复现总结 附MvTec数据集 链接 xff1a https pan baid
  • YOLOv3 从入门到部署:(五)YOLOv3模型的部署(基于C++ opencv)

    文章目录 YOLOv3 从入门到部署 xff1a xff08 五 xff09 YOLOv3模型的部署 xff08 基于C 43 43 opencv xff09 目录关于opencv的DNN介绍代码讲解效果展示 YOLOv3 从入门到部署 x
  • 基于YOLO-fastest-xl的OCR

    文章目录 基于YOLO fastest xl的OCR项目介绍对于yolo fastest xl的结构的更改运行方法效果总结 基于YOLO fastest xl的OCR github链接https github com qqsuhao yol
  • Pytorch多GPU训练时使用hook提取模型中间层输出时与模型输入张量不在同一个GPU上的解决办法

    Pytorch多GPU训练时使用hook提取模型中间层输出时与模型输入张量不在同一个GPU上的解决办法 通常对于单卡训练的模型 xff0c 使用hook可以较为方便地提取出模型中间层输出 例如我们想要获取自定义模型DBL中的conv2d的输
  • 发布自己的Python包

    文章目录 发布自己的Python包第一步 xff1a 注册Pypi账号第二步 xff1a 准备本地文件第三部 xff1a 构建包并上传 发布自己的Python包 参考https packaging python org en latest
  • Python音频信号处理库函数librosa介绍

    文章目录 Python音频信号处理库函数librosa介绍 部分内容将陆续添加 介绍安装综述 xff08 库函数结构 xff09 Core IO and DSP xff08 核心输入输出功能和数字信号处理 xff09 Audio proce
  • python库函数之scipy.signal——滤波器设计

    文章目录 python库函数之scipy signal butter 函数参数设计模拟滤波器设计数字滤波器 2021 06 03 有位博主评论了这篇博客 xff08 评论已被删除 xff09 xff0c 特此说明 python库函数之sci
  • 使用python绘制短时傅里叶变换(STFT)频谱图(时频像)

    文章目录 使用python绘制短时傅里叶变换 xff08 STFT xff09 频谱图 xff08 时频像 xff09 使用python绘制短时傅里叶变换 xff08 STFT xff09 频谱图 xff08 时频像 xff09 使用sci
  • python csv文件数据写入和读取(适用于超大数据量)

    文章目录 python csv文件数据写入和读取 xff08 适用于超大数据量 xff09 python csv文件数据写入和读取 xff08 适用于超大数据量 xff09 一般情况下由于我们使用的数据量比较小 xff0c 因此可以将数据一
  • CentOS 开启端口方法

    查看已经开放的端口 xff1a firewall cmd list ports 查看防火墙状态 xff1a firewall cmd state 开启防火墙 xff1a systemctl start firewalld service 开
  • opencv3颜色识别(C++)

    文章目录 opencv3颜色识别 C 43 43 目标思路1 读取图像2 对比度调整 xff08 直方图均衡 xff09 3 RGB颜色分类4 形态学去噪声 代码结果参考 opencv3颜色识别 C 43 43 目标 给定一幅图像 xff0
  • 小区物业管理系统

    技术 xff1a 小区物业管理 ASP技术 B S 模式 SQL SERVER 2008 摘要 xff1a 随着市场经济的发展和人们生活水平的提高 xff0c 住宅小区已经成为人们安家置业的首选 xff0c 小区业主不但对住宅的本身的美观
  • java判断字符串是否为空的方法总结

    以下是java 判断字符串是否为空的四种方法 方法一 最多人使用的一个方法 直观 方便 但效率很低 if s 61 61 null 34 34 equals s 方法二 比较字符串长度 效率高 是我知道的最好一个方法 if s 61 61
  • 用Python的networkx绘制精美网络图

    最近因为数学建模3天速成Python 然后做了一道网络的题 xff0c 要画网络图 在网上找了一些 xff0c 发现都是一些很基础的丑陋红点图 xff0c 并且关于网络的一些算法也没有讲 xff0c 于是自己进http networkx g
  • Tomcat虚拟路径设置

    前几天写了一个关于登录页面banner图的展示 需求 xff1a banner图的存放地址在项目包的外部 xff0c 不能占用项目资源 这种通过外部存储位置渲染图片的实现方式有两种 xff0c 1 xff1a 目录映射 xff08 虚拟路径
  • Jenkins自动部署,mvn不同的环境打包配置

    今天看了个问题 xff0c 就是在Jenkins里如何根据不同的环境发布代码 我本地的代码环境有 xff0c 开发环境 测试环境 预发布环境和线上环境 基于项目的风险控制 xff0c 安全控制 xff0c 我只有开发环境和测试环境的权限 x
  • IOException while sending message; nested exception is:java.io.FileNotFoundException

    异步发送邮件出现的异常情况 1 问题描述 近期做了一个发送邮件的功能 xff0c 因为在处理发送邮件联系人上出现过失效的邮箱地址 xff0c 为了快速定位到问题 现将批量发送的方式改为单独发送 Failed messages javax m
  • 自定义分页

    给大家介绍一个简单分页的方法 xff08 有兴趣的可以自己试一下 xff09 1 实体 package com hffss entity ext import lombok Builder import lombok Data import
  • SpringBoot请求体中的流只能读取一次的问题HttpServletRequest的流只能读取一次的原因

    问题场景 xff1a 在项目开发过程中需要记录用户的操作行为 xff0c 即用户请求的url和相关url中带有的请求体参数 xff0c 在springboot中只能在拦截器中读取了一次 xff0c 在controller获取不到参数 经过代

随机推荐