Actor模式实现高并发的异步文件日志系统(Actor Log)

原文转自:http://www.tanjp.com (即时修正和更新)

 

文件日志异步读写

我们都知道普通的读写文件打开文件都是同步的,比如C的fopen, fclose, fread等。并且磁盘的访问速度远远的低于内存,所以操作系统要阻塞等待磁盘设备准备好才进行读写。如果采用同步,那么上次业务逻辑将会阻塞挂起,等待磁盘把数据准备好,再通知操作系统上报到应用层。高性能的服务器,提高并发,读写文件都会采用异步的模式。

C或C++提高文件读写的接口(FILE, fopen, fclose, fwrite),都是非线程安全的。而我们之前已经知道一个Actor内的行为能确保不可能被多个线程执行,也就是说把日志文件的写入,封装在一个Actor里面(无需使用锁),并且通过调度机制就能实现高并发的文件日志异步写入。文件日志系统,主要用于记录各种日志信息到磁盘文件,所以只需要写入操作。

 

Actor模式实现高并发的异步文件日志系统

利用Actor的特性,同一个Actor里面的行为,不需要加锁,也就是说Actor可以很方便地封装同步操作。

1、实现一个同步的文件日志写入类型 SyncFileLog。

2、用Actor包装SyncFileLog,得到类型ActorFileLog。

3、实现ActorLog类型,该类型包含了单独的调度器(Scheduler)和舞台(Stage),和管理所有ActorFileLog。

4、ActorLog类型接收信件,创建N个FileLogActor对象,每个FileLogActor对象负责一个单独的文件句柄写入。

这样就实现了基于Actor模式高并发写入多个文件的日志系统。ActorLog对象的设计如下图:

 

首先,实现一个同步的文件日志写入类型 SyncFileLog,也就是说,这些接口如果直接调用阻塞业务层逻辑。

有以下接口(实现细节有几百行,暂时不粘贴,之后再把源码上传):图文代码请参照以上笔记

 

class SyncFileLog
{
public:
    	// 配置文件日志
    	// @ps_dir, 所在目录。
    	// @ps_name, 文件名称,不包括路径和后缀。
    	// @ps_suffix, 后缀名。
    	// @pn_divide_size, 划分文件的大小。
    	// @pb_create_dir_everyday, 是否每天划分目录。
	// @return 配置成功返回true,否则返回false。
	bool config(const std::string & ps_dir, const std::string & ps_name,
		const std::string & ps_suffix, uint32 pn_divide_size, bool pb_create_dir_everyday = false);
	// @ps_data, 待写入的字符串日志数据。
	// @return 写入成功返回true, 否则返回false。
	bool write(const std::string & ps_data);
	// 关闭文件。
	void close();	
};

然后,用Actor包装同步的文件日志写入类型Syn

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值