Sdílet prostřednictvím


Konfigurace a používání spřažení služeb v Service Fabric

Spřažení je ovládací prvek, který se poskytuje hlavně k usnadnění přechodu větších monolitických aplikací do cloudu a mikroslužeb světa. Používá se také jako optimalizace pro zlepšení výkonu služeb, i když to může mít vedlejší účinky.

Řekněme, že přinášíte větší aplikaci nebo aplikaci, která nebyla navržena s ohledem na mikroslužby, do Service Fabric (nebo jakéhokoli distribuovaného prostředí). Tento typ přechodu je běžný. Začnete tím, že zvednete celou aplikaci do prostředí, zabalíte ji a ujistíte se, že běží hladce. Pak ho začnete rozdělit do různých menších služeb, které spolu všichni komunikují.

Nakonec můžete zjistit, že u aplikace dochází k nějakým problémům. Tyto problémy obvykle spadají do jedné z těchto kategorií:

  1. Některé komponenty X v monolitické aplikaci měly nezdokumentovanou závislost na komponentě Y a právě jste tyto komponenty změnili na samostatné služby. Vzhledem k tomu, že tyto služby jsou teď spuštěné na různých uzlech v clusteru, jsou poškozené.
  2. Tyto komponenty komunikují přes (místní pojmenované kanály | sdílená paměť | soubory na disku) a z důvodů výkonu musí být skutečně schopné zapisovat do sdíleného místního prostředku. Tato pevná závislost se později odebere, možná.
  3. Všechno je v pořádku, ale ukázalo se, že tyto dvě komponenty jsou ve skutečnosti chatty /výkon citlivé. Když je přesunuli do samostatných služeb, zvýšil se celkový výkon aplikace nebo se zvýšila latence. Výsledkem je, že celková aplikace nesplňuje očekávání.

V těchto případech nechceme ztratit práci refaktoringu a nechceme se vrátit k monolitickému režimu. Poslední podmínka může být dokonce žádoucí jako prostý optimalizace. Dokud ale nebudeme moct přepracovat komponenty tak, aby fungovaly přirozeně jako služby (nebo dokud nedokážeme vyřešit očekávání výkonu jiným způsobem), budeme potřebovat nějaký smysl pro umístění.

Co dělat? No, mohli byste zkusit zapnout spřažení.

Konfigurace spřažení

Pokud chcete nastavit spřažení, definujete vztah vztahů mezi dvěma různými službami. Spřažení si můžete představit jako "nasměrovávání" jedné služby na jinou a říká se, že tato služba může běžet jenom tam, kde je tato služba spuštěná. Někdy označujeme spřažení jako vztah nadřazenosti nebo podřízenosti (kde odkazujete na podřízenou položku nadřazeného objektu). Spřažení zajišťuje, aby repliky nebo instance jedné služby byly umístěny na stejných uzlech jako repliky jiné služby.

ServiceCorrelationDescription affinityDescription = new ServiceCorrelationDescription();
affinityDescription.Scheme = ServiceCorrelationScheme.Affinity;
affinityDescription.ServiceName = new Uri("fabric:/otherApplication/parentService");
serviceDescription.Correlations.Add(affinityDescription);
await fabricClient.ServiceManager.CreateServiceAsync(serviceDescription);

Poznámka:

Podřízená služba se může účastnit pouze jednoho vztahu spřažení. Pokud chcete, aby se dítě spřažilo se dvěma nadřazeným službám najednou, máte několik možností:

  • Obrácení relací (mít v aktuální podřízené službě bod parentService1 a parentService2)
  • Určete jednu z nadřazených objektů jako centrum podle konvence a mají všechny body služeb v této službě.

Výsledné chování umístění v clusteru by mělo být stejné.

Různé možnosti spřažení

Spřažení je reprezentováno prostřednictvím jednoho z několika schémat korelace a má dva různé režimy. Nejběžnějším režimem spřažení je to, co nazýváme NonAlignedAffinity. V nonAlignedAffinity jsou repliky nebo instance různých služeb umístěny na stejných uzlech. Druhý režim je AlignedAffinity. Sladěné spřažení je užitečné jenom se stavovými službami. Konfigurace dvou stavových služeb tak, aby srovnaly spřažení, zajišťuje, že primární nástavby těchto služeb jsou umístěny na stejných uzlech jako ostatní. Také způsobí, že každá dvojice sekundárních služeb bude umístěna na stejných uzlech. Je také možné (i když méně běžné) nakonfigurovat NonAlignedAffinity pro stavové služby. V případě NonAlignedAffinity by různé repliky těchto dvou stavových služeb běžely na stejných uzlech, ale jejich primarie můžou skončit na různých uzlech.

Režimy vztahů a jejich efekty

Požadovaný stav v nejlepším úsilí

Spřažení je nejlepší úsilí. Neposkytuje stejné záruky kolokace nebo spolehlivosti, které běží ve stejném spustitelném procesu. Služby v vztahu vztahů jsou zásadně odlišné entity, které mohou selhat a přesunout nezávisle. Vztah vztahů může také přerušit, i když jsou tyto konce dočasné. Omezení kapacity můžou například znamenat, že na daný uzel se můžou vejít jenom některé objekty služby v relaci spřažení. V těchto případech i když existuje vztah spřažení, není možné ho vynutit kvůli jiným omezením. Pokud je to možné, porušení se automaticky opraví později.

Řetězy vs. hvězdy

Cluster Resource Manager dnes nedokáže modelovat řetězy vztahů vztahů. To znamená, že služba, která je podřízeným vztahem spřažení, nemůže být nadřazenou součástí jiného vztahu vztahů. Pokud chcete modelovat tento typ relace, musíte ho efektivně modelovat jako hvězdu místo řetězu. Pokud se chcete přesunout z řetězu na hvězdičku, bude podřízené úplně dole nadřazené nadřazené první podřízené sadě. V závislosti na uspořádání vašich služeb to možná budete muset udělat několikrát. Pokud neexistuje žádná přirozená nadřazená služba, možná budete muset vytvořit službu, která slouží jako zástupný symbol. V závislosti na vašich požadavcích se můžete také podívat na skupiny aplikací.

Řetězy vs. hvězdy v kontextu vztahů spřažení

Další věcí, kterou je třeba si uvědomit o spřažení, je, že ve výchozím nastavení jsou směrové. To znamená, že pravidlo spřažení vynucuje pouze to, aby podřízené položky umístěné s nadřazeným objektem. Nezajistí, aby byl nadřazený objekt umístěn s podřízeným objektem. Proto pokud dojde k porušení spřažení a k nápravě porušení z nějakého důvodu není možné přesunout podřízenou položku do uzlu nadřazeného objektu, pak – i když by přesunutí nadřazeného uzlu do podřízeného uzlu opravilo porušení – nadřazený uzel se nepřesune do podřízeného uzlu. Nastavení konfigurace MoveParentToFixAffinityViolation na hodnotu true by odebralo směrodatnost. Je také důležité si uvědomit, že vztah spřažení nemůže být dokonalý nebo okamžitě vynucený, protože různé služby mají různé životní cyklus a mohou selhat a přesunout nezávisle. Řekněme například, že nadřazený uzel náhle převezme služby při selhání jinému uzlu, protože došlo k chybě. Správce prostředků clusteru a Správce převzetí služeb při selhání nejprve zpracují převzetí služeb při selhání, protože udržování služeb v provozu, konzistentní a k dispozici je priorita. Jakmile se převzetí služeb při selhání dokončí, vztah spřažení se přeruší, ale Správce prostředků clusteru si myslí, že všechno je v pořádku, dokud si nevšimne, že se podřízená položka nenachází s nadřazeným objektem. Tyto druhy kontrol se provádějí pravidelně. Další informace o tom, jak Správce prostředků clusteru vyhodnocuje omezení, je k dispozici v tomto článku a v tomto článku se dozvíte více o tom, jak nakonfigurovat četnost vyhodnocování těchto omezení.

Podpora dělení

Posledním upozorněním na spřažení je to, že vztahy vztahů vztahů nejsou podporovány, pokud je nadřazený objekt rozdělený na oddíly. Dělené nadřazené služby mohou být nakonec podporovány, ale dnes není povolená.

Další kroky