多个Actors写入同一个文件+旋转

Tob*_*ias 2 webserver scala thread-safety

我在Scala中编写了一个非常简单的Web服务器(基于Actors).这样做的目的是从我们的前端服务器记录事件(例如,如果用户单击按钮或页面加载).该文件需要每64-100mb左右旋转一次,然后发送到s3以便以后使用Hadoop进行分析.流量约为50-100个/ s

一些问题突然出现在我脑海中:

  1. 如何确保所有actor都能以线程安全的方式写入一个文件?
  2. 在X量为mb之后旋转文件的最佳方法是什么.我应该在我的代码中还是从文件系统中执行此操作(如果我从文件系统执行此操作,那么如何验证文件不在写入过程中或刷新缓冲区)

小智 7

一种简单的方法是使用单个文件编写器actor将所有写入序列化到磁盘.然后,您可以拥有多个请求处理程序actor,它们在从前端服务器处理日志记录事件时为其提供更新.您仍然可以在请求处理中获得并发,同时仍然将写入序列化到日志文件中.拥有多个actor会打开并发写入的可能性,这最多会损坏您的日志文件.基本上,如果你想在actor模型中使用某些东西是线程安全的,那么它应该在一个actor上执行.不幸的是,在写入磁盘时,您的任务本质上是串行的.你可以做一些更复杂的事情,比如在旋转时来自多个演员的合并日志文件,但这看起来有点过分.除非你在一两秒钟内产生64-100MB,否则如果执行I/O的额外线程给你带来任何东西,我会感到惊讶.

假设有一个写作演员,计算自上次旋转以来写入的数量是非常微不足道的,我不认为跟踪演员的内部状态与轮询文件系统会产生不同的影响.