Stiamo utilizzando la funzionalità di flusso in RavenDB per caricare, trasformare e migrare i dati tra 2 database in questo modo:RavenDB Stream Risultati Unbounded - Resilienza Collegamento
var query = originSession.Query<T>(IndexForQuery);
using (var stream = originSession.Advanced.Stream(query))
{
while (stream.MoveNext())
{
var streamedDocument = stream.Current.Document;
OpenSessionAndMigrateSingleDocument(streamedDocument);
}
}
Il problema è che una delle raccolte ha milioni di righe, e continuiamo a ricevere un IOException
nel seguente formato:
Application: MigrateToNewSchema.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.IO.IOException
Stack:
at System.Net.ConnectStream.Read(Byte[], Int32, Int32)
at System.IO.Compression.DeflateStream.Read(Byte[], Int32, Int32)
at System.IO.Compression.GZipStream.Read(Byte[], Int32, Int32)
at System.IO.StreamReader.ReadBuffer(Char[], Int32, Int32, Boolean ByRef)
at System.IO.StreamReader.Read(Char[], Int32, Int32)
at Raven.Imports.Newtonsoft.Json.JsonTextReader.ReadData(Boolean, Int32)
at Raven.Imports.Newtonsoft.Json.JsonTextReader.ReadStringIntoBuffer(Char)
at Raven.Imports.Newtonsoft.Json.JsonTextReader.ParseString(Char)
at Raven.Imports.Newtonsoft.Json.JsonTextReader.ParseValue()
at Raven.Imports.Newtonsoft.Json.JsonTextReader.ReadInternal()
at Raven.Imports.Newtonsoft.Json.JsonTextReader.Read()
at Raven.Json.Linq.RavenJObject.Load(Raven.Imports.Newtonsoft.Json.JsonReader)
at Raven.Json.Linq.RavenJObject.Load(Raven.Imports.Newtonsoft.Json.JsonReader)
at Raven.Json.Linq.RavenJToken.ReadFrom(Raven.Imports.Newtonsoft.Json.JsonReader)
at Raven.Client.Connection.ServerClient+<YieldStreamResults>d__6b.MoveNext()
at Raven.Client.Document.DocumentSession+<YieldQuery>d__c`1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].MoveNext()
at MigrateToNewSchema.Migrator.DataMigratorBase`1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].MigrateCollection()
at MigrateToNewSchema.Program.MigrateData(MigrateToNewSchema.Enums.CollectionToMigrate, Raven.Client.IDocumentStore, Raven.Client.IDocumentStore)
at MigrateToNewSchema.Program.Main(System.String[])
questo accade abbastanza lontano in streaming e, naturalmente, problemi di connessione transitorie si verificheranno su questo tipo di periodo (ci vogliono ore per completare).
Tuttavia, quando riproviamo, poiché stiamo utilizzando uno Query
, dobbiamo ripartire da zero. Quindi, in definitiva, se c'è un errore di connessione durante l'intero Stream
, dobbiamo provarlo di nuovo, e di nuovo fino a quando non funziona fino alla fine.
So che è possibile utilizzare ETag
con flusso per riavviare in modo efficace in un determinato punto, tuttavia non c'è sovraccarico per fare questo con uno Query
che abbiamo bisogno di filtrare i risultati di essere migrati e specificare la raccolta corretta.
Quindi, in RavenDB, c'è un modo per migliorare la resilienza interna della connessione (proprietà stringa di connessione, impostazioni interne ecc.) O "recuperare" efficacemente un flusso su un errore?
ho scoperto [abbonamenti dati] (http://ravendb.net/docs/article-page/3.0/csharp/client-api/data- abbonamenti/sottoscrizione how-to-create-data), una funzionalità RavenDb 3.0 che fornisce un meccanismo affidabile per iterare attraverso una raccolta di documenti che soddisfano determinati criteri e che consente di riprendere facilmente da dove si era interrotto. Se qualcuno fosse disposto a mettere insieme alcuni esempi di codice che mostrano come quella caratteristica potrebbe rispondere a questa domanda, la considero degna della generosità. – StriplingWarrior
Sei legato all'utilizzo di una query? Anche se sarà più inefficiente, si tratta di una migrazione, quindi la memoria non è un problema, perché non iterare le raccolte di documenti non elaborati e filtrare in memoria, in modo che tu possa riprendere da un Etag? Questo è il modo in cui gestisco tutto lo streaming, non uso mai le query. – kamranicus
@StriplingWarrior E 'passato un po' di tempo :-) Non lavoro più per la compagnia usando RavenDB ma questo mi interessa ancora, quindi risponderò con il codice di sottoscrizione dati oggi –