如何存储要在多个actor之间共享的数据?

时间:2014-10-22 21:19:55

标签: java scala akka

我是一个向外部系统发送Web服务请求的actor。为多个请求创建多个actor。需要将身份验证令牌作为请求的一部分发送。此令牌在x分钟后超时,并且当它执行时将创建新令牌。是否有一个标准机制我应该用于在演员之间共享这个标记(字符串)?

方法我考虑让主管创建令牌并将此令牌传递给子actor。但是,主管应该如何为每个演员存储相同的标记值?这个主管是否需要是一个包含令牌属性的单例,我建议使用单例,这样每次创建主管时都不会重新实例化令牌值。

我正在使用akka for java framework。

更新:如果我封装了Web服务请求并将令牌字符串存储在自己的actor中,那么这个令牌与其他actor是如何共享的?

更新2:

为了解决这个问题(在同一个Actor的多个实例之间共享数据),我建议引入一个静态变量 对演员。该变量将在actor之间共享 并且当令牌不再有效时重新初始化。

这是伪代码:

class MyActor {

    private static String userToken = "";


    @Override
    public void onReceive(Object argMessage) throws Exception {

        String response = initiateRequest(userToken);
        if(response == tokenNotValid){
            userToken = getToken();
        }
    }

    private String getToken(){

        String tokenValue = createRequestToAccessToken

        return tokenValue;
    }
}

这可能是一种不好的做法? - 通过userToken属性引入可变状态。但我认为这是一个干净的解决方案,因为所有逻辑都封装在actor中。这种方法有任何潜在的问题吗?

2 个答案:

答案 0 :(得分:4)

令牌是一种状态。它属于自己的演员 - 不是主管,而是一个独立的演员 - 当前一次演出时,它也可以负责(或让孩子负责)创建一个新的令牌。其他演员可以通过向令牌演员发送消息并获得令牌的回复来以通常的方式请求令牌。

我通常不会期望主管被重新创建 - 主管应该尽可能简单,只负责重启失败的演员。任何实际处理都应该发生在其他参与者身上,这样主管本身失败的可能性就很小。

响应您的更新:负责存储令牌字符串的actor应该负责使用它。如果在每个请求中以标准方式使用令牌,则其他actor可以将其请求发送给令牌actor,然后令牌actor可以将它们转发给实际的http actor。

如果有几种不同的使用令牌的方式,则演员可以接受针对这些不同情况的不同类型的消息。将逻辑放在需要访问的状态。

对更新2的回应:可变静态是一个可怕的想法 - 它是全局可变状态(也是分布式系统中静态的实际问题,例如类加载器问题)。您的代码具有竞争条件 - 可能两个请求将同时更新令牌;取决于另一端的服务如何响应这可能会破坏。演员模型的重点是避免这样的事情。如果您要这样做那么为什么还要使用演员呢? (这不是一个修辞问题 - 也许你的问题不需要演员?在这种情况下,你可以通过不使用它们来使你的代码更简单)。但即使您想使用非参与者方法,我也建议使用包含可变字段的单个对象(可能是静态的,但理想情况下由您的DI框架管理,或者您将应用程序整合在一起) ,而不仅仅是静态领域。

答案 1 :(得分:-1)

我认为您正在尝试解决与单点登录(SSO)相关的常见身份验证问题。根据您的目标环境,您应该能够找到标准解决方案。主管方法让我想起了Central Authentication Service。您可以检查它是否适合您,或者查看已集成在akka中的协议。