0

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

  1. 服务器向客户端发送 200 OK然后存储消息,因此客户端不会注意到任何延迟
  2. 服务器保存消息,然后发送 200OK 但随后客户端注意到文件 I/O 的开销。

我更喜欢 (1) 的性能,但这可能会导致客户认为一切正常,而实际上从未保存过 msg(对于各种错误情况)。
所以我在想我是否可以使用 nio 和内存映射文件。
但我想知道这是使用 mem 映射文件的好选择吗?使用内存映射文件会保证例如如果进程崩溃,msg 会被保存吗?
在我看来,流程将创建/打开和关闭许多文件,所以这是内存映射文件的好选择吗?

4

1 回答 1

2

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

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

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

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

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

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

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

打开和关闭文件可能比写入数据更快更昂贵。(按数量级)我建议将此类操作保持在最低限度。

你可能会觉得我的这个图书馆很有趣。https://github.com/peter-lawrey/Java-Chronicle 它允许您以单位数微秒的顺序保存消息,对于文本,以亚微秒的顺序保存小二进制消息。

于 2013-09-08T14:14:30.463 回答