[英]Synchronous, Asynchronous and Command Client Requests with GWT and GAE
在设计我的GWT / GAE应用程序时,我很明显我的客户端(GWT)将生成三种类型的请求:
我的游戏计划是实现我的GWT代码,以便我可以为每个特定的服务器端请求指定( 注意:我已决定使用RequestFactory
不是传统的GWT-RPC ,原因超出了本问题的范围),这类型请求是:
SynchronousRequest
- 同步(来自上方); 发送命令并急切地等待响应,然后它以某种方式用于更新客户端的状态 AsynchronousRequest
- 异步(从上面); 发出初始请求并以某种方式 - 通过轮询或GAE Channel API,在最终收到响应时得到通知 CommandRequest
- 命令(来自上方); 发出服务器端请求并且不等待响应(即使服务器未能执行或拒绝执行命令) 我想我对SynchronousRequest
意图不是产生一个完全阻塞的请求,但它可能会阻止用户与特定的Widget
或部分屏幕进行交互。
增加的踢球者是这样的:GAE在其所有前端实例(60秒)上强制执行超时。 后端实例对超时,线程等具有更宽松的约束。因此,我很明显AsynchronousRequests
和CommandRequests
应该路由到后端实例,以便GAE超时不会成为它们的问题。
但是,如果GAE表现不佳,或者我们遇到峰值流量,或者我的代码很简单,我必须考虑进行SynchronousRequest
的情况(必须通过超时监管的前端实例)并且将超时,除非我的GAE服务器代码做了一些奇特的事情。 我知道GAE API中有一个方法,我可以调用它来查看请求在其超时之前有多少毫秒; 虽然它的名字现在逃脱了我,但这就是这个“花哨”代码的基础。 为了这个问题,我们称之为public static long GAE.timeLeftOnRequestInMillis()
。
在这种情况下,我想检测到SynchronousRequest
即将超时,并以某种方式动态地将其转换为AsynchronousRequest
以便它不会超时。 也许这意味着将AboutToTimeoutResponse
发送回客户端,并强制客户端决定是重新发送为AsynchronousRequest
还是仅失败。 或者我们可以将SynchronousRequest
转换为AsynchronousRequest
并将其推送到后端实例将使用它的队列,处理它并返回响应。 在实现方面我没有任何偏好,只要请求没有失败或超时,因为服务器无法足够快地处理它(因为GAE强加的规则)。
那么,这就是我实际上在这里问的问题:
SynchronousRequest
, AsynchronousRequest
和CommandRequest
中包装RequestFactory
调用,使RequestFactory
调用的行为与每个调用的方式相同? 换句话说,可以在某个时间点(异步)通知/更新部分阻塞(同步)的呼叫,或者可以只是发送 - 忘记(命令)? SynchronousRequest
绕过GAE的60秒超时并仍然可以不失败地处理? 请注意:通过将内容重新路由到后端实例可以轻松避免超时问题,但后端不会/不能扩展。 我也需要这里的可扩展性(这主要是我首先在GAE上的原因!) - 所以我需要一个处理可扩展前端实例及其超时的解决方案。 提前致谢!
如果您希望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应用程序可以在保存工单(例如,在任务队列中)后立即响应,并且不必等到它在响应之前实际完成计算十亿个数字的pi。 然后,您的GWT客户端使用Channel API等待结果。
为了给一些工作订单更高的优先级,您可以使用多个任务队列。 如果您希望任务队列工作自动扩展,您将需要使用推送队列。 使用推送队列实现优先级有点棘手,但您可以配置高优先级队列以获得更快的进给速率。
您可以使用其他一些通知解决方案替换Channel API,但这可能是最直接的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.