我正在使用twitter4j开发一个推特应用程序。基本上我允许用户创建帐户,添加他们的个人关键字,并开始自己的流。
我正在尝试使用twitter api尽可能地发挥。避免速率限制,不要反复连接相同的帐户等。所以我认为我需要做的是有一些对象,其中包含所有活动的TwitterStream对象的列表,但我不知道如何处理这个。这是启动流的控制器。
public static Result startStream(){
ObjectNode result = Json.newObject();
if (
//openStreams is a Map<Long,TwitterStream> in the TwitterListener class
TwitterListener.openStreams.containsKey(Long.parseLong(session().get("id")))
){
result.put("status", "running");
return ok(result);
}
Cache.set("twitterStream", TwitterListener.listener(
Person.find.byId(
Long.parseLong(session().get("id"))
)
)
);
result.put("status", "OK");
return ok(result);
}
正如你所看到的,我现在正把它们放在Cache中,但是我想让流保持很长一段时间,所以缓存是不够的。
为此目的构建应用程序的最合适方法是什么?
我应该使用Akka吗?
我如何实现Play的Global对象来执行此操作?
答案 0 :(得分:3)
一旦开始考虑在应用程序中引入全局状态,就必须问自己,我是否有可能想要扩展到多个节点,或者为了冗余而有多个节点?如果答案是肯定的,那么你应该使用Akka,因为Akka将允许您通过简单地引入一致的哈希路由器,轻松地使您的代码适应在Akka群集的多节点环境中工作。如果您不使用Akka,那么当需要多个节点时,您几乎必须重新设计应用程序。
所以我假设您希望将来证明您的应用程序,并解释如何使用Akka(即使您不需要多个节点,Akka也是管理全局状态的好方法)。
所以在Akka中,你想要的是一个作为流管理器的actor,如果它们本身并不存在,它将负责创建流actor。然后,流媒体将负责处理流,将流发送给订阅者,并跟踪订阅它们的连接数,并在不再有订阅者时关闭。