在ColdFusion中可靠地使用远程Web服务的最佳实践?

时间:2011-06-28 17:10:20

标签: web-services coldfusion

如何可靠地在ColdFusion中执行Web服务调用?

您如何处理远程服务器停机/忙碌等情况?并导致页面超时?

如何每x秒执行一次重试?

是否应以异步方式调用远程调用,如果是,则如何进行回调?

也许ColdFusion 10 <cfjob>和Closure支持将以更清洁,更直接的方式解决这些问题。但是,如何在CF9中解决这些问题?

谢谢

1 个答案:

答案 0 :(得分:2)

我们通常通过REST或SOAP或ActiveMQ与第三方进行大量集成。

通常我们以相同的方式处理所有Web服务调用 - 如果它们失败(通过超时或其他错误),我们通过设置cfhttp属性throwOnError=true来抛出异常。这会被电子邮件或开发团队的高级应用程序异常处理所捕获,以便他们进行调查。

这种方法的唯一例外是从CFM页面调用“琐碎”的Web服务并不重要 - 例如获取一些演示数据。我们不希望此调用超时使整个页面变为bork,因此我们设置throwOnError=false(默认值)并检查错误的状态消息/代码。我们将错误通过电子邮件发送给开发团队进行调查,但我们只是继续处理页面。

我们倾向于避免重试,因为我们知道大多数服务很快会被另一个请求再次调用,你在哪里画线? 1重试? 100次重试?这对用户有何影响?我也发现关于重试的逻辑充其量只是混乱而且通常是丑陋和重复的。

使用其结果在演示文稿页面上使用的Web服务的另一种方法是从计划任务或cfthread调用它们。如果您可以将结果保存在缓存,数据库或其他方面,并使您的代码访问数据的持久存储而不是Web服务本身,那么这是一种很好的方法。这具有确保页面快速(如果您的Web服务调用被延迟)以及任何错误不会影响用户的双重效果。再次报告任何失败都可以进行调查。

我们已经看到繁忙的演示文稿页面上的Web服务因为超时太长而导致服务器停机(我的目标是最大约1-3秒)。所有正在运行的请求都用完了处理Web服务,然后开始排队。不漂亮。从错误中学习并使用非常快的超时,否则就像我之前提到的那样,不要把Web服务放在那里。

我不相信可以进行异步调用/回调。你可能会想到Node.js:)