客户是否应该保护自己免受服务器错误的影响
Should client protect himself from server bugs
我有一个与客户端和服务器之间的体系结构和协议相关的一般性问题。
我们有一个包含服务器和许多客户端的大型系统,该系统在客户端和服务器之间同步文件。在服务器端,我们对来自客户端的输入进行了分配检查,以防止出现意外行为。
但是我们的客户端不检查来自服务器的消息(检查会导致性能问题)
例如,如果服务器向客户端发送删除文件的消息,我们只是删除该文件而不确定(双重检查)服务器上的状态是什么(我们有一个情况是删除发送到客户端,因为错误在服务器端)
所以我的问题是客户应该保护自己免受服务器错误的影响吗?
如果您回答了该问题,请在相关论文/网站中包含 link。
为了清楚起见,服务器和客户端之间的所有通信都受到 https 协议的保护,包括客户端证书,所以问题只是关于错误而不是攻击
谢谢
一般来说,服务器可以是第三方提供的服务,比如Google Docs,你没有任何控制权。
即使我拥有服务器,我也会在替代方案上投入更多精力,例如广泛测试服务器功能和进行逻辑删除而不是物理删除等,而不是对性能造成额外的影响,但是是的,这取决于有多少你准备好妥协了。
如果在多个客户端上承受性能损失和维护逻辑比删除一些重要文档且永远无法恢复更值得,那么您始终可以做出选择。
PS: 我没有任何证明文件。
搜索答案后,我开始阅读有关 "Design by contract" 的内容。
wiki 来自维基百科:
Contract conditions should never be violated during execution of a bug-free program. Contracts are therefore typically only checked in debug mode during software development. Later at release, the contract checks are disabled to maximize performance.
In many programming languages, contracts are implemented with assert. Asserts are by default compiled away in release mode in C/C++, and similarly deactivated in C#/Java. This effectively eliminates the run-time costs of contracts in release.
还有一个精彩的post Design by contract here
总而言之,我们需要在调试模式下而不是在发布模式下检查服务器 "bugs"
我有一个与客户端和服务器之间的体系结构和协议相关的一般性问题。 我们有一个包含服务器和许多客户端的大型系统,该系统在客户端和服务器之间同步文件。在服务器端,我们对来自客户端的输入进行了分配检查,以防止出现意外行为。 但是我们的客户端不检查来自服务器的消息(检查会导致性能问题) 例如,如果服务器向客户端发送删除文件的消息,我们只是删除该文件而不确定(双重检查)服务器上的状态是什么(我们有一个情况是删除发送到客户端,因为错误在服务器端)
所以我的问题是客户应该保护自己免受服务器错误的影响吗? 如果您回答了该问题,请在相关论文/网站中包含 link。
为了清楚起见,服务器和客户端之间的所有通信都受到 https 协议的保护,包括客户端证书,所以问题只是关于错误而不是攻击
谢谢
一般来说,服务器可以是第三方提供的服务,比如Google Docs,你没有任何控制权。
即使我拥有服务器,我也会在替代方案上投入更多精力,例如广泛测试服务器功能和进行逻辑删除而不是物理删除等,而不是对性能造成额外的影响,但是是的,这取决于有多少你准备好妥协了。
如果在多个客户端上承受性能损失和维护逻辑比删除一些重要文档且永远无法恢复更值得,那么您始终可以做出选择。
PS: 我没有任何证明文件。
搜索答案后,我开始阅读有关 "Design by contract" 的内容。 wiki 来自维基百科:
Contract conditions should never be violated during execution of a bug-free program. Contracts are therefore typically only checked in debug mode during software development. Later at release, the contract checks are disabled to maximize performance.
In many programming languages, contracts are implemented with assert. Asserts are by default compiled away in release mode in C/C++, and similarly deactivated in C#/Java. This effectively eliminates the run-time costs of contracts in release.
还有一个精彩的post Design by contract here
总而言之,我们需要在调试模式下而不是在发布模式下检查服务器 "bugs"