【问题标题】:Which errors to handle in clojure REST+disk-I/O app?在 clojure REST+disk-I/O 应用程序中要处理哪些错误?
【发布时间】:2012-12-13 18:18:28
【问题描述】:

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

假设服务器已经启动并运行,还有很多地方可能会出错

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

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

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

最终用户体验应尽可能对错误透明,但应用程序仍应尽可能正常运行,通知用户发生错误并显示可用的最新数据.

关于网络问题(使用clj-http,通过ScheduledThreadPoolExecutor 作业触发的代理发出REST 请求)以及尝试刷新FloatBuffer 时的磁盘问题,我如何找到要处理的错误?

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

【问题讨论】:

  • 感谢指点!但是,我意识到我真的在寻找任何类型的 java 服务器实现(我想从头开始制作整个解决方案)。我要去码头和/或Tomcat。再次感谢。
  • 同时,我将仔细研究必要的邪恶故障处理:github.com/brehaut/necessary-evil/blob/master/src/…

标签: java exception clojure agents


【解决方案1】:

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

一旦最终用户的交互将系统异步,您在错误处理机制上也有很多选择......在最终用户与系统交互的地方,您可以有一个错误映射器来翻译来自各个组件的所有错误都可以让用户理解的消息。

应该给用户一个API来查询他提交的请求的状态。那应该能够判断请求是否完成或是否有错误。如果网络连接需要更多时间,状态消息可以通知用户。

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

【讨论】:

    猜你喜欢
    • 2018-05-20
    • 1970-01-01
    • 2014-09-03
    • 2015-08-10
    • 2013-04-29
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    相关资源
    最近更新 更多