Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine GAE w/Java,调度用户通知_Google App Engine_Google Cloud Datastore_Task Queue - Fatal编程技术网

Google app engine GAE w/Java,调度用户通知

Google app engine GAE w/Java,调度用户通知,google-app-engine,google-cloud-datastore,task-queue,Google App Engine,Google Cloud Datastore,Task Queue,我正在用Java在GAE上创建一个应用程序,并寻找关于如何处理调度用户通知(包括电子邮件、文本、推送等)的建议。有两种方式可以生成通知:当制作人创建内容时,以及根据消费者的时间表生成通知。后者是棘手的部分,因为消费者可以随时更改其日程安排。以下是我迄今为止考虑过的选择和关注的问题: 在数据存储中为每个使用者保留一个条目,按时间索引,直到下一次通知。我担心的是最终一致性指数的滞后性。我所看到的报告中最长的延迟大约为4小时,这对于这个用例来说是不可接受的。用户不应将其计划延迟一周,然后在4小时后收到

我正在用Java在GAE上创建一个应用程序,并寻找关于如何处理调度用户通知(包括电子邮件、文本、推送等)的建议。有两种方式可以生成通知:当制作人创建内容时,以及根据消费者的时间表生成通知。后者是棘手的部分,因为消费者可以随时更改其日程安排。以下是我迄今为止考虑过的选择和关注的问题:

  • 在数据存储中为每个使用者保留一个条目,按时间索引,直到下一次通知。我担心的是最终一致性指数的滞后性。我所看到的报告中最长的延迟大约为4小时,这对于这个用例来说是不可接受的。用户不应将其计划延迟一周,然后在4小时后收到来自旧计划的通知

  • 与上面相同,但每个条目共享一个公共父项,因此我可以使用祖先查询来消除其最终的不确定性。我担心的是,可能会有足够多的消费者引起争议。在我最疯狂的梦中,我可以预见高峰使用时每分钟10000次的日程变化
  • 为每个使用者安排任务。更改计划时,它可以删除旧任务并在新时间创建新任务。我关心的是任务和数据存储事务的交互,因为计划将存储在数据存储中。注意,赋予任务可以很好地处理事务,但是删除一个任务又如何呢?我不希望一个任务被删除,而只是让添加作为其事务的一部分失败

  • 编辑:我尝试过删除任务(对于选项3),不幸的是,作为失败事务一部分的删除仍然成功。这是一个令人失望的不对称。无论如何,我最终可能会走这条路,但添加一些额外的逻辑和数据存储标志,以确保未正确删除的恶意任务在执行时什么也不做。

    数据存储中的最终一致性通常以秒为单位。作为:

    时间延迟通常很小,但可能更长(甚至几分钟或更长) 在特殊情况下会更严重)

  • 为每个用户保存下一次通知的时间。定期运行cron作业(例如,每小时一次),并向此时必须得到通知的所有用户发送通知(即,现在>=下一个通知)

  • 使用倒计时值创建用户计划时,为每个用户创建任务。当任务执行时,它将为此用户创建下一个任务

  • 第一种方法可能更有效,尤其是如果为cron作业选择足够大的窗口


    至于交易,我不明白你为什么需要它们。您可以设计您的系统,在非常罕见的失败情况下,用户将收到两个通知,而不是一个(旧计划和新计划)。这并不是一件坏事,你需要围绕它进行设计。

    10000次每分钟的计划更改意味着10亿用户,除非你的用户除了每天更改他们的计划之外别无选择,在这种情况下,你仍然需要1440万用户。在你获得第一批100000用户之前,我不会担心这一点:)@Andrei这是我的逻辑(请注意我的“最疯狂的梦想”免责声明):1000万用户,每个用户每周改变一个消费者的日程安排。平均每小时大约有1000次变化。添加数量级以获得10000次更改/小时的峰值使用率。我不认为应用程序变得如此流行,但只要我在设计阶段,我不妨考虑最好/最坏的情况。如果结果很难设计,那么我会考虑一个“以后担心”的方法。您是对的,您将无法在一个实体组上每分钟处理10000次写入。但是,不使用子-父实体还有其他原因。对于第2项。公共父级将是用户。这意味着查询将在用户级别保持一致。所以我怀疑你会有写速度问题。您可以为每个用户使用命名任务。该名称对于用户/时间间隔是唯一的。我不确定你是否能100%保证任务重新调度总是有效的(如果你必须刷新任务队列,在应用程序更新时怎么办?),这样你就可以定期运行cron作业,查找在分配的时间内没有运行任务的用户,并为间隔创建一个具有正确名称的新任务。这将避免重复任务。根据您预计的用户数量,我想知道您是否考虑过安排和运行如此数量的任务的成本?谢谢您的建议。如果事实证明任务删除不能进行事务处理,我可能会依赖“最多分钟”来获得最终的一致性延迟,正如您在(1)中所建议的那样。关于(2),这与:
    一旦编写了名为N的任务,任何后续插入名为N的任务的尝试都会失败。
    关于任务,您是对的-我更新了我的答案,并添加了关于事务的想法。感谢您与我交换意见。我做了一些实验,提出了一个解决方案,基本上就是我的号码(3)和你的号码(2),还有一个额外的故障保护,正如在我的原始帖子的编辑中所讨论的。