本文主要是介绍多线程读日志文件程序热备设计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
这个程序设计场景主要设计三个问题
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数据。
这篇关于多线程读日志文件程序热备设计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!