Предполагается, что вы используете кэш из этого примера: https://doc.akka.io/docs/akka-http/current/common/caching.html.
import akka.http.caching.scaladsl.Cache
import akka.http.caching.scaladsl.CachingSettings
import akka.http.caching.LfuCache
import akka.http.scaladsl.server.RequestContext
import akka.http.scaladsl.server.RouteResult
import akka.http.scaladsl.model.Uri
import akka.http.scaladsl.server.directives.CachingDirectives._
import scala.concurrent.duration._
// Use the request's URI as the cache's key
val keyerFunction: PartialFunction[RequestContext, Uri] = {
case r: RequestContext => r.request.uri
}
val defaultCachingSettings = CachingSettings(system)
val lfuCacheSettings =
defaultCachingSettings.lfuCacheSettings
.withInitialCapacity(25)
.withMaxCapacity(50)
.withTimeToLive(20.seconds)
.withTimeToIdle(10.seconds)
val cachingSettings =
defaultCachingSettings.withLfuCacheSettings(lfuCacheSettings)
val lfuCache: Cache[Uri, RouteResult] = LfuCache(cachingSettings)
// Create the route
val route = cache(lfuCache, keyerFunction)(innerRoute)
Ваше фоновое задание должно быть запланировано для обновления lfuCache
. Вот интерфейс этого класса кэша, который вы можете использовать: https://doc.akka.io/api/akka-http/10.1.10/akka/http/caching/scaladsl/Cache.html.
Интересующие методы:
abstract def get(key: K): Option[Future[V]]
// Retrieves the future instance that is currently in the cache for the given key.
abstract def getOrLoad(key: K, loadValue: (K) ⇒ Future[V]): Future[V]
// Returns either the cached Future for the given key,
// or applies the given value loading function on the key, producing a Future[V].
abstract def put(key: K, mayBeValue: Future[V])
(implicit ex: ExecutionContext): Future[V]
// Cache the given future if not cached previously.
Это интерфейс планировщика, который вы можете использовать:
https://doc.akka.io/docs/akka/current/scheduler.html
val cancellable =
system.scheduler.schedule(0 milliseconds, 5 seconds, ...)
Ваш планировщик будет вызывать lfuCache.put(...)
каждые n секунд и обновлять кэш.
Затем ваш код может следовать одному из следующих шаблонов:
- Используйте кэшированный маршрут, как вы уже делаете с:
val route = cache(lfuCache, keyerFunction)(...
. - Или просто позвоните
lfuCache.get(key)
или lfuCache.getOrLoad(...)
без использования директив кэширования dsl (без этого: cache(lfuCache,...
).
Если вы используете класс Cache
непосредственно для ввода и извлечения значений, рассмотрите возможность использования более простых ключей вместо URI
значений.