Table of Contents

Constructor DistributedLock

Namespace
UsluzionicaServer.Infrastructure.Redis
Assembly
UsluzionicaServer.dll

DistributedLock(RedisConnection, ILogger<DistributedLock>)

Distribuirani lock — obezbeđuje da posao izvrši TAČNO JEDNA instanca.

Zašto je potreban: BackgroundService se pokreće u svakom procesu. Sa dve instance API-ja, BoostExpiryService bi u istom trenutku na obe krenuo da oduzima BoostScore istim oglasima — pa bi svaki oglas bio umanjen dvaput. MessageCleanupService bi dvaput brisao (bezopasno) ali bi i dvaput logovao i dvaput opteretio bazu.

Mehanizam je Redis SET key value NX PX ttl: NX → upiši SAMO ako ključ ne postoji (atomično, na strani Redis-a) PX → automatski istekni posle ttl milisekundi

TTL je ono što ovo čini bezbednim. Ako instanca koja drži lock pukne ili joj neko povuče struju, lock se sam oslobodi posle TTL-a. Bez TTL-a bi jedan pad zauvek zaustavio taj posao na celom klasteru.

TTL zato mora biti DUŽI od najdužeg očekivanog trajanja posla. Ako posao traje duže, drugi ga preuzme dok prvi još radi — i vraćamo se na problem koji smo rešavali.

public DistributedLock(RedisConnection redis, ILogger<DistributedLock> logger)

Parameters

redis RedisConnection
logger ILogger<DistributedLock>