我正在开发web服务,并对超时/异常处理方法有疑问。
我有一个Web服务(WS1)和一个客户端C.客户端从用户接收一些操作,并调用WS1进行一些不需要向用户提供响应的操作。
我可以用两种可能的方式在应用程序中设计错误处理 -
从C调用WS。如果调用成功,WS将返回一个令牌。如果C因任何原因没有获得令牌(可能是WS失败或网络超时),它将存储在数据库中,某些工作将在稍后重试该操作。
从C调用WS并结束帖子。如果有任何问题,WS将ping回C(在单独的调用中)。如果没有ping回,则假设事务已通过。
通常,有哪些选项可以确保WS调用成功。如果事务在第一次尝试中失败,有什么方法可以重试操作?
答案 0 :(得分:1)
两种方法都是有效的。你所拥有的只是一个同步操作和异步操作。例如插座有两种模式可供使用多年;这样做,例如文件读取功能。
选择归结为此 - 无论您的客户端程序是否能够等待操作完成。如果可以,同步操作更容易编程。否则使用回调进行异步模型。
就重试而言 - 这又取决于。重试多久?许多程序在故障循环中只需尝试2-3次。如果您的重试属于在特定时间后重试的类型,那么您必须存储有关您尝试在某处执行操作的信息。某处可能是程序存储器,也可能是某些永久存储器。同步和异步模式都需要信息存储才能重试。异步更是如此,因为当你收到回电时,你需要检查你的商店,弄清楚你试图做什么。在同步模式中,信息多次隐式存储在程序堆栈中,用于数据变量。
然后还应该重试程序崩溃?如果是这样,那么您需要将信息存储在某个离线商店中。我曾经有一个电信应用程序;电信应用程序会将呼叫详细记录写入数据库。如果由于某种原因失败,程序只会将该CDR写入本地文件,然后继续。一个cron作业将通过将它们发送到DB来清理本地文件中的记录。通过这种方式,提供计费信息的呼叫记录甚至可以在程序崩溃时幸免于难。
有些人使用消息队列来做这些事情。消息队列提供有保证的传递。客户端发送消息。服务器端得到它。仅当服务器成功处理该消息时,服务器才会从Q中删除该消息。否则留言;这里的危险是消息可能会有一些永久性的失败,然后它会进入无限循环。
因为一些永久性的失败而进入无限循环,比如向WS提供错误的参数,这是你必须要处理的事情。