我正在使用一个Akka演员连接到其中一个Twitter流媒体API,然后将每个推文的处理方式固定到另一个演员处理。
我偶尔会看到Twitter关闭HTTP连接的错误 - 这样做的原因是因为有时我认为我的连接是从流中读取数据太慢
Twitter将关闭流媒体连接,原因如下:
如果从流中读取的推文的速率突然下降,则连接 将被关闭。
客户端读取数据的速度太慢。 每个流连接都由要发送到客户端的消息队列支持。 如果此队列随着时间的推移变得太大,则连接将是 闭合。
这是我的堆栈跟踪:
[WARN] [08/23/2014 17:04:43.104] [default-akka.actor.default-dispatcher-3] [akka://default/user/IO-HTTP/host-connector-0/0] Aborted in response to POST request to /1.1/statuses/filter.json with no retries left, dispatching error...
spray.can.Http$ConnectionException: Aborted
at spray.can.client.HttpHostConnectionSlot.reportDisconnection(HttpHostConnectionSlot.scala:215)
at spray.can.client.HttpHostConnectionSlot$$anonfun$connected$1.applyOrElse(HttpHostConnectionSlot.scala:163)
at akka.actor.ActorCell.receiveMessage(ActorCell.scala:498)
at akka.actor.ActorCell.receiveMessage_aroundBody0(ActorCell.scala:456)
at akka.actor.ActorCell$AjcClosure1.run(ActorCell.scala:1)
at org.eigengo.monitor.agent.akka.ActorCellMonitoringAspect.ajc$around$org_eigengo_monitor_agent_akka_ActorCellMonitoringAspect$1$5ea23d46proceed(ActorCellMonitoringAspect.aj:72)
at org.eigengo.monitor.agent.akka.ActorCellMonitoringAspect.ajc$around$org_eigengo_monitor_agent_akka_ActorCellMonitoringAspect$1$5ea23d46(ActorCellMonitoringAspect.aj:95)
at akka.actor.ActorCell.invoke(ActorCell.scala:456)
at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:237)
at akka.dispatch.Mailbox.run(Mailbox.scala:219)
at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:386)
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
我想知道如何处理关闭连接的情况?我猜一个主管演员在关闭时重新启动流阅读演员可能是我最好的选择。
我想知道的是,我的流阅读演员是否有办法分割负载或让多个演员处理相同的数据流?
如何确定我的演员系统是否足够快以满足需求?