Nel progetto che sto seguendo adesso in ambito Azure Cloud con il team abbiamo adottatato come soluzione di persistenza Azure Cosmos DB for MongoDB. Per velocizzare gli sviluppi abbiamo integrato Spring, in particolare spring-boot-starter-data-mongodb, per poter utilizzare agevolmente i MongoRepositories e non doverci preoccupare degli strati più bassi dell’applicativo. Tutto figo, scrittura che va senza problemi, fino a quando non decidiamo di fare anche operazioni di lettura e ci scontriamo con questa eccezione oscura:
Caused by: com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting for a server that matches ReadPreferenceServerSelector { readPreference= ReadPreference {name=secondary, hedgeOptions=null}}. Client view of cluster state is {type=REPLICA_SET, servers=[{address=*, type=REPLICA_SET_PRIMARY, TagSet{[Tag{name='region', value=''}]}, roundTripTime=199.7 ms, state=CONNECTED}
Tutto quello che si trova in rete non ci permette di risolvere perchè non va, fino a quando non rivedo la configurazione adottata con Spring
1 2 3 4 5 6 |
@Override protected void configureClientSettings(MongoClientSettings.Builder builder) { builder .applyConnectionString(new ConnectionString(mongoUri)) .readPreference(ReadPreference.secondary()); } |
E qui finalmente si svela l’arcano. Essendo un cosmosdb configurato per il dev per limitare i costi non abbiamo attivato la read replica, mentre da nella configurazione avevamo specificato di leggere il secondario che non era stato attivato. L’eccezione non proprio parlante non ci ha permesso di individuare subito, ma per risolvere agevolmente è stato sufficiente cambiare la configurazione in questo modo
1 2 3 4 5 6 |
@Override protected void configureClientSettings(MongoClientSettings.Builder builder) { builder .applyConnectionString(new ConnectionString(mongoUri)) .readPreference(ReadPreference.primary()); } |