你如何处理mysql,redis和memcache的多个执行上下文?

时间:2014-05-02 20:22:07

标签: scala playframework

如果我在一个Action中发出3种不同类型的请求,如果它们都有自己的执行上下文,我该如何处理呢?这种类型的场景是否有最佳实践?

我需要执行以下操作:

  1. 使用slick to mysql进行db调用
  2. 拨打redis电话
  3. 进行内存缓存调用
  4. 所以说我的行为看起来像我有3个不同的执行背景,请纠正我错误的地方:

    def userProfile = Action.async {
      Future {
        // db
      }(Contexts.myDbEC)
    
      Future {
        // redis calls
      }(Contexts.myRedisEC)
    
      Future {
        // memcache calls
      }(Contexts.myMemcacheEC)
    
    }
    
    1. 在这种情况下我必须使用Action.asynch是否正确?那是为什么?
    2. 如果我需要一个执行上下文与另一个执行上下文的结果怎么办?
    3. 如果将未来代码在块中执行,我将如何组合结果,是否必须在未来的调用之外定义变量,或者有办法获得返回值吗?

1 个答案:

答案 0 :(得分:1)

如果你想让你的Action异步然后返回 a Future,Action.async的使用是正确的。

对于您的第二个问题,假设您想要检索一个未来的结果并与另一个结合? - 您可以使用flatMap或foreach撰写期货。

根据您的示例,您可以收集未来的结果并使用理解来收集结果。

val future1 = future{ //db call }
val future2 = future{ //redis call}
val future3 = future{//memcache call}

val res = for{
            r1 <- future1
            r2 <- future2
            r3 <- future3
          } yield(r1+r2+r3)

注意:如上所述,将这些期货运行到外面以便并行运行它们非常重要。如果你这样做,那么它们将按顺序运行。

val res = for{
            r1 <- future{//db call}
            r2 <- future{//redis call}
            r3 <- future{//memcache call}
          }