Not*_*fer 5

你不应该重写日记.只需将操作附加到它,以便您可以重新创建它们,然后控制所需的严格级别.

逻辑应该只是:

  1. 收到消息

  2. 把它写到期刊上

  3. 可选择立即在日志上执行fsync - 具体取决于您的一致性要求.

  4. 然后选择发送"收到的确认" - 取决于您的需求.

  5. 处理消息.

  6. 可选地将另一个"已处理"记录写入具有记录ID的文件.你并不总是需要那个但是你不重写旧记录.或者,您可以使用已处理的"最高交易ID"编写单独的文件,这样您就可以自动知道在发生故障时可以再次开始处理的位置.这将减少期刊的大小.

  7. 发送"已处理的确认"或"处理失败" - 再次取决于您的需求.

数据库通常允许您控制fsync行为 - 每次写入时,每隔N秒,当操作系统决定时 - 这是速度与耐久性的问题.

关于这个主题的一个很好的阅读可能是关于redis持久性的这篇文章:http: //oldblog.antirez.com/post/redis-persistence-demystified.html

至于它的Go方面 - 有一些写入文件的选项,从低级文件处理程序到缓冲式写入程序.当然,文件处理程序可以让您最大程度地控制幕后发生的事情.我不确定Go中普通文件编写器幕后有多少缓存,如果你打算使用它,我建议你阅读代码.