聚合/存储字段和异步作业

时间:2013-12-24 02:35:56

标签: java playframework ebean playframework-2.2

我在DB中存储了一个Coupon实体类,其中的阶段表示为枚举。

这样的事情:

enum CouponStatus {
        CREATED,
        PUBLISHED,
        STARTED,
        FINISHED,
        RESULTSARRIVED,
        POINTSASSIGNED,
        MONEYPAID,
        CLOSED
}

它还有一个Game个实体的@ManyToMany列表,每个实体都有一个Date字段。 Coupon的状态应根据包含游戏日期进行更改。

给你一个想法:

  • 初始状态为CREATED。
  • 最早游戏状态日期前两周 出版。
  • 最早状态日期前5分钟开始。
  • 最新游戏开始后三小时状态已结束。
  • 当所有游戏的结果将被插入到另一个表中时 状态变为RESULTSARRIVED。
  • 等......

根据状态我做了不同的事情:

  • 仅在状态为PUBLISHED时才在优惠券列表中显示优惠券。
  • 当状态为STARTED时停止显示并停止接受投注。
  • 当状态为FINISHED时,将结果请求发送到外部系统。

我看到了3种可能性:

  1. 根本不要使用状态字段。意味着我不同的事情不是基于状态,而是直接基于游戏的日期字段。通过这种方式,我每次向用户显示优惠券列表时都需要获取优惠券的游戏。
  2. 每分钟都有一份工作,可以提取游戏并改变状态。
  3. 根据游戏日期的预期下一次状态更改,让每次运行并重新安排作业。
  4. 我显然不是第一个遇到此类问题的人。 还有其他方法吗?这类事情的最佳做法是什么?

1 个答案:

答案 0 :(得分:1)

听起来#2可能已经足够好了。如果你想要准确的5分钟,#2和#3的组合可能会很方便。

另一种方法可能是在内存中管理状态,例如使用Akka,并将状态与数据库同步。每个优惠券你会有一个演员,如果你需要超出适合一台机器内存的范围,这些可以分布在一个大的Akka集群上。使用这种方法,每个参与者都会安排下一次状态更改发生的时间,并自行管理。您也可以将您的传入请求转到Akka,而不是去数据库。这一切都取决于你的用例。