scala - 写入同一文件的多个 Actor + 旋转

标签 scala thread-safety webserver

我用 Scala(基于 Actors)编写了一个非常简单的网络服务器。目的 以便从我们的前端服务器记录事件(例如,如果用户单击 按钮或加载页面)。该文件需要每 64-100mb 左右旋转一次,并且 它将被发送到 s3 以便稍后使用 Hadoop 进行分析。交通量将 大约 50-100 次调用/秒

我脑海中浮现的一些问题:

  1. 如何确保所有参与者都能以线程安全的方式写入一个文件?
  2. 在 X mb 量后旋转文件的最佳方法是什么。我应该这样做吗 在我的代码中或从文件系统中(如果我从文件系统中执行,我如何验证 该文件不在写入过程中或缓冲区已刷新)

最佳答案

一个简单的方法是让一个文件写入器 actor 序列化对磁盘的所有写入。然后,您可以拥有多个请求处理程序参与者,这些参与者在处理来自前端服务器的日志记录事件时为其提供更新。您将在请求处理中获得并发性,同时仍然序列化写入您的日志文件。拥有多个 actor 会打开并发写入的可能性,这最多会破坏您的日志文件。基本上,如果您希望某些东西在角色模型中是线程安全的,它应该在单个角色上执行。不幸的是,在写入磁盘时,您的任务本质上是串行的。您可以做一些更复杂的事情,比如在轮换时合并来自多个参与者的日志文件,但这似乎有点矫枉过正。除非您在一两秒内生成 64-100MB,否则如果执行 I/O 的额外线程给您带来任何好处,我会感到惊讶。

假设有一个写入 actor,计算自上次轮换以来写入的数量非常简单,而且我认为跟踪 actor 的内部状态与轮询文件系统不会有任何不同。

关于scala - 写入同一文件的多个 Actor + 旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5214983/

相关文章:

performance - Haskell 等函数式语言或 Scala 等混合语言中的函数开销

scala - 使用lift-json在scala中验证json

http - Web 服务器如何知道发布给它们的表单中使用的字符集?

javascript - 来自 node js 的 HTML 代码未被浏览器解释为这样

scala - 将未经身份验证的请求发送到不同的操作路由

scala - 在定义案例类的方法中找不到无形隐式 val LabelledGeneric

java - 它是一种线程安全机制吗?

spring - Spring bean如何处理并发

multithreading - windows phone 7中UI控件的线程亲和性

reactjs - 为 React、Angular 等使用 HTTP 服务器