【问题标题】:Using GAE Task Queues for handling persistence operations使用 GAE 任务队列处理持久性操作
【发布时间】:2015-01-30 20:58:58
【问题描述】:
希望获得关于将持久性操作交给任务队列是否是个好主意的意见。例如,一个用户提交了一个新的“订单”,我使用 bean 验证来验证一切是否正常,然后将订单的处理/持久化交给一个任务队列,并更快地响应用户。
我的犹豫是持久性“可能”失败,但是一旦我验证了 bean,机会就很低。任务队列通常用于处理相对琐碎的任务吗?我主要关心的是如果任务队列中的任务失败会发生什么,因为它是异步完成的,我该如何通知用户?
【问题讨论】:
标签:
java
google-app-engine
jakarta-ee
task-queue
【解决方案1】:
任务将自动重试。如果故障是由基础设施引起的,任务将在后续尝试中完成。所以你只需要担心失败是由你的代码(代码错误)或数据(验证错误)引起的。如果您解决了这些错误,您可以毫不犹豫地使用任务,而不必担心通知。
在任何一种情况下,如果处理订单需要几秒钟,我可能不会为任务队列而烦恼。从用户体验的角度来看,用户希望应用程序对他们的订单做了一些工作,因此 1-2 秒的响应延迟是可以接受的,甚至是意料之中的。
【解决方案2】:
我们已经实现了一个巨大的物流应用程序,我们的一些流程需要 2-3 分钟来从 BigQuery 读取大量数据、完成工作并发送带有附件的电子邮件。
要通知用户,您可以使用 Channel API 和/或发送电子邮件。
您必须在任务参数中提供用户 ID、邮件地址或类似内容,因为它是由系统运行的。
您不能向 App Engine 询问当前登录的用户,它每次都会为空。
就像安德烈说的:
您只需要担心失败是由您的
代码(代码错误)或数据(验证错误)。
不要让异常退出任务,否则整个任务将再次运行。