/DocumentDB aşağıdaki yapıya sahip bir belge upserting: Varsayılan dizini kullanılırkenAzure DocumentDB - Ek Dizin Oluşturma ile Ekleme İçin Ücretlendirme Talebi Geliştirilebilir mi? Ben ekleme am
bu biçimin bir belge upserting talebi ücret 10.67 RU'de olduğunu. Bu beklediğimden daha yüksek görünüyor, bu yüzden optimize etmeye çalışıyorum.
bu makalede performans ipuçları okuduktan sonra:https://azure.microsoft.com/en-us/blog/performance-tips-for-azure-documentdb-part-2/
Ben Lazy için Toplama İndeksleme Policy dergisinden Dizin Modu değiştirdi. Talep ücretinin önemli ölçüde daha az olmasını bekledim, ancak yalnızca 9.9 RU'ya düştü.
Dışlanmış Yollara bir grup özellik eklemek için İndeksleme Politikasını tekrar değiştirdim. Burada, özel İndeksleme Koşulu: Dışlanan Yollar bir Upsert için RUs üzerinde hiçbir etkiye sahip ekleme
- bu 9.9 kalmıştır.
Yanlış bir şey yapıyorum? Ve bu belge yapısı için daha az RU tükettikleri için zorluk çıkarmak mümkün mü?
Düzenleme: İşte
Ben kurma ve DocumentDB bağlantıyı önbelleğe için kullandığımız bir yardımcı sınıftır: Burada
public class Documents
{
public static Documents Instance = new Documents();
public IReliableReadWriteDocumentClient Client { get; private set; }
private Documents()
{
var endpointUrl = ConfigurationManager.AppSettings["Microsoft.Azure.DocumentDb.EndpointUrl"];
var authKey = ConfigurationManager.AppSettings["Microsoft.Azure.DocumentDb.AuthorizationKey"];
var min = TimeSpan.FromMilliseconds(1000);
var max = TimeSpan.FromMilliseconds(5000);
var delta = TimeSpan.FromMilliseconds(1000);
var connectionPolicy = new ConnectionPolicy()
{
ConnectionMode = ConnectionMode.Direct,
ConnectionProtocol = Protocol.Tcp
};
var client = new DocumentClient(new Uri(endpointUrl), authKey, connectionPolicy).AsReliable(new ExponentialBackoff(3, min, max, delta));
Task result = client.OpenAsync();
result.Wait();
Client = client;
}
}
Ve Web API sınıfında koyun işleyicisi kodudur :
public class InstallationController : ApiController
{
private IReliableReadWriteDocumentClient docdb;
private string docdbUri;
public InstallationController()
{
docdb = Documents.Instance.Client;
var databaseId = ConfigurationManager.AppSettings["Microsoft.Azure.DocumentDb.DatabaseId"];
var collectionName = ConfigurationManager.AppSettings["Microsoft.Azure.DocumentDb.CollectionName"];
docdbUri = "dbs/" + databaseId + "/colls/" + collectionName;
}
// PUT api/installation/<installationId>
// This creates or updates an installation
public async Task<IHttpActionResult> Put(string id, DeviceInstallation deviceUpdate)
{
string message;
var telemetryClient = new TelemetryClient();
if (id != deviceUpdate.Id)
{
return BadRequest();
}
// Code to check for existing record with same APNS Token omitted for clarity
var upsertResponse = await docdb.UpsertDocumentAsync(docdbUri, deviceUpdate);
requestCharge = upsertResponse.RequestCharge;
message = string.Format("Request charge for installation upsert: {0}", requestCharge);
telemetryClient.TrackTrace(message);
// Code to save installation to notification hub omitted for clarity
return Ok();
}
}
Geçerli mesajınızın içeriği göz önüne alındığında, lütfen C# kodunuzu ekleyebilir misiniz? Genel olarak, önbellekleme koleksiyonunun _selfLink_'ın bana önemli bir performans artışı verdiğini buldum. –
@IngeHenriksen Artık kimliğe (veya bir dize olan) kimlik doğrulamasıyla (veya bu tür kimliklerin toplama selflink'i gibi alınabilmesi için veritabanıyla ilgili sorgular) artık kendiliğinden bağlantılara gerek yoktur. Ve bunun bir sorgunun RU maliyeti ile ilgisi yoktur. –
@IngeHenriksen - İstediğiniz kodu ekledim. –