加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在Scala和第三方Java库中使用Akka的最佳做法

发布时间:2020-12-16 09:17:59 所属栏目:安全 来源:网络整理
导读:我需要在我的 Scala / Akka代码中使用 memcached Java API.此API为您提供了同步和异步方法.异步的返回 java.util.concurrent.Future.这里有一个关于在Scala中处理Java Futures How do I wrap a java.util.concurrent.Future in an Akka Future?的问题.但是在
我需要在我的 Scala / Akka代码中使用 memcached Java API.此API为您提供了同步和异步方法.异步的返回 java.util.concurrent.Future.这里有一个关于在Scala中处理Java Futures How do I wrap a java.util.concurrent.Future in an Akka Future?的问题.但是在我的情况下,我有两个选择:

>将来使用同步API并封装阻止代码并标记阻塞:

Future {
  blocking {
    cache.get(key) //synchronous blocking call
  } 
}

>使用异步Java API,并在Java Future上每ms进行轮询,以检查未来是否完成(如上面链接的上述答案中所述).

哪一个更好?我倾向于第一个选择,因为投票可以显着影响响应时间.不应阻止{}阻止阻止整个池?

解决方法

我总是和第一个选择一起去.但是我以一种稍微不同的方式来做.我不使用阻止功能. (实际上我还没有想过).而是我为包含同步阻止调用的未来提供了一个自定义执行上下文.所以看起来基本上是这样的:

val ecForBlockingMemcachedStuff = ExecutionContext.fromExecutorService(Executors.newFixedThreadPool(100)) // whatever number you think is appropriate
// i create a separate ec for each blocking client/resource/api i use

Future {
    cache.get(key) //synchronous blocking call
}(ecForBlockingMemcachedStuff) // or mark the execution context implicit. I like to mention it explicitly.

所以所有的阻塞调用将使用专用的执行上下文(= Threadpool).所以它与您的主要执行上下文分开负责非阻塞的东西.

这种方法也在Typesafe提供的online training video for Play/Akka中解释.第4课有一个关于如何处理阻塞呼叫的视频.这是由Nilanjan Raychaudhuri解释(希望我拼写正确),谁是斯卡拉书的知名作家.

更新:我有一个discussion with Nilanjan on twitter.他解释了阻止和自定义ExecutionContext方法之间的区别.阻塞功能只创建一个特殊的ExecutionContext.它提供了一个天真的方法来解决您需要多少线程的问题.每当池中所有其他现有线程都忙时,它会产生一个新的线程.所以实际上是一个不受控制的ExecutionContext.它可能会产生很多线程,并导致诸如内存不足错误之类的问题.因此,具有自定义执行上下文的解决方案实际上更好,因为它使这个问题显而易见. Nilanjan还补充说,您需要考虑电路断路,这种情况下,这个池被请求重载.

TLDR:是的,阻止电话吸.使用自定义/专用的ExecutionContext来阻止调用.还要考虑断路.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读