多线程读日志文件程序热备设计

2024-03-18 12:32

本文主要是介绍多线程读日志文件程序热备设计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这个程序设计场景主要设计三个问题

1多线程共享日志文件资源的设计实现

2为了调高安全性能,进行的热备实现

3读取日志的速度快于写入日志的速度,这样会导致读不到内容,需要对程序进行优化,考虑这种情况的发生。


1.有两种方式实现共享资源的访问synchronize和重入锁reentrantlock

Reentrantlock提供了更灵活的锁机制,有竞争锁等。但是很容易使用不当出问题,比如

try语句里lock,再finally里要解锁。

synchronize是jvm底层进行所的调度。

我是使用了reentrantlck进行资源的同步,一个线程在进行对文件的读取时,先把资源锁住,读取完一行在进行解锁。

这样就可以实现共享文件资源的同步问题。


2.热备的实现是使用一个单独的线程定时检测状态来实现的,具体就是

每一行的日志文件有一列是cdn号,它是上游程序在写日志的时候递增的,

读日志程序在每次读取完一条记录时候,往数据库更新一条记录。

热备的实现是在上述的基础上实现的,部署两套一样的程序,它们共享同一个数据库表记录

备份程序有一个单独的监控线程,定时的读取数据库的这个表记录看有没有更新,根据业务当发现10分钟没有更新时,

备份程序获得目标文件的读取位置,开始继续读取日志,把数据库表的对应字段变为备份程序表示,主程序sleep。

当主程序可以继续工作后,备份程序sleep。



3.读和写速度跟不上时候的设计

日志的结构大致是这样的


读取完日志,其中有文件号和key值,通过他们可以去磁盘上去读到这个数据的详细报文。

有可能会有读日志文件程序读到了key值,去磁盘上取数据的时候,磁盘还没有写完这条数据,

这种情况的解决是同过一个延迟队列处理的,读取磁盘的结果为空时,把日志的这条记录发送到一个消息中间件q中,

等过3s中再次从q中取出报文,从磁盘load数据。

这篇关于多线程读日志文件程序热备设计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

使用Python构建一个高效的日志处理系统

《使用Python构建一个高效的日志处理系统》这篇文章主要为大家详细讲解了如何使用Python开发一个专业的日志分析工具,能够自动化处理、分析和可视化各类日志文件,大幅提升运维效率,需要的可以了解下... 目录环境准备工具功能概述完整代码实现代码深度解析1. 类设计与初始化2. 日志解析核心逻辑3. 文件处

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

解读GC日志中的各项指标用法

《解读GC日志中的各项指标用法》:本文主要介绍GC日志中的各项指标用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、基础 GC 日志格式(以 G1 为例)1. Minor GC 日志2. Full GC 日志二、关键指标解析1. GC 类型与触发原因2. 堆

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

MySQL 打开binlog日志的方法及注意事项

《MySQL打开binlog日志的方法及注意事项》本文给大家介绍MySQL打开binlog日志的方法及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录一、默认状态二、如何检查 binlog 状态三、如何开启 binlog3.1 临时开启(重启后失效)

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关