Я пытаюсь использовать кэш для ведения списка маршрутизируемых серверов в зависимости от типа запроса.
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
будет добавленным ключом.
Если у меня был доступ кнабор кандидатов на выселение: когда поступает запрос, если его тип отсутствует в кеше, а кэш заполнен, я могу выбрать элемент из набора для выселения и закрыть его сервер, а затем синхронно добавить тип запроса в кэшà la Akka.
Есть ли способ получить доступ к списку кандидатов на выселение в кофеине?Если нет, есть ли другой способ обойти эту проблему, которая устраняет ее?