【问题标题】:How do you handle multiple execution contexts for mysql, redis and memcache?如何处理 mysql、redis 和 memcache 的多个执行上下文?
【发布时间】:2014-05-03 19:22:23
【问题描述】:

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

在一个动作中我需要做以下事情:

  1. 使用 slick 对 mysql 进行 db 调用
  2. 进行 redis 调用
  3. 进行内存缓存调用

假设我的操作看起来像这样,我有 3 个不同的执行上下文,请纠正我的错误:

def userProfile = Action.async {
  Future {
    // db
  }(Contexts.myDbEC)

  Future {
    // redis calls
  }(Contexts.myRedisEC)

  Future {
    // memcache calls
  }(Contexts.myMemcacheEC)

}
  1. 在这种情况下我必须使用 Action.asynch 是否正确?这是为什么呢?
  2. 如果我需要一个执行上下文与另一个执行上下文的结果,我将如何处理?
  3. 当 Future 代码在块中执行时,我将如何组合结果,我是否必须在未来调用之外定义我的变量,或者有没有办法获得返回值?

【问题讨论】:

    标签: scala playframework


    【解决方案1】:

    Action.async 的使用是正确的,如果你想让你的 Action 异步,那么它应该返回 a Future。

    对于您的第二个问题,假设您想检索一个未来的结果并与另一个未来相结合? - 您可以使用 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}
              }
    

    【讨论】:

    • 嗨 Vikas,谢谢,但我想说的是 future2 取决于 future1 的结果,我该怎么做? (请保留您的代码示例并创建另一个示例,因为我也喜欢您目前所拥有的)谢谢!
    • 如果future 2 依赖于future1 那么你想按上面的第二个sn-p 所示顺序运行你的futures。我是否正确理解了您的问题?
    • 所以要得到future1的响应,我会这样做:val resp1 = for{ r1 &lt;- future { ... } },然后我的其他电话的结果是 resp1 对吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    相关资源
    最近更新 更多