使用GWT和GAE进行同步、异步和命令客户端请求

3
在设计我的GWT / GAE应用程序时,我意识到我的客户端(GWT)将生成三种类型的请求:
同步 - “立即回答我!我很重要,需要实时响应!!!”
异步 - “在您可以回答我时,请回答我;我需要知道答案,但真的不是很紧急。”
命令 - “我不需要答案。这不是一个请求,而只是在服务器端执行某些操作或处理某些内容的命令。”
我的计划是实现我的GWT代码,以便我可以为每个特定的服务器端请求指定其请求类型(注意:出于本问题范围之外的原因,我已决定选择RequestFactory而不是传统的GWT-RPC):
SynchronousRequest - 同步(来自上文);发送命令并急切地等待响应,然后使用响应以某种方式更新客户端状态
AsynchronousRequest - 异步(来自上文);发出初始请求,通过轮询或GAE Channel API以某种方式通知接收到最终响应
CommandRequest - 命令(来自上文);发出服务器端请求,并且不等待响应(即使服务器无法履行或拒绝执行命令)
我想,我的目的不是要生成完全阻塞的同步请求,但是它可能会阻止用户与特定的小部件或屏幕部分进行交互。
这里的关键在于:GAE强制执行所有前端实例的超时(60秒)。后端实例具有更宽松的超时限制、线程等约束。因此,显然应将异步请求和命令请求路由到后端实例,以便GAE超时不会成为它们的问题。
但是,如果GAE表现不佳,或者我们正在达到峰值流量,或者我的代码只是简单地出了问题,我必须考虑以下情况:发起了同步请求(必须通过受超时调节的前端实例),并且除非我的GAE服务器代码做些花哨的事情,否则将超时。我知道GAE API中有一个方法,我可以调用它来查看请求到超时的毫秒数;但尽管它的名称现在让我忘记了,但这个“花哨”的代码将基于它。就本问题而言,我们称其为public static long GAE.timeLeftOnRequestInMillis()。
在这种情况下,我希望能够检测到即将超时的SynchronousRequest,并以某种方式动态地将其转换为AsynchronousRequest,以便它不会超时。也许这意味着向客户端发送一个AboutToTimeoutResponse,并强制客户端决定是否重新发送为AsynchronousRequest或者直接失败。或者我们可以将SynchronousRequest转换为AsynchronousRequest并将其推送到队列中,后台实例将使用它、处理它并返回响应。我在实现方面没有任何偏好,只要请求不因服务器无法快速处理而失败或超时(由于GAE规定)。

那么,这里实际上我想问的是:

  • 如何在SynchronousRequestAsynchronousRequestCommandRequest中包装一个RequestFactory调用,以使得RequestFactory调用表现出它们各自预期的行为?换句话说,使得调用要么部分阻塞(同步),要么可以在以后的某个时间点被通知/更新(异步),或者只是快速执行(命令)?
  • 如何实现我的需求,使SynchronousRequest可以绕过GAE的60秒超时并在不失败的情况下得到处理?

请注意:超时问题可以通过将事物重新路由到后端实例来轻松解决,但后端不会/无法扩展。我需要可扩展的前端实例及其超时的解决方案(这是我首先选择GAE的主要原因!)。谢谢!

1个回答

0
如果您想让GAE进行的计算需要超过60秒,那么在发送响应之前不要等待结果被计算出来。根据您的问题定义,没有办法绕过这个问题。相反,客户端应该提交工作订单,并在服务器通知结果准备好时等待通知。请求将包括工作订单,可能看起来像这样:
class ComputeDigitsOfPiWorkOrder {
  // parameters for the computation
  int numberOfDigitsToCompute;

  // Used by the GAE app to contact the requester when results are ready.
  ClientId clientId;
}

这样,您的GAE应用程序可以在工作订单保存后立即响应(例如,在任务队列中),而不必等到它实际完成计算十亿位数的圆周率之前才响应。然后,您的GWT客户端使用通道API等待结果。

为了使某些工作订单具有更高的优先级,您可以使用多个任务队列。如果您希望任务队列工作自动扩展,则需要使用推送队列。使用推送队列实现优先级有点棘手,但是您可以配置高优先级队列以获得更快的反馈速率。

您可以将通道API替换为其他通知解决方案,但这可能是最直接的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接