在设计我的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()。
在这种情况下,我希望能够检测到即将超时的
同步 - “立即回答我!我很重要,需要实时响应!!!”
异步 - “在您可以回答我时,请回答我;我需要知道答案,但真的不是很紧急。”
命令 - “我不需要答案。这不是一个请求,而只是在服务器端执行某些操作或处理某些内容的命令。”
我的计划是实现我的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规定)。
那么,这里实际上我想问的是:
- 如何在
SynchronousRequest
、AsynchronousRequest
和CommandRequest
中包装一个RequestFactory
调用,以使得RequestFactory
调用表现出它们各自预期的行为?换句话说,使得调用要么部分阻塞(同步),要么可以在以后的某个时间点被通知/更新(异步),或者只是快速执行(命令)? - 如何实现我的需求,使
SynchronousRequest
可以绕过GAE的60秒超时并在不失败的情况下得到处理?
请注意:超时问题可以通过将事物重新路由到后端实例来轻松解决,但后端不会/无法扩展。我需要可扩展的前端实例及其超时的解决方案(这是我首先选择GAE的主要原因!)。谢谢!