预测IO请求挂起
问题描述:
我试图查询部署PredictionIO发动机类似如下:预测IO请求挂起
curl --max-time 2000 --connect-timeout 60 -H "Content-Type: application/json" \
-d '{
"ids": [
"AAAAAAAA-9999-4444-ACAC-18181818181818"
],
"other": "value"
}' \
但我只收到以下:
服务器无法产生及时回复您的请求
我知道这意味着请求正在被Spray接收(这是一个Spray超时消息),但由于某种原因无论request-timeout
多长时间,它都不会完成。
我的日志表明predict
方法永远不会被调用,这表明PredictionIO请求处理程序逻辑中有某些东西卡住了。
答
这确实是一个请求处理程序逻辑的问题,特别是对我的Query
类的查询反序列化。 There is a known json4s defect,它可以防止Query
类的泛型类型被反序列化。下面将产生一个死循环:
object User {
type Id = Int
}
case class Query(ids: Seq[User.Id], other: String)
// This will never complete
org.json4s.jackson.Serialization.write(Query(Seq(1,2,3), "Hello World"))
删除类型别名User.Id
与Int
取代它会解决这个问题。
case class Query(ids: Seq[Int], other: String)
org.json4s.jackson.Serialization.write(Query(Seq(1,2,3), "Hello World"))
res0: String = {"users":[1,2,3],"other":"Hello World"}