Scala Akka—配置使用RESTAPI服务的参与者的最佳方法(阻塞操作)

Scala Akka—配置使用RESTAPI服务的参与者的最佳方法(阻塞操作),scala,concurrency,parallel-processing,akka,Scala,Concurrency,Parallel Processing,Akka,我有一个Akka消息引擎,可以在一天中发送数百万条短信和电子邮件。我需要引入一种新类型的消息传递(PushNotification),它包括让每个请求使用一个RESTAPI(它还将处理数百万个请求)。我相信使用Web服务是一种阻塞操作,所以从我所读到的内容来看,我需要为这个新参与者添加一个单独的调度程序,我的问题是,它是否一定需要像这里提到的那样是一个具有固定池大小的线程池执行器?(请参阅)或者是否可以改用fork-join执行器?另外,为了不影响当前的两种消息类型,最好的方法是什么?(短信和电

我有一个Akka消息引擎,可以在一天中发送数百万条短信和电子邮件。我需要引入一种新类型的消息传递(PushNotification),它包括让每个请求使用一个RESTAPI(它还将处理数百万个请求)。我相信使用Web服务是一种阻塞操作,所以从我所读到的内容来看,我需要为这个新参与者添加一个单独的调度程序,我的问题是,它是否一定需要像这里提到的那样是一个具有固定池大小的线程池执行器?(请参阅)或者是否可以改用fork-join执行器?另外,为了不影响当前的两种消息类型,最好的方法是什么?(短信和电子邮件)我的意思是,我如何避免让他们的线程池挨饿?目前,电子邮件使用单独的调度器,SMS使用默认的调度器。除了使用阻塞操作(调用WebService)为参与者创建新的调度程序之外,还有其他方法吗?比如创建一个反应式web服务

从web服务使用RESTful API不一定是阻塞的

使用参与者提供的RESTful API的一种简单方法是使用。这允许您使用
pipeTo
方法发送HTTP请求,并将结果作为消息发送回参与者

这是一个非常精简的示例(根据文档中的示例稍加修改)


您使用的是什么REST客户端?Akka Http使用相同的线程池异步工作,并与Akka Actors很好地集成。@Tim,我使用的是Jersey(com.sun.Jersey.api.client.ClientResponse),你的意思是Akka Http是被动的吗?其基本概念称为java NIO,或非阻塞IO。例如,检查底层概念称为“异步IO”,如何实现它取决于Akka Http。阻塞/非阻塞是一个不同的概念。
import akka.http.scaladsl.Http

object RestWorker {
  def props(replyTo: ActorRef): Props =
    Props(new RestWorker(replyTo))
}

class RestWorker(replyTo: ActorRef) extends Actor
{
  implicit val ec: ExecutionContext = context.system.dispatcher

  override def preStart() = {
    Http(context.system).singleRequest(HttpRequest(uri = "https://1.2.3.4/resource"))
      .pipeTo(self)
  }

  def receive = {
    case resp: HttpResponse =>

      val response = ??? // Process response

      replyTo ! response

      self ! PoisonPill
  }
}