2017-08-10 55 views
1

在使用我們的中心RavenDb遇到大量中斷後,我們正在尋找在Azure Blob存儲中緩存某些對象。 Redis沒有與ABS相同的SLA保證,因此Redis已被排除從Azure Blob存儲中反序列化對象的最快方法?

這些對象的檢索和反序列化每分鐘都會發生,並且需要非常快地發生。

這是我們試圖用來反序列化的代碼,但它比從Raven中檢索對象要慢5-6倍。無論如何要優化它?目標大小約爲8mb

var blob = container.GetBlockBlobReference(entityId + ".json"); 

var serializer = new JsonSerializer 
{ 
    ObjectCreationHandling = ObjectCreationHandling.Reuse, 
    NullValueHandling = NullValueHandling.Include, 
    ReferenceLoopHandling = ReferenceLoopHandling.Serialize, 
    PreserveReferencesHandling = PreserveReferencesHandling.All, 
    TypeNameAssemblyFormat = FormatterAssemblyStyle.Full, 
    TypeNameHandling = TypeNameHandling.All 
}; 

using (var stream = new MemoryStream()) 
{ 
    blob.DownloadToStream(stream); 
    stream.Position = 0; 

    using (var sr = new StreamReader(stream)) 
    using (var jsonTextReader = new JsonTextReader(sr)) 
    { 
     var accountOut = serializer.Deserialize<Account>(jsonTextReader); 
    } 
} 
+0

您是否確定什麼是5-6倍慢?是否是反序列化的東西?如果是這樣,你如何與Raven進行反序列化? (我不知道它是什麼)還是它'GetBlockBlobReference'?如果是這樣,我恐怕沒有什麼可以用ABS做。可能會切換爲Azure SQL數據庫? – fharreau

+0

最快的方法應該是用BinaryFormatter存儲和讀取二進制數據,或者你自己做。 – user743414

+0

@fharreau我不知道是什麼導致5-6倍的差異,但我認爲這是關於序列化。但是,RavenDb在內部將其對象存儲爲JSON。 GetBlockBlobReference不調用Azure,只是創建一個內存中的對象 – Igorek

回答

0

事實證明,使用單個序列化器對象,無需在循環的每個循環中重新創建,都可以解決問題。有一次,我們開始緩存JsonSerializer對象並重新使用它,Blob存儲的反序列化性能成爲RavenDb的50%。

+0

一個想法 - 序列化,還應該考慮內存成本,非常頻繁的序列化會導致更多的GC循環 – Michael

0

想要速度並且無法使用Redis(無論出於何種原因)?只有一個正確答案:CosmosDB

速度非常快,它由SSD存儲支持。 單個區域內99.99%的可用性(如果需要,只需點擊Portal UI即可實現地理複製)。

+0

我的印象是CosmosDb對每個對象的限制爲2mb? – Igorek

+0

是的,你是對的 - https://docs.microsoft.com/en-us/azure/cosmos-db/documentdb-resources#documents也許你可以在語義上拆分這些JSON?愚蠢的建議,我知道。你爲什麼放棄Redis? Premium級別具有主/從節點和持久性(RDB)。 – evilSnobu