RPC 的 GWT Servlet 模型是单线程模型,还是如何通过 GWT 实现高可用性?

Posted

技术标签:

【中文标题】RPC 的 GWT Servlet 模型是单线程模型,还是如何通过 GWT 实现高可用性?【英文标题】:Is GWT Servlet model for RPC a single threaded model, or how to be Highly Available with GWT? 【发布时间】:2011-09-06 19:48:38 【问题描述】:

我需要实现一个包含在 Tomcat 实例中的高可用性服务。我正在使用带有 RPC 机制的普通 GWT 从我的客户端应用程序调用服务器。我创建的是每个远程服务中的 com.ha.keepAlive() 方法。如果一切正常,RPC 方法除了响应“0”之外什么都不做。目前,如果出现问题,我预计会出现异常。

我正在阅读Java Servlet Specification 3.0,我很担心。 servlet 可以返回 UnavailableException 或 ServletException,但 GWT 已经包装了 HttpServlet 以便吞下异常。我仍然可以从 GWT 获得异常,对于任何类型的异常,我都会假设“服务已关闭”,因为这不应该发生。

此外,如果 servlet 以某种方式崩溃,则 servlet 容器可能会重新启动 servlet,或者它可能有许多 servlet 实例。根据我的阅读(第 2.2 节),我发现通常只有一个实例:

对于不在分布式环境中托管的 servlet(默认),servlet 每个 servlet 声明容器必须只使用一个实例。但是,对于 servlet 实现 SingleThreadModel 接口,servlet 容器可以 实例化多个实例以处理繁重的请求负载并序列化请求 到一个特定的实例。

那么,我是否正确地通过在每个服务(servlet)中创建一个 GWT-RPC 方法来假设我是否遇到异常(或者在某些时候不是“0”)我需要重新启动我的 Web 应用程序容器?我特别担心 servlet 的多实例特性,它可能隐藏真实的服务可用性。

对不起,我不得不这么冗长。非常感谢任何有建议的人!

【问题讨论】:

【参考方案1】:

您不应该重新启动容器。异常没有任何意义 - 它可能是网络出现故障,您的应用程序输入错误(例如来自搜索引擎)等。所以不要对这些异常执行任何操作(除了向客户端返回错误代码并记录它)。

按照规范,一个 servlet 只有一个实例 - 该实例与许多调用 service(..) 方法的线程一起使用。这意味着您的 servlet 中不应包含任何实例变量,以使它们是线程安全的。单线程模型现已弃用。

【讨论】:

实际上,它是一个封闭的应用程序,只能通过 GWT 接口访问,所以任何异常都是不好的迹象。这是一个非时间紧迫的医院应用程序,用户已经收到错误消息。这是一个自动监控软件,它需要知道做某事是否有问题或派人过来。也许我的服务应该“询问”所有服务 servlet 是否一切正常?冒险的主题。

以上是关于RPC 的 GWT Servlet 模型是单线程模型,还是如何通过 GWT 实现高可用性?的主要内容,如果未能解决你的问题,请参考以下文章

servlet 的 GWT RPC 服务分配异常

是否可以通过 GWT RPC Servlet 上传文件?

GWT Servlet 错误 com.google.gwt.user.client.rpc .StatusCodeException: Tomcat 服务器上的 404

是否可以以编程方式更改 GWT RPC servlet 路径?

GWT RPC 警告:servlet 有映射,但 web.xml 没有对应的映射

GWT:分派传入 RPC 调用时出现异常