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

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

相关文章

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一

golang 日志log与logrus示例详解

《golang日志log与logrus示例详解》log是Go语言标准库中一个简单的日志库,本文给大家介绍golang日志log与logrus示例详解,感兴趣的朋友一起看看吧... 目录一、Go 标准库 log 详解1. 功能特点2. 常用函数3. 示例代码4. 优势和局限二、第三方库 logrus 详解1.

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

SpringBoot项目使用MDC给日志增加唯一标识的实现步骤

《SpringBoot项目使用MDC给日志增加唯一标识的实现步骤》本文介绍了如何在SpringBoot项目中使用MDC(MappedDiagnosticContext)为日志增加唯一标识,以便于日... 目录【Java】SpringBoot项目使用MDC给日志增加唯一标识,方便日志追踪1.日志效果2.实现步

SQL Server清除日志文件ERRORLOG和删除tempdb.mdf

《SQLServer清除日志文件ERRORLOG和删除tempdb.mdf》数据库再使用一段时间后,日志文件会增大,特别是在磁盘容量不足的情况下,更是需要缩减,以下为缩减方法:如果可以停止SQLSe... 目录缩减 ERRORLOG 文件(停止服务后)停止 SQL Server 服务:找到错误日志文件:删除

Java使用多线程处理未知任务数的方案介绍

《Java使用多线程处理未知任务数的方案介绍》这篇文章主要为大家详细介绍了Java如何使用多线程实现处理未知任务数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 知道任务个数,你可以定义好线程数规则,生成线程数去跑代码说明:1.虚拟线程池:使用 Executors.newVir

JAVA封装多线程实现的方式及原理

《JAVA封装多线程实现的方式及原理》:本文主要介绍Java中封装多线程的原理和常见方式,通过封装可以简化多线程的使用,提高安全性,并增强代码的可维护性和可扩展性,需要的朋友可以参考下... 目录前言一、封装的目标二、常见的封装方式及原理总结前言在 Java 中,封装多线程的原理主要围绕着将多线程相关的操

如何用java对接微信小程序下单后的发货接口

《如何用java对接微信小程序下单后的发货接口》:本文主要介绍在微信小程序后台实现发货通知的步骤,包括获取Access_token、使用RestTemplate调用发货接口、处理AccessTok... 目录配置参数 调用代码获取Access_token调用发货的接口类注意点总结配置参数 首先需要获取Ac

基于Python开发PDF转Doc格式小程序

《基于Python开发PDF转Doc格式小程序》这篇文章主要为大家详细介绍了如何基于Python开发PDF转Doc格式小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用python实现PDF转Doc格式小程序以下是一个使用Python实现PDF转DOC格式的GUI程序,采用T

grom设置全局日志实现执行并打印sql语句

《grom设置全局日志实现执行并打印sql语句》本文主要介绍了grom设置全局日志实现执行并打印sql语句,包括设置日志级别、实现自定义Logger接口以及如何使用GORM的默认logger,通过这些... 目录gorm中的自定义日志gorm中日志的其他操作日志级别Debug自定义 Loggergorm中的