aggiornato per riflettere le ultime modifiche al servizio (2017/01/22): DocumentDB garanzie p99 lettura di latenza < 10 ms e p99 latenza di scrittura < 15 ms con SLA sul lato del database. I suggerimenti di seguito si applicano ancora per ottenere una bassa latenza legge utilizzando gli SDK **
Aggiornato per riflettere ultime modifiche di servizio (6/14/2016): Non c'è alcuna necessità di memorizzare nella cache auto-link quando si utilizza l'instradamento via dall'utente ID definiti. Aggiunti anche alcuni altri suggerimenti. **
Le letture in genere richiedono < 1 ms sulla partizione di archiviazione di DocumentDB stessa; e il collo di bottiglia è spesso la latenza di rete tra l'applicazione e il database. Pertanto, è meglio avere l'applicazione in esecuzione nello stesso datacenter del database.
Ecco alcuni suggerimenti generali sull'utilizzo SDK:
Tip # 1: utilizzare un Singleton cliente DocumentDB per tutta la durata della vostra applicazione
Nota che ogni istanza DocumentClient è thread-safe ed esegue efficiente gestione delle connessioni e memorizzazione nella cache degli indirizzi durante il funzionamento in modalità diretta. Per consentire una gestione efficiente delle connessioni e prestazioni migliori di DocumentClient, si consiglia di utilizzare una singola istanza di DocumentClient per AppDomain per la durata dell'applicazione.
Tip # 2: Scheda Cache e SelfLinks di raccolta per i più bassa latenza leggono
In Azure DocumentDB, questo documento ha un selfLink generato dal sistema. Questi collegamenti automatici sono garantiti come unici e immutabili per la durata del documento. Leggere un singolo documento usando un collegamento automatico è il modo più efficiente per ottenere un singolo documento. A causa dell'immutabilità di SelfLink, è opportuno memorizzare nella cache i collegamenti automatici laddove possibile per ottenere prestazioni di lettura ottimali.
Detto questo, potrebbe non essere sempre possibile per l'applicazione utilizzare l'autolink di un documento per gli scenari di lettura; in questo caso, il prossimo modo più efficiente per recuperare un documento è eseguire una query in base alla proprietà Id fornita dall'utente del documento. Per esempio:
IDocumentQuery<Document> query = (from doc in client.CreateDocumentQuery(colSelfLink) where doc.Id == "myId" select document).AsDocumentQuery();
Document myDocument = null;
while (query.HasMoreResults)
{
FeedResponse<Document> res = await query.ExecuteNextAsync<Document>();
if (res.Count != 0) {
myDocument = res.Single();
break;
}
}
Tip # 3: Tune dimensione della pagina per le query/leggere i feed per migliorare le prestazioni
quando si esegue una lettura di massa di documenti che utilizzano la funzionalità di alimentazione leggere (cioè ReadDocumentFeedAsync) o quando si esegue una query SQL DocumentDB, i risultati vengono restituiti in modo segmentato se il set di risultati è troppo grande. Per impostazione predefinita, i risultati vengono restituiti in blocchi di 100 elementi o 1 MB, a seconda di quale limite viene raggiunto per primo.
Per ridurre il numero di round trip della rete necessari per recuperare tutti i risultati applicabili, è possibile aumentare le dimensioni della pagina utilizzando l'intestazione della richiesta x-ms-max-item-count fino a 1000. Nei casi in cui è necessario visualizzare solo alcuni risultati, ad esempio, se l'interfaccia utente o l'API dell'applicazione restituisce solo dieci risultati alla volta, è inoltre possibile ridurre la dimensione della pagina a 10 per ridurre il throughput utilizzato per le letture e le query.
È inoltre possibile impostare le dimensioni della pagina utilizzando gli SDK DocumentDB disponibili. Per esempio:
IQueryable<dynamic> authorResults =
client.CreateDocumentQuery(documentCollection.SelfLink, "SELECT p.Author FROM Pages p WHERE p.Title = 'About Seattle'", new FeedOptions { MaxItemCount = 1000 });
Alcuni ulteriori suggerimenti (6/14/2016):
- Usa punto-legge (ad esempio, leggere il documento, invece di documento query) per la ricerca per ID
- Configurare il client DocumentDB (utilizzando ConnectionPolicy) per utilizzare la connettività diretta sul gateway
- Collocare i client nella stessa area di Azure del database
- Chiamare op enAsync() per evitare alti prima latenza chiamata
- È possibile eseguire il debug di query LINQ chiamando ToString() sul interrogabile per vedere la query SQL inviati attraverso il filo
Per ulteriori suggerimenti di prestazioni, controlla questo blog post.
Hai provato a eseguire il codice nello stesso centro dati dell'istanza di DocumentDB? Sono molto deluso nell'eseguire le operazioni dal mio sistema su una connessione internet veloce (minimo di 250 ms per anche una sola operazione), ma la latenza è inferiore a 10 ms quando corro nello stesso centro dati. Se non si desidera eseguire l'esperimento per spingerlo nel data center, quindi provare una query con 10 volte la quantità di dati. Il mio sospetto è che vedrete solo numeri leggermente aumentati. Se è così, questo ti darebbe la prova che è la latenza di chiamarlo al di fuori del data center. –
Penso che si debba fare in modo che l'attraversamento del confine del data center sia troppo costoso dal punto di vista della latenza. Il tempo di ping sulla mia connessione internet è solo di 50-70 ms. Anche il raddoppio non spiega una latenza minima di 250 ms. –
Posso dire questo: il recupero di 31 righe da un server SQL (Azure) nello stesso centro dati è molto più veloce di questo. Anche quando le righe hanno più dati rispetto agli oggetti recuperati da DocumentDB. –