我有一个基本上是序列号生成器的系统。
序列号生成器有两个主要的设计要求(在容错方面):
- 签发的所有序列号必须是唯一的(不得重复)
- 如果序列号生成器崩溃,它需要一种从中断处重新启动的方法(如果需要,可以在从崩溃中恢复时跳过几个序列号,以确保满足要求 #1)
可以假设序列号是按顺序发出的(1、2、3、4等)
我第一次尝试解决这个问题是让序列号生成器通过附加到单个日志文件来记录每个有问题的序列号。这样,如果它崩溃了,它只是从发布的最后一个序列号中获取,然后继续它的快乐方式。
挑战如下:
那么,以下日志记录方法的优缺点是什么:
- 有一个附加的日志文件,并以特定大小为上限
- 有两个日志文件,都没有附加。第一个日志文件始终包含最近发布的序列号,第二个文件包含第二个最近发布的序列号。日志文件以跷跷板方式写入(即所有偶数序列号最终都放入日志文件“A”,奇数序列号放入日志文件“B”)。最终结果是你总是得到最后两个序列号(并且没有更多),磁盘空间的使用很小,如果序列号生成器在记录最近的序列号时发生崩溃,那么'最近的文件可能已损坏。由于我们在另一个日志文件中也有第二个最近的序列号,我们可以检测到崩溃,并从这个“第二个最近的”序列号重新启动序列号生成器,+2
在序列号生成器无法判断“最新”或“第二个最新”日志文件中的哪个是损坏的崩溃场景中,始终从未损坏的序列号重新启动崩溃的生成器应该是安全的 + 2.
选项 1 实现起来稍微简单一些,但选项 2 使用的磁盘空间更少,而且看起来更智能。
在设计一个可以通过足够的日志文件可靠地从崩溃中恢复的系统方面,我是否遗漏了什么?