我正在尝试使用缓存来维护基于请求类型的可路由服务器列表。
LoadingCache<Request, ActorRef> serversByRequestType = Caffeine.newBuilder()
.writer(new CacheWriter<RequestType, ActorRef>() {
@Override public void write(RequestType req, ActorRef server) {
// We need to handle this type of request now.
//
server.tell(StartUp(req))
}
@Override public void delete(RequestType req, ActorRef server, RemovalCause cause) {
// This req type can no longer be handled, so remove from
// routable servers.
//
server.tell(ShutDown(req))
}
})
.build();
在我只能n
启动服务器的情况下,重要的是同步从缓存中删除(并因此关闭)服务器,然后在缓存中添加(并因此启动)同一服务器(即,改变服务器可以处理的流量)。
在上面的代码中,没有阻塞就没有办法做到这一点。
在一个理想的世界中,删除必须在添加到缓存之前发生,所以我可以异步关闭服务器并等待一个ShutdownServer
事件......但是没有办法从方法中接收这个信号write
,这必然需要知道什么时候开始。换句话说,我想发送一个SwitchServerTraffic(from: RequestType, to: RequestType)
到server
,其中from
将是被驱逐的密钥,to
将是添加的密钥。
如果我可以访问候选驱逐集:当请求进来时,如果它的类型不在缓存中并且缓存已满,我可以从驱逐集中选择一个元素并关闭其服务器,然后添加请求像 Akka 一样同步输入缓存。
有没有办法访问 Caffeine 中的候选驱逐集?如果没有,是否有另一种方法来解决这个问题?