游戏框架中的全局变量/跟踪开放流

时间:2014-02-16 00:01:57

标签: java playframework-2.0 twitter4j

我正在使用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对象来执行此操作?

1 个答案:

答案 0 :(得分:3)

一旦开始考虑在应用程序中引入全局状态,就必须问自己,我是否有可能想要扩展到多个节点,或者为了冗余而有多个节点?如果答案是肯定的,那么你应该使用Akka,因为Akka将允许您通过简单地引入一致的哈希路由器,轻松地使您的代码适应在Akka群集的多节点环境中工作。如果您不使用Akka,那么当需要多个节点时,您几乎必须重新设计应用程序。

所以我假设您希望将来证明您的应用程序,并解释如何使用Akka(即使您不需要多个节点,Akka也是管理全局状态的好方法)。

所以在Akka中,你想要的是一个作为流管理器的actor,如果它们本身并不存在,它将负责创建流actor。然后,流媒体将负责处理流,将流发送给订阅者,并跟踪订阅它们的连接数,并在不再有订阅者时关闭。