我目前正在开发一个服务器应用程序,如果我们同意尝试并保持一定水平的服务。我们要保证的服务级别是:如果服务器接受请求并且服务器向客户端发送确认,我们希望保证请求会发生,即使服务器崩溃。由于请求可以长时间运行并且确认时间需要很短,我们通过持久化请求来实现这一点,然后向客户端发送确认,然后执行各种操作来满足请求。随着动作的执行,它们也会被持久化,因此服务器在启动时知道请求的状态,并且还有与外部系统的各种协调机制来检查我们的日志的准确性。
这一切似乎都运行得很好,但我们很难有任何信念这样说,因为我们发现测试我们的容错代码非常困难。到目前为止,我们已经提出了两种策略,但都不是完全令人满意的:
- 让外部进程监视服务器代码,然后尝试在外部进程认为是测试中的适当点时将其终止
- 向应用程序添加代码,使其在某个已知的关键点崩溃
我对第一个策略的问题是外部进程无法知道应用程序的确切状态,因此我们不能确定我们是否遇到了代码中最有问题的点。我对第二种策略的问题,虽然它可以更好地控制故障是否发生,但我不喜欢在我的应用程序中注入故障的代码,即使是可选编译等。我担心过分看故障太容易了注入点并将其滑入生产环境。