fwrite 是否锁定文件以同时读取

does fwrite lock the file for simultaneous reading

我想使用 data.table:: fwrite 以文本日志的形式快速存储和检索状态。这些是通过使用管道工 API 调用 R 端点的移动应用程序更新的。移动应用程序可能每秒触发许多 APIs,并且同一行有可能在 ~0.5 秒的间隔内被两个 APIs 修改。由于每次 API 调用延迟 1~2 秒,我正在避免数据库读写(R 的 fwrite 第一次可以在 0.5 秒内完成相同的工作,然后它完成 API 不到后续调用中为 20 毫秒)

我的问题是:

will fwrite/ fread combination work for higher traffic scenario or do I have to look for ways of locking the file to avoid a corruption? Are there any ways of locking a file for read or write?

will fwrite/ fread combination work for higher traffic scenario or do I have to look for ways of locking the file to avoid a corruption?

答案是"it depends."

如果您使用简单的托管模型托管应用程序,在该模型中所有流量都访问相同的单例 R 进程,那么即使在高流量情况下您也可能没问题。这里的警告是,如果您在 API 中进行任何类型的内部流程分叉(或者如果 data.table 这样做;我不确定,我从未使用过它)。

但是,如果您使用多个 R 进程托管应用程序并且在它们前面有一个负载平衡器,那么您将 运行 遇到多个进程试图写入同一个文件的麻烦.

扩展管道工的典型建议 API 是通过添加更多 R 进程来水平扩展。因此,我鼓励您尝试找到一种可以继续工作的设计 if/when 您最终确实需要多个 Plumber 进程 运行 并发。您可以考虑在远程数据库中进行集中处理,甚至可以使用 SQLite 在本地进行集中处理,只需确保将其配置为支持多个并发编写器(我不能 100% 确定 SQLite 是否支持此操作)。

我当然不会期望 1-2 秒的延迟会影响 DB。可能值得调查您的数据库 hardware/software 或检查网络中是否存在任何延迟。您还可以将 pool package 视为保持数据库连接打开并可用于 API 的一种方式。我猜这会大大减少您的数据库写入所需的时间。