Akka HTTP流服务器终止队列中的最后一条消息后的连接

时间:2019-02-22 16:52:23

标签: scala apache-kafka akka akka-stream akka-http

我有一个非常简单的应用程序,由坐在Akka HTTP流服务器后面的Kafka用户组成。收到请求后,服务器将为指定用户启动新使用者,并开始从队列中读取消息:

def consumer(consumerGroup: String, from: Int) = {
  val topicsAndDate = Subscriptions.assignmentOffsetsForTimes(partitions.map(_ -> (System.currentTimeMillis() - from)): _*)

  Consumer.plainSource[String, GenericRecord](consumerSettings.withGroupId(consumerGroup), topicsAndDate)
    .map(record => record.timestamp() -> messageFormat.from(record.value()))
    .map {
      //convert to json
    }
}

def routes: Route = Route.seal(
  pathSingleSlash {
    complete(HttpEntity(ContentTypes.`text/html(UTF-8)`, "Say hello to akka-http"))
  } ~
  path("stream") {
    //some logic to validate user

    log.info("Received request from {} with 'from'={}", user, from)
    complete(consumer(user, from))  
  })

startServer("0.0.0.0", 8080)

该服务运行良好,直到使用者到达队列中的最新消息为止。返回此最新消息后的60秒,每次都断开与服务器的连接。我希望保持连接状态,因为每两分钟在队列中填充更多消息。

我尝试了各种不同的配置选项,但似乎没有一个能提供理想的结果。我当前的配置如下:

akka {
  http {
    client {
      idle-timeout = 300s
    }
    server {
      idle-timeout = 600s
      linger-timeout = 15 min
    }
    host-connection-pool {
      max-retries = 30
      max-connections = 20
      max-open-requests = 32
      connecting-timeout = 60s
      client {
        idle-timeout = 300s
      }
    }
  }
}

我也尝试过使用server.websocket.periodic-keep-alive-max-idle = 1 second设置,但这似乎没有什么区别。

让我知道是否需要提供更多相关信息。

0 个答案:

没有答案