预测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.IdInt取代它会解决这个问题。

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"}