我有一个处理特定二进制协议的TCP服务器。一些请求包含大量要写入文件的数据。该服务器使用NIO框架(netty),并具有逻辑来处理已分解为多个帧的消息。保持文件句柄打开,或根据需要重新打开?
当个别帧进入时,如果该帧中的数据要写入文件,则打开该文件并写入数据。即使数据流还没有完成,我期望有另一个数据帧被附加到同一个文件,但我现在关闭文件,直到我接收到下一个帧,此时我重新打开它并追加附加数据。
我选择了这种方法,因为它似乎是最安全的方法来避免左右打开文件句柄,并且通过一些错误不关闭它们,但是,我担心这会对性能产生负面影响。是否更好(或在这种情况下是最佳实践)使文件句柄保持打开状态(以便保留对打开的FileOutputStream或Channel的引用)?打开文件句柄的数量是否存在资源限制问题?
你在考虑什么样的音量(同时打开的文件)?你多长时间收到这些帧 - 或多或少的流/实时?或者延误很长?游戏中的限制在这方面往往达到数百(或数千)。并且打开/关闭文件所需的时间与帧之间的延迟时间可能是一个考虑因素。 – BRFennPocock 2011-12-20 23:03:45
所有这些都是好点@BRPocock:对于这类问题中的大多数问题,需要考虑的是真实的工作量。 – 2011-12-20 23:15:03
@BRPocock的音量有希望增加,所以我只是试图找到最佳可扩展性的甜蜜点。帧是流/实时的(所讨论的帧只是单个TCP数据包)。我试图平衡我认为最安全和最具扩展性(关闭文件)的内容,以及可能表现最佳(保持打开状态)的内容。 – 2011-12-20 23:45:38