我用 Scala(基于 Actors)编写了一个非常简单的网络服务器。目的 以便从我们的前端服务器记录事件(例如,如果用户单击 按钮或加载页面)。该文件需要每 64-100mb 左右旋转一次,并且 它将被发送到 s3 以便稍后使用 Hadoop 进行分析。交通量将 大约 50-100 次调用/秒
我脑海中浮现的一些问题:
- 如何确保所有参与者都能以线程安全的方式写入一个文件?
- 在 X mb 量后旋转文件的最佳方法是什么。我应该这样做吗 在我的代码中或从文件系统中(如果我从文件系统中执行,我如何验证 该文件不在写入过程中或缓冲区已刷新)
最佳答案
一个简单的方法是让一个文件写入器 actor 序列化对磁盘的所有写入。然后,您可以拥有多个请求处理程序参与者,这些参与者在处理来自前端服务器的日志记录事件时为其提供更新。您将在请求处理中获得并发性,同时仍然序列化写入您的日志文件。拥有多个 actor 会打开并发写入的可能性,这最多会破坏您的日志文件。基本上,如果您希望某些东西在角色模型中是线程安全的,它应该在单个角色上执行。不幸的是,在写入磁盘时,您的任务本质上是串行的。您可以做一些更复杂的事情,比如在轮换时合并来自多个参与者的日志文件,但这似乎有点矫枉过正。除非您在一两秒内生成 64-100MB,否则如果执行 I/O 的额外线程给您带来任何好处,我会感到惊讶。
假设有一个写入 actor,计算自上次轮换以来写入的数量非常简单,而且我认为跟踪 actor 的内部状态与轮询文件系统不会有任何不同。
关于scala - 写入同一文件的多个 Actor + 旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5214983/