Open CarolinJaser opened 3 years ago
@startuml
start
:compute cache key for request;
if (cache has value under computed cache key?) then (yes)
:return value from cache;
else (no)
:perform request;
:save response in cache;
:return response from request;
endif
stop
@enduml
@startuml
actor user as user
participant "legacy serlo.org" as serlo
participant api.serlo.org as api
user -> serlo: Update something (taxonomy term, ...)
serlo -> api: Update cache entry "..." to "..."
serlo <- api: Done ✓
serlo -> api: Update cache entry "..." to "..."
serlo <- api: Done ✓
... updates as often as necessary ...
user <- serlo: Done ✓
@enduml
@startuml
actor user as user
box "api.serlo.org"
participant resolver as resolver
participant "data source" as datasource
database cache as cache
queue "swr queue" as queue
participant "swr worker" as worker
endbox
database service as service
== When a GraphQL query is made ==
user -> resolver: make GraphQL query
resolver -> resolver: calculate necessary ressource(s) to perform query
group for each ressource
resolver -> datasource: request ressource R
datasource -> datasource: calculate cache key K for ressource R
datasource -> cache: get value and it's age for key K
datasource <- cache: return value and it's age
datasource -> datasource: Is cache entry older than specified max age?
datasource -> queue: If yes: put cache key K on queue
resolver <- datasource: return old value from cache
end
user <- resolver: return response for GraphQL query
== In parallel: Algorithm for the SWR worker ==
group endless loop
queue <- worker: get oldest cache key and delete it
queue -> worker: cache key K
worker -> worker: calculate which request need to be done to update K
worker -> service: get current value for K
worker <- service: return current value
cache <- worker: Save current value for cache key K
end
@enduml