我有一个非常简单的应用程序,由坐在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
设置,但这似乎没有什么区别。
让我知道是否需要提供更多相关信息。