Rozwijam aplikację backendową napisaną w java & micronaut.
Aktualnie aplikacja łączy się do bazy danych redis, wystawia api po websocketach.
Aplikacja używa podejścia reaktywnego (mono, flux etc).
Jest wymaganie aby aplikacja łączyła się do 2 baz jednocześnie ta druga jest docelową, na która migrujemy,
pierwsza deprecated docelowo do odłączenia.
Każde żądanie do aplikacji pobiera ileś tam wiadomości z bazy można określić ile np. 50.
Teraz trzeba tak obsłużyć taki request aby 25 było obsłużone z bazy pierwszej a 25 z nowej bazy.
Pytanie jak podejść do zaimplementowania takiego mechanizmu?
Codebase jest spory nie chciałem w każdej klasie "wstrzykiwać" 2 klientów do bazy i powtarzać
warunku czy użyć klienta do pierwszej bazy czy do drugiej.
Jednym z pomysłów na jaki wpadłem to przeszukanie miejsc w kodzie gdzieś nisko w hierarchii
gdzie używany jest RedisClient
i zamianę tego na coś w stylu RedisClientSupplier
,
który miałby metodę Mono<RedisClient> get()
i wyciągał by z kontekstu czy działamy w trybie nowej czy starej bazy.
@Singleton
public class RedisClientSupplier {
private final RedisClient redisClientOld;
private final RedisClient redisClientNew;
public RedisClientSupplier(@Named("old") RedisClient redisClientOld, @Named("new") RedisClient redisClientNew) {
this.redisClientOld = redisClientOld;
this.redisClientNew = redisClientNew;
}
public Mono<RedisClient> get() {
return Mono.deferContextual(ctx -> ctx.get("mode") == RedisConnectionMode.OLD
? Mono.just(redisClientOld) : Mono.just(redisClientNew));
}
}
Natomiast nie jestem pewny tego rozwiązania zwłaszcza, że na razie nie działa, kontekst niepoprawnie się propaguje.
Poza tym są miejsca w kodzie gdzie podczas tworzenia beana już następuję nawiązywanie połączenia do bazy
co zmusiłoby do rozmnożenia kolejnego beana na 2 jeden dla jednej bazy a drugi dla drugiej.