Timer 独占锁定和编程计时器的Play Framework最佳实践是什么?

Timer 独占锁定和编程计时器的Play Framework最佳实践是什么?,timer,playframework,transactions,locking,playframework-2.3,Timer,Playframework,Transactions,Locking,Playframework 2.3,我来自运行在单一服务器上的JavaEE后台。我正在研究Play框架,以构建高性能、可伸缩和弹性的系统。我意识到游戏是无状态的,什么都不共享,我明白这是一件好事。此外,我还阅读了CAP定理和12因子应用程序。但在某些情况下,我觉得作为一名JavaEE开发人员,我仍在思考,因此我请求帮助如何为下面的问题设计最佳的解决方案 假设我有一个系统,其中一个“请求者-用户”创建了一个报价。此优惠将发送给其他10个用户的移动设备。所有10个用户都可以响应该提议,但只有第一个响应的用户将实际“获得”该提议(其他用

我来自运行在单一服务器上的JavaEE后台。我正在研究Play框架,以构建高性能、可伸缩和弹性的系统。我意识到游戏是无状态的,什么都不共享,我明白这是一件好事。此外,我还阅读了CAP定理和12因子应用程序。但在某些情况下,我觉得作为一名JavaEE开发人员,我仍在思考,因此我请求帮助如何为下面的问题设计最佳的解决方案

假设我有一个系统,其中一个“请求者-用户”创建了一个报价。此优惠将发送给其他10个用户的移动设备。所有10个用户都可以响应该提议,但只有第一个响应的用户将实际“获得”该提议(其他用户将收到一条消息,表示“其他用户已接受该提议”)。然后,请求者用户将收到一封电子邮件,告知其报价将由用户X(第一个接受)完成

报价持续30秒。如果在这段时间内没有用户响应该报价,该报价将自动关闭,因此将不再接受任何回复。应向请求方用户发送电子邮件,说明其报价未被任何用户接受

每天20:00,系统将不得不向管理员发送一封电子邮件,报告每个报价,谁试图接受这些报价,谁真正“得到了”

以下是我的三个主要问题:

  • 如何确保只有一个用户接受此服务?数据库悲观锁定是否是序列化这些请求的最佳选择,即使它会导致阻塞IO?我曾考虑使用JMS服务器来帮助发送电子邮件,但由于Play不支持XA事务,我认为这不是一个好主意。也许只使用JMS服务器os-Akka是最好的选择

  • 30秒计时器的最佳策略是什么?我可以使用异步作业,但这些作业与当前实例有很高的关联性,我认为在弹性云环境中这不是一个好主意,因为在弹性云环境中,一些服务器可能会在低使用期停机。再说一次,也许阿克卡是最好的选择?我读到Akka最多有一次交货,所以我不确定这是否可行。也许是分布式石英

  • 对于20:00报告,我可以使用带有@each注释的一些预定作业。但这将并行触发n个报告,n是我的环境中的实例数。同样,我可以使用一些数据库锁定机制来避免这种情况,使用大量阻塞IO。如果我有JavaEE(RequiresNew等)中的细粒度事务控制,我可以最小化这些阻塞,但在游戏中,我相信会有一种更优雅的方法来实现这一点

  • 我更喜欢嵌入到游戏框架中的解决方案和工具,或者与游戏理念一致的第三方解决方案

    提前谢谢大家,, Renan

    不要使用石英——Akka具有同等的功能。如果不知道您的规模要求,就很难对阻止IO进行评论。我相信有异步db API,也有用于Mongo的异步API。这将避免阻塞IO,即使使用了db锁定


    对于30秒计时器,使用持久性存储,例如数据库表来表示要完成的任务。然后,任何服务器实例都可以执行该任务

    谢谢伊恩的回答。我的目标是使用MySQL作为主数据库。你能详细说明一下30秒计时器的数据库表吗?在我设置代表任务的表之后,下一步是什么?所有服务器实例是否都应该每5秒检查一次数据库中过期的任务,然后采取行动?另外,这是一个很好的学习材料:我没有写答案,因为有太多的部分可以为您提供所有这些任务的代码示例,但我认为,您可以使用分布式Akka集群+一致散列路由来实现您想要的。我必须做点什么。。。半类似于之前的警告系统,当其他人也在编辑他们打开的内容时,会通知用户。关键是一致的散列路由,因为您可以让同一参与者处理每个提供