Z těchto cached listů jsou pak round-robin algoritmem obsluhována všechna další čtení initial contextu. Pokud je některá z adres uložených v cached listu nedostupná, je z listu odstraněna. Address list je z DNS znovu opětovně načten jedině tehdy, když nebude dostupná žádná z adres v něm, tedy bude-li prázdný.
Tak to popisuje Oraclí dokumentace třeba zde:
To až donedávna nepředstavovalo žádný problém. Ale s příchodem cloudu/dynamických clusterů a dynamickým spouštěním instancí v clusteru jsou do něj často ad hoc přidávány a odebírány instance, a v souladu s těmito operacemi dochází ke změnám v DNS. Tyto nové adresy však zdrojový cluster nenačítá, neví o nich a používá nadále jen ty instance, které už v cílovém clusteru "znal". Když je tedy postupem času v cílovém clusteru většina serverů odstavena a časem znovu spuštěna, dochází ke koncetraci requestů na stále menší množství cílových serverů, až nakonec jdou všechny requesty jen na jediný server, tedy N/1. O ostatních cílových serverech, které byly mezitím spuštěny nebo restartovány, totiž zdrojový cluster neví, neboť o nich nemá žádné záznamy v cached listu .
Aktualizace/obnova DNS cache, která načte adresy "nových" serverů cílového clusteru, je provedena až po zastavení posledního cílového serveru, jehož adresa byla předtím v cache uložena.
Je tedy zapotřebí, abychom na zdrojovém clusteru mohli periodicky obnovovat data z DNS cache a předešli výše popsaným bottleneckům. V dokumentaci Weblogicu ale žádný takový parametr nenajdete, nicméně naštěstí existuje. Je to nedokumentovaná interní JNDI property, vytvořená před pár lety přesně k tomuto účelu.
Při vytváření initial contextu tedy přidáme tuto propertu, která se jmenuje weblogic.jndi.forceResolveDNSName, nastavenou na true.
Také je zapotřebí zakázat DNS caching na úrovni JVM.
Použití v kódu pak může vypadat třeba následovně:
Hashtable ht = new Hashtable();ht.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");…ht.put(“weblogic.jndi.forceResolveDNSName”, "true");
Context ctx = new InitialContext(ht);
Žádné komentáře:
Okomentovat