在clojure REST +磁盘I / O应用程序中要处理哪些错误?

时间:2012-12-28 13:27:12

标签: java exception clojure agents

我有一个服务器应用程序,有点简化,定期通过来自一个不够强大的服务器的rest-api进行测量。值应该在本地缓存(并且是带时间戳/不可变的),可以存储为FloatBuffer,其中每个位置对应于测量样本。有一个webbrowser应用程序定期发出ajax请求来更新网页上的一些整洁的统计数据,如下图所示:

Picture describing system architechture for REST measurement service and presentation

假设服务器已启动并运行,仍有许多地方可能发生错误

  • REST测量服务器可能无法访问(服务器只是在本地存储测量值)
  • 与测量服务器的网络连接可能已关闭
  • 存储可能已满或以某种方式损坏
  • 浏览器可能会失去与服务器的联系并尝试再次接收

我的策略一般应该处理错误:

如果通过REST从测量服务获取值时出现问题,则应该每分钟重试一次。如果错误持续超过30分钟,则应通知管理员。如果出现磁盘问题,应立即通知管理员,或者最好在磁盘满了之前通知。

最终用户体验应尽可能对错误透明,但应用程序仍应尽可能 sanely ,通知用户发生错误但也显示可用的最新数据

如何找到应对网络问题的错误(通过ScheduledThreadPoolExecutor作业触发的代理使用clj-http发出REST请求)以及尝试刷新{时磁盘问题{1}}?

实现上述非常有状态但算法策略的理智方法是什么?我应该在FloatBuffer报告错误并切换到某种恢复模式作业时简单地处理错误吗?

1 个答案:

答案 0 :(得分:0)

在涉及不同系统的多个组件的此类交互中,应避免最终用户执行许多同步操作。它只是时间限制的同步操作,需要立即报告错误。

一旦最终用户的交互系统是异步的,你在错误处理机制上也有很多选择......在最终用户与系统交互的时候,你可以有一个错误映射器来翻译从各种组件到用户可理解的消息的所有错误。

应该为用户提供API以查询他提交的请求的状态。这应该能够判断请求是否完整或是否存在错误。如果网络连接将花费更多时间,则状态消息可以通知用户。

每个组件都会在任何分布式系统中的某个时刻报告错误。某些API为此提供了错误侦听器接口。这将异步向用户报告错误。看看像JMS(http://docs.oracle.com/javaee/5/tutorial/doc/bnceh.html)这样的API。它们被证明可用于复杂系统,并具有良好的错误处理机制。