Si noti che anche con le API client (Java, Node.js) non è sempre ovvio o esplicito al livello dell'API della lingua che potrebbe causare la creazione di una sessione. La creazione esplicita di transazioni multiistruzione definately lo farà, ma anche altre operazioni potrebbero farlo. Se si utilizza la stessa connessione per l'interfaccia utente (browser) e l'API (REST o XCC), è probabile che l'app del browser esegua operazioni che creano lo stato della sessione.
La configurazione più sicura, ma meno flessibile è "TCP Session Affinity". Se sono supportati elimineranno la maggior parte delle preoccupazioni relative al bilanciamento del carico. Cookie Session Affinity si basa sulla garanzia che il load balencer utilizzi il cookie corretto. Non tutto il codice è uguale. Ho avuto casi in cui il bilanciamento del carico non utilizzava sempre il cookie fornito. La modifica della configurazione in "Affinità cookie fornita da Load Balancer" ha risolto questo problema.
Nessuno di questi è necessario se tutte le comunicazioni sono stateless sul livello TCP, sul livello HTTP e sul livello dell'app. Il successivo non può essere dedotto dal server. Un altro conern è se l'app o il livello intermedio è in co-residenza con altre app o la stessa app che si connette allo stesso bilanciamento del carico e alla stessa porta. Può essere difficile accertarsi che non ci siano "fili incrociati". Quando ML riceve una richiesta, associa la sua identità con l'IP e la porta del client. Anche senza load balencer, la maggior parte delle moderne librerie client HTTP e TCP implementano il caching del socket. Una grande vittoria della perfomrance, ma una fonte nascosta di sottili errori casuali casuali se la libreria o l'app condividono "cookie jar" (non insoliti). Una cache TCP e Cookie Jar utilizzata da diversi contesti applicativi può finire per inviare informazioni di stato da un'app non correlata nello stesso processo a un'altra. Principalmente si tratta di server di applicazioni di medio livello che possono semplicemente passare richieste dal primo livello senza conoscenza del dominio, presumendo che fare affidamento sulle librerie TCP di basso livello per "fare la cosa giusta" ... Stanno facendo la cosa giusta - per il caso d'uso che i programmatori di biblioteca avevano in mente - non dare per scontato che il tuo caso sia quello assunto dagli autori della biblioteca.I sintomi tendono ad essere molto rari, ma i problemi catastrofici con errori di transazione e possibilmente corruzione dei dati e problemi di sicurezza (a livello di applicazione) perché il server non può dire la differenza tra 2 connessioni dallo stesso livello intermedio.
A volte una strategia migliore consiste nel bilanciamento del carico tra il primo livello e il livello intermedio e connettersi direttamente dal livello intermedio a MarkLogic. Specialmente se la memorizzazione nella cache è eseguita nel servizio di bilanciamento del carico. È più comune che la memorizzazione nella cache sia utile tra il livello intermedio e il client, quindi il livello intermedio e il server. Ciò è anche più analogo alla classica architettura a 3 livelli utilizzata con RDBMS ... dove il bilanciamento del carico è tra client e livelli di logica aziendale non tra business logic e database.
Thx è stato davvero utile :-) –