我应该将内存映射文件用于我的简单流程吗?

时间:2013-09-08 13:55:02

标签: java tcp io nio memory-mapped-files

我有兴趣实施以下简单流程:
客户端向服务器进程发送服务器存储的简单消息。由于消息没有任何层次结构IMO,最好的方法是将其保存在文件而不是rdb中 但是我想弄清楚如何优化它,因为我认为它有两种选择:

  1. 服务器向客户端发送200 OK,然后存储消息 客户没有注意到任何延迟
  2. 服务器保存邮件,然后发送200OK,然后发送 客户端注意到文件I / O的开销。
  3. 我更喜欢(1)的性能但这可能导致客户认为实际上从未保存过的msg(对于各种错误情况)一切正常。 所以我在想是否可以使用nio和内存映射文件 但我想知道这是使用mem映射文件的一个很好的候选人吗?使用内存映射文件可以保证例如如果进程崩溃,msg会被保存吗? 在我看来,流程将创建/打开和关闭许多文件,所以这是内存映射文件的一个很好的候选者吗?

1 个答案:

答案 0 :(得分:2)

  

服务器保存邮件,然后发送200OK,但客户端会注意到文件I / O的开销。

我建议你测试一下。我怀疑一个人会注意到一个10毫秒的延迟,我希望你对于小信息你应该比这更好。

  

所以我在想是否可以使用nio和内存映射文件。

我使用内存映射,因为它可以将每次写入的开销减少多达5微秒。这对你很重要吗?如果没有,我会坚持使用最简单的方法。

  

使用内存映射文件可以保证例如如果进程崩溃,msg会被保存吗?

只要操作系统没有崩溃,是的。

  

在我看来,流程将是创建/打开和关闭许多文件,所以这是内存映射文件的一个很好的候选者吗?

打开和关闭文件可能比写入数据快得多。 (按一个数量级)我建议将这些操作保持在最低限度。

您可能会发现我的这个图书馆很有趣。 https://github.com/peter-lawrey/Java-Chronicle它允许您按照单位数微秒的顺序保存消息,对于小型二进制消息,可以使用亚微秒级。