Not*_*fer 5
你不应该重写日记.只需将操作附加到它,以便您可以重新创建它们,然后控制所需的严格级别.
逻辑应该只是:
收到消息
把它写到期刊上
可选择立即在日志上执行fsync - 具体取决于您的一致性要求.
然后选择发送"收到的确认" - 取决于您的需求.
处理消息.
可选地将另一个"已处理"记录写入具有记录ID的文件.你并不总是需要那个但是你不重写旧记录.或者,您可以使用已处理的"最高交易ID"编写单独的文件,这样您就可以自动知道在发生故障时可以再次开始处理的位置.这将减少期刊的大小.
发送"已处理的确认"或"处理失败" - 再次取决于您的需求.
数据库通常允许您控制fsync行为 - 每次写入时,每隔N秒,当操作系统决定时 - 这是速度与耐久性的问题.
关于这个主题的一个很好的阅读可能是关于redis持久性的这篇文章:http: //oldblog.antirez.com/post/redis-persistence-demystified.html
至于它的Go方面 - 有一些写入文件的选项,从低级文件处理程序到缓冲式写入程序.当然,文件处理程序可以让您最大程度地控制幕后发生的事情.我不确定Go中普通文件编写器幕后有多少缓存,如果你打算使用它,我建议你阅读代码.