Spolehlivá serializace objektů kolekce v Azure Service Fabric
Spolehlivé kolekce replikují a uchovávají své položky, aby se ujistily, že jsou odolné napříč selháními počítačů a výpadky napájení. Pro replikaci i uchování položek je potřeba serializovat spolehlivé kolekce.
Reliable Collections získá odpovídající serializátor pro daný typ z Reliable State Manager. Reliable State Manager obsahuje integrované serializátory a umožňuje registraci vlastních serializátorů pro daný typ.
Integrované serializátory
Reliable State Manager obsahuje integrovaný serializátor pro některé běžné typy, aby je bylo možné serializovat efektivně ve výchozím nastavení. U jiných typů se Správce spolehlivého stavu vrátí zpět k použití DataContractSerializer. Předdefinované serializátory jsou efektivnější, protože znají, že jejich typy nemohou změnit a nemusí obsahovat informace o typu, jako je název jeho typu.
Reliable State Manager má integrovaný serializátor pro následující typy:
- Guid
- bool
- byte
- sbyte
- byte[]
- char
- string
- decimal
- double
- float (číslo s plovoucí řádovou čárkou)
- int
- uint
- long
- ulong
- short
- ushort
Vlastní serializace
Vlastní serializátory se běžně používají ke zvýšení výkonu nebo k šifrování dat přes drát a na disku. Kromě jiných důvodů jsou vlastní serializátory obvykle efektivnější než obecný serializátor, protože nepotřebují serializovat informace o typu.
IReliableStateManager.TryAddStateSerializer<T> se používá k registraci vlastního serializátoru pro daný typ T. Tato registrace by měla probíhat ve konstrukci StatefulServiceBase, aby se zajistilo, že před zahájením obnovení mají všechny spolehlivé kolekce přístup k příslušnému serializátoru ke čtení trvalých dat.
public StatefulBackendService(StatefulServiceContext context)
: base(context)
{
if (!this.StateManager.TryAddStateSerializer(new OrderKeySerializer()))
{
throw new InvalidOperationException("Failed to set OrderKey custom serializer");
}
}
Poznámka:
Vlastní serializátory mají přednost před integrovanými serializátory. Například při registraci vlastního serializátoru pro int se používá k serializaci celých čísel místo integrovaného serializátoru pro int.
Postup implementace vlastního serializátoru
Vlastní serializátor musí implementovat IStateSerializer<T> rozhraní.
Poznámka:
IStateSerializer<T> zahrnuje přetížení pro zápis a čtení, které přebírá další T volal základní hodnotu. Toto rozhraní API slouží k rozdílové serializaci. V současné době není funkce rozdílového serializace vystavena. Proto tyto dvě přetížení nejsou volána, dokud se rozdílové serializace nezobrazí a povolí.
Následuje příklad vlastního typu s názvem OrderKey, který obsahuje čtyři vlastnosti.
public class OrderKey : IComparable<OrderKey>, IEquatable<OrderKey>
{
public byte Warehouse { get; set; }
public short District { get; set; }
public int Customer { get; set; }
public long Order { get; set; }
#region Object Overrides for GetHashCode, CompareTo and Equals
#endregion
}
Následuje příklad implementace IStateSerializer<OrderKey>. Všimněte si, že přetížení pro čtení a zápis, která přebírají v baseValue, volají jejich odpovídající přetížení pro přesměrovávat kompatibilitu.
public class OrderKeySerializer : IStateSerializer<OrderKey>
{
OrderKey IStateSerializer<OrderKey>.Read(BinaryReader reader)
{
var value = new OrderKey();
value.Warehouse = reader.ReadByte();
value.District = reader.ReadInt16();
value.Customer = reader.ReadInt32();
value.Order = reader.ReadInt64();
return value;
}
void IStateSerializer<OrderKey>.Write(OrderKey value, BinaryWriter writer)
{
writer.Write(value.Warehouse);
writer.Write(value.District);
writer.Write(value.Customer);
writer.Write(value.Order);
}
// Read overload for differential de-serialization
OrderKey IStateSerializer<OrderKey>.Read(OrderKey baseValue, BinaryReader reader)
{
return ((IStateSerializer<OrderKey>)this).Read(reader);
}
// Write overload for differential serialization
void IStateSerializer<OrderKey>.Write(OrderKey baseValue, OrderKey newValue, BinaryWriter writer)
{
((IStateSerializer<OrderKey>)this).Write(newValue, writer);
}
}
Upgradovatelnost
Při postupném upgradu aplikace se upgrade použije na podmnožinu uzlů, jednu doménu upgradu najednou. Během tohoto procesu budou některé upgradovací domény v novější verzi aplikace a některé upgradovací domény budou ve starší verzi vaší aplikace. Během zavádění musí být nová verze aplikace schopná číst starou verzi dat a stará verze aplikace musí být schopná přečíst novou verzi dat. Pokud formát dat není dopředu a zpětně kompatibilní, upgrade může selhat nebo horší, může dojít ke ztrátě nebo poškození dat.
Pokud používáte integrovaný serializátor, nemusíte se starat o kompatibilitu. Pokud však používáte vlastní serializátor nebo DataContractSerializer, musí být data nekonečně zpětně a dopředu kompatibilní. Jinými slovy, každá verze serializátoru musí být schopna serializovat a de-serializovat libovolnou verzi typu.
Uživatelé kontraktu dat by měli dodržovat dobře definovaná pravidla správy verzí pro přidávání, odebírání a změny polí. Kontrakt dat má také podporu pro práci s neznámými poli, připojení k serializaci a deserializaci procesu a zpracování dědičnosti tříd. Další informace naleznete v tématu Použití kontraktu dat.
Uživatelé vlastního serializátoru by měli dodržovat pokyny serializátoru, který používají, aby se zajistilo, že je zpětně a dopředu kompatibilní. Běžným způsobem podpory všech verzí je přidání informací o velikosti na začátku a přidání pouze volitelných vlastností. Díky tomu si každá verze dokáže přečíst co nejvíce a přeskočit zbývající část datového proudu.
Další kroky
- Serializace a upgrade
- Referenční informace pro vývojáře pro Reliable Collections
- Upgrade aplikace pomocí sady Visual Studio vás provede upgradem aplikace pomocí sady Visual Studio.
- Upgrade aplikace pomocí PowerShellu vás provede upgradem aplikace pomocí PowerShellu.
- Pomocí parametrů upgradu můžete řídit, jak se vaše aplikace upgraduje.
- Informace o používání pokročilých funkcí při upgradu aplikace najdete v části Pokročilá témata.
- Při řešení běžných problémů s upgrady aplikací postupujte podle kroků v tématu Řešení potíží s upgrady aplikací.