Při použití Azure Functions s Event Hubs, existuje mnoho funkcí a rozhodnutí, které ovlivňují výkon i škálování. Tento článek obsahuje preskriptivní pokyny pro získání co nejlepšího z tohoto dynamického párování.
Seskupování funkcí
Funkce obvykle zapouzdřuje jednotku práce, která zpracovává jednotlivé události. Tato práce může zahrnovat transformaci události do nové datové struktury nebo třeba krok rozšiřování v datovém kanálu pro podřízené aplikace.
Způsob seskupení funkcí může mít přímý vliv na výkon a možnosti škálování vašich aplikací funkcí. Několik osvědčených postupů navrhuje seskupování podle přístupových práv, nasazení a vzorů použití, které vyvolaly váš kód.
Mezi další pokyny pro seskupování funkcí s aspekty úložiště a skupin uživatelů patří:
Hostování jedné funkce v rámci aplikace funkcí: Izolovaná funkce aktivovaná Event Hubs snižuje vracení prostředků mezi jinými spuštěných funkcemi, zejména těch, které jsou náročné na procesor nebo paměť. K této výhodě dochází, protože každá funkce má své vlastní nároky na paměť a vzory využití, které mohou přímo ovlivnit škálování aplikace funkcí, ve které jsou funkce spuštěny.
Samostatné účty úložiště pro každou aplikaci funkcí: Vyhněte se sdílení účtů úložiště mezi aplikacemi funkcí. Nepoužívejte také stejný účet úložiště, který se používá pro aplikaci funkcí pro jiné operace nebo potřeby úložiště. Je důležité používat samostatné účty úložiště, protože Event Hubs aktivované funkce potenciálně potenciálně mohou mít velké množství transakcí úložiště kvůli kontrolních bodům.
Vytvořte pro každou aplikaci funkcí vyhrazenou skupinu uživatelů: V řešení pro zpracování datových proudů se každá spotřebitelská aplikace rovná skupině uživatelů. Aplikace funkcí je hlavním příkladem spotřebitelské aplikace. Nesdílejte skupiny uživatelů mezi aplikacemi funkcí a jinými aplikacemi uživatelů. Následující diagram obsahuje příklad dvou aplikací funkcí, které čtou z centra událostí, kde má každá aplikace svou vlastní vyhrazenou skupinu uživatelů:
Souhrnně řečeno, každá aplikace funkcí by měla být vnímána jako odlišná aplikace s vlastní přiřazenou skupinou uživatelů. Tím se zajistí integrita posunu každého příjemce a zjednoduší se závislosti v architektuře streamování událostí. Tato konfigurace společně s tím, že každé funkci aktivované centrem událostí poskytuje vlastní aplikaci funkcí a účet úložiště, pomáhá nastavit základ pro optimální výkon a škálování.
Plány hostování funkcí
Důležitým krokem při posuzování možností hostování je kontrola, jak se funkce škálují podle různých plánů.
Při použití plánu Consumption má ve výchozím nastavení každá aplikace funkcí svůj vlastní plán. Aplikace funkcí v plánu Consumption se škálují nezávisle a jsou nejefektivnější, když se vyhnete dlouhotr běžícím úlohám.
Plány Premium a Dedicated se často používají k hostování více aplikací funkcí a funkcí, které jsou náročnější na procesor a paměť. Je důležité si uvědomit, že všechny aplikace funkcí v těchto plánech sdílejí stejné prostředky přidělené plánu. Pokud funkce mají různé profily zatížení nebo jedinečné požadavky, je nejlepší je hostovat v různých plánech. To platí zejména pro aplikace pro zpracování datových proudů.
Event Hubs škálování
Pokud jde o obor názvů Event Hubs, je potřeba vyhodnotit několik důležitých nastavení, aby se zajistil výkon a škálování ve špičce. Tato část se zaměřuje na úroveň Standard služby Event Hubs a její jedinečné funkce, které ovlivňují škálování při použití s Azure Functions. Další informace o úrovních Event Hubs najdete v tématu Úrovně Basic a Standard vs. úrovně Premiuma Dedicated.
Vysvětlení jednotek propustnosti
V Event Hubs úrovně Standard se propustnost klasifikuje jako množství dat, která vstupují do oboru názvů a čtou se z oboru názvů v daném období. Jednotka propustnosti (TU) je mechanismus, který se používá k měření a správě propustnosti, kterou Event Hubs obor názvů podporuje.
Obor názvů v systému Event Hubs být porovnán s clusterem v systému Kafka. Koncepční mapování mezi Kafka a Event Hubs v této tabulce.
Každá jednotka propustnosti se účtuje po hodinách a sdílí se ve všech centrech událostí v oboru názvů. To znamená, že všechny aplikace a služby, vydavatelé i spotřebiteli, musí být při výběru počtu přilněných TU zohledněny. Azure Functions ovlivňuje počet bajtů a událostí, které jsou publikovány do centra událostí i čtou z centra událostí.
Důraz na určení počtu TU je vychýlován kolem bodu příchozího přenosu dat. Do výpočtu je však nutné zahrnout také agregaci pro aplikace příjemce, včetně rychlosti zpracování těchto událostí.
Automatické nafouknutí škálování
Automatické nafouknutí je možné povolit v oboru názvů Event Hubs, aby se přizpůsoboval scénářům, kdy se zatížení zvyšuje nad rámec nakonfigurovaného počtu TU. Tím se zajistí, že nedojde k omezování ze služby a že zpracování, včetně ingestování událostí, může pokračovat bez přerušení. Vzhledem k tomu, že TU jsou jedním z důležitých nastavení, které také ovlivňuje náklady, pomáhá využití funkce automatického nafouknutí řešit problémy související se zřizováním.
Automatické nafouknutí je jedinečná funkce Event Hubs která se často zaměňuje s automatickým škálováním, zejména v kontextu bez serverů. Je důležité si uvědomit, že tato charakteristika v Event Hubs podporuje dynamické zvyšování počtu TU, aby podporovala scénáře shluků, ale nemá funkci pro automatické defekci nebo horizontální navýšení kapacity.
V případě scénářů, které vyžadují vysokou propustnost a nemohou být přizpůsobeny maximálnímu povolenému počtu TU, zvažte použití Azure Event Hubs Premium nebo vyhrazeného clusteru.
Oddíly a souběžné funkce
Při vytvoření centra událostí je nutné zadat počet oddílů. Počet oddílů zůstane pevný a není možné ho změnit s výjimkou úrovní Premium a Dedicated. Při použití Event Hubs se počet souběžných instancí aplikace funkcí může potenciálně shodovat s počtem oddílů.
V části Spotřeba a Premium plány se instance aplikace funkcí v případě potřeby dynamicky škálují na více instancí, aby splňovaly počet oddílů. Vyhrazené plány (App Service) vyžadují ruční konfiguraci instancí nebo nastavení a schéma automatického škálování. V konečném důsledku je ideální cíl maximální propustnosti v řešení zpracování datových proudů vztah 1:1 mezi počtem oddílů a instancemi aplikace funkcí.
Optimálního paralelismu se dosahuje tím, že v rámci skupiny konzumentů existuje více konzumentů. Například Azure Functions do mnoha instancí aplikace funkcí v rámci plánu. Výsledek se označuje jako paralelismus na úrovni oddílů nebo maximální stupeň paralelismu.
Zpočátku může mít smysl nakonfigurovat co nejvíce oddílů, abyste dosáhli maximální propustnosti a zohlednit možnost vyššího objemu událostí. Existuje však několik důležitých faktorů, které je třeba zvážit při konfiguraci mnoha oddílů:
Větší propustnost může vést k více oddílům: Vzhledem k tomu, že stupeň paralelismu je počet uživatelů (instancí aplikace funkcí), čím více oddílů existuje, tím vyšší může být souběžná propustnost. Tato skutečnost je důležitá při sdílení určeného počtu TU pro centrum událostí s jinými aplikacemi příjemce.
Více funkcí může vyžadovat více paměti: S nárůstem počtu instancí aplikace funkcí se zvyšuje i využití paměti prostředků v rámci plánu. V nějakém okamžiku může příliš mnoho oddílů zvýšit výkon pro uživatele.
Tlak na příjem dat ze služeb pro příjem dat: S tím, jak se vygeneruje větší propustnost, může dojít k zahltit nebo přijmout tlak na podřízené služby. Při zvažování důsledků, které to může mít na okolní prostředky, je nutné zohlednit ventilátory pro spotřebitele. Příkladem může být omezování z jiných služeb, nasycení sítě a další formy náporu prostředků, ke kterým může dojít se zvýšením propustnosti.
Řídce naplněné oddíly: Kombinace mnoha oddílů a nízkého objemu událostí může vést k datům, která jsou napříč oddíly rovnoměrně rozdělena. Menší počet oddílů může místo toho zajistit optimální výkon a využití prostředků, které může funkce využívat.
Dostupnost a konzistence
Pokud klíč oddílu nebo ID nezadáte, Event Hubs služba směruje příchozí událost do dalšího dostupného oddílu. Tento přístup poskytuje vysokou dostupnost a pomáhá zvýšit propustnost pro uživatele.
Pokud je řazení důležité, je možné zadat konkrétní oddíl, aby se zachovalo pořadí událostí při jejich publikování. Aplikace příjemce, která čte ze stejného oddílu, pak může zpracovávat události v pořadí. Tento kompromis zajišťuje konzistenci, ale ohrozí dostupnost. Přístup používejte pouze v případě, že je vyžadováno řazení událostí.
U služby Functions se řazení dosáhne, když se události publikují do konkrétního oddílu a Event Hubs aktivovaná funkce získá zapůjčení do stejného oddílu. V současné době není podporována možnost konfigurace oddílu Event Hubs výstupní vazby. Místo toho je nejlepší Event Hubs publikování do konkrétního oddílu pomocí jedné ze Event Hubs SDK.
Podrobnější vysvětlení toho, jak jsou dostupnost a konzistence podporované Azure Event Hubs, se doporučuje, abyste si prohlédněte tento článek.
Event Hubs trigger
Tato část se zaměřuje na nastavení a aspekty, které je třeba vzít v úvahu při optimalizaci Event Hubs aktivované funkce pro výkon ve špičce. Mezi faktory patří dávkové zpracování, vzorkování a související funkce, které ovlivňují chování vazby triggeru centra událostí.
Dávkování
Funkce aktivované centrem událostí je možné nakonfigurovat tak, aby zpracovávaly kolekci událostí nebo jednu událost po jedné. Zpracování dávky událostí je efektivnější z důvodu režie spojené s jednotlivými vyvoláními funkcí. Pokud nepotřebujete zpracovat jenom jednu událost, měla by být funkce nakonfigurovaná tak, aby při vyvolání zpracovávala více událostí.
Povolení dávkování pro vazbu triggeru Event Hubs se v jednotlivých jazycích liší:
V jazyce C# se kardinalita automaticky konfiguruje, když je pole určeno pro typ v
EventHubTriggeratributu .JavaScript, Python a další jazyky umožňují dávkování, pokud je vlastnost kardinálu v souboru function.json pro funkci nastavená na hodnotu many.
Další informace o povolení dávkování najdete v tématu o možnostech atributů a poznámek pro jednotlivé podporované jazyky.
Nastavení aktivační události
Několik nastavení konfigurace v souboru host.json hraje klíčovou roli v charakteristikách výkonu Event Hubs aktivační události pro Azure Functions:
maxBatchSize: Toto nastavení představuje maximální počet událostí, které funkce přijme při vyvolání. Je důležité si uvědomit, že se jedná o minimální počet událostí, pouze o maximální počet. Pokud je počet přijatých událostí menší než toto množství, je funkce stále vyvolána s tolika událostmi, kolik je k dispozici. Minimální velikost dávky není možné nastavit.
prefetchCount: Jedním z nejdůležitějších nastavení, když je optimalizace výkonu optimalizována, je počet předběžných hodnot. Na tuto hodnotu odkazuje podkladový kanál AMQP k určení, kolik zpráv se má načíst a mezipaměť pro klienta. Počet předběžných hodnot by měl být větší nebo roven
maxBatchSizehodnotě a je běžně nastaven na násobek dané částky. Nastavení této hodnoty na hodnotu menší, nežmaxBatchSizenastavení může mít negativní vliv na výkon.batchCheckpointFrequency: Při zpracování dávek vaší funkcí se tato hodnota používá k určení rychlosti vytvoření kontrolního bodu. Ve výchozím nastavení je tato hodnota nastavena na
1, což znamená, že jakmile funkce úspěšně zpracuje dávku, bude vytvořen kontrolní bod. Mějte na paměti, že kontrolní bod se vytvoří na úrovni oddílu každého čtecího zařízení ve skupině příjemců. Tento zajímavý blogový příspěvek poskytuje další přehled o chování, které může toto nastavení představovat, a způsob, jakým se bude pokládat s přehráváním a opakováním událostí.
Hodnoty, které nastavíte pro vazbu triggeru, by měly být určeny v průběhu několika testů výkonu a iterací. Doporučuje se, aby se změny provedly iterativním způsobem a byly konzistentně vyhodnoceny tak, aby tyto možnosti byly vhodně vyladitelné. Výchozí hodnoty jsou snahou o poskytnutí počátečního bodu pro většinu řešení pro zpracování událostí.
Vytváření kontrolních bodů
Princip vytváření kontrolních bodů je důležitý pro Event Hubs aktivované funkce. Zodpovídá za to, že se při zpracování událostí a nastavení četnosti kontrolního bodu služby Batch splní hostitel funkce pro kontrolní bod.
Následující koncepty jsou důležité pro porozumění vztahu mezi vytvářením kontrolních bodů a funkcí, jak vaše funkce zpracovává události:
Výjimky stále připočítávají k úspěchu: Pokud během zpracování událostí nedojde k chybě procesu funkce, dokončení funkce je považováno za úspěšné. Zachycování a zpracování výjimek by měl být stále obrannou liniím přístupem v kódu funkce. V případě úspěchu hostitel Functions vyhodnotí nastavení pro kontrolní bod frekvence dávky a vytvoří kontrolní bod, pokud byl dosažen, bez ohledu na výjimky, ke kterým mohlo během zpracování dojít.
Četnost dávek dávky: V řešeních streamování s vysokým objemem událostí může být výhodné změnit nastavení batchCheckpointFrequency na hodnotu větší než 1. Zvýšení této hodnoty může snížit rychlost vytvoření kontrolního bodu. tím se sníží počet vstupně-výstupních operací na účet úložiště a výsledkem je vyšší výkon.
K přehrání může dojít: Pokaždé, když je funkce vyvolána s vazbou triggeru Event Hubs, k určení, kam se má pokračovat v zpracování, se použije poslední kontrolní bod. Bylo zdůrazněno, že posun pro každého příjemce je uložen na úrovni oddílu pro každou skupinu příjemců. K přehrání dojde, když během posledního vyvolání funkce nedošlo ke kontrolnímu bodu, a je znovu vyvolán. Další informace o duplicitách a postupech odstranění duplicitních dat najdete v tématu idempotence v dalším článku.
Princip vytváření kontrolních bodů se považuje za kritický, Pokud zvažujete osvědčené postupy pro zpracování a opakování chyb, který bude popsaný v pozdější části tohoto článku.
Vzorkování telemetrie
Azure Functions poskytuje integrovanou podporu pro Application Insights. Pomocí této funkce můžete shromažďovat protokol, výkon a informace o výjimkách modulu runtime, ke kterým dochází ve vašich funkcích. Tato výkonná instalace nabízí některé možnosti konfigurace klíčů, které budou mít vliv na výkon. Mezi významná nastavení a důležité požadavky pro monitorování a výkon patří:
Povolit vzorkování telemetrie: u scénářů s vysokou propustností byste měli vyhodnotit množství telemetrie a informace, které budete potřebovat. přečtěte si funkci vzorkování telemetrie v Application Insights, abyste se vyhnuli snížení výkonu vaší funkce s zbytečnými daty telemetrie a metrikami.
Konfigurovat nastavení agregace: prověřte a nakonfigurujte četnost, s jakou se data agreguje a odesílají do Application Insights. Toto nastavení konfigurace je v souboru Host. JSON spolu s mnoha dalšími možnostmi souvisejícími s vzorkováním a protokolováním. Další informace najdete v tématu Konfigurace Agregátoru.
Disable AzureWebJobDashboard: u aplikací, které cílí na verzi 1. x Azure Functions modulu runtime, uloží toto nastavení připojovací řetězec do účtu úložiště, který používá sada Azure SDK k uchování protokolů pro řídicí panel WebJobs. pokud se místo toho na řídicím panelu webjobs používá Application Insights, mělo by se toto nastavení odebrat. Další informace najdete v referenčních informacích k nastavení AzureWebJobsDashboard .
je důležité si zmínit, že když je povolená Application Insights bez vzorkování, odesílají se všechna data telemetrie. Odesílání dat o všech událostech může mít nepříznivý vliv na celkový výkon funkce, zejména v rámci vysoce kvalitních scénářů streamování událostí.
Využitím vzorkování a průběžného vyhodnocování vhodného množství telemetrie potřebných pro monitorování je jedno z mnoha důležitých nastavení dostupných pro optimální výkon. Telemetrii by se měla použít pro obecné vyhodnocení stavu platformy v agregaci a pro příležitostné řešení potíží, a ne pro zachycení základních obchodních metrik. Další informace najdete v tématu Konfigurace vzorkování.
Výstupní vazba
Publikování do datového proudu událostí z funkce je zjednodušeno pomocí výstupní vazby pro Event Hubs. Mezi výhody použití této vazby patří:
Správa prostředků: vazba zpracovává životní cyklus klienta i připojení. To snižuje potenciální problémy, které mohou vzniknout při vyčerpání portů a správě fondu připojení.
Less code: vazba vyabstrakce základní sadu SDK a snižuje množství kódu potřebného k publikování událostí. Výsledkem je kód, který je snazší psát a udržovat.
Dávkování: pro různé jazyky se podpora dávkování umožňuje efektivně publikovat do datového proudu událostí. To může zvýšit výkon a usnadnit zjednodušit kód, který odesílá události.
Důrazně doporučujeme, abyste si přečtěte seznam podporovaných jazyků pro Azure functions a jejich příslušné příručky pro vývojáře. Oddíl Bindings pro jednotlivé jazyky poskytuje podrobné příklady a dokumentaci.
Dávkování
Pokud vaše funkce publikuje jenom jednu událost, nakonfiguruje se vazba s návratovou hodnotou běžným přístupem. To je užitečné v případě, že provádění funkce vždy končí příkazem, který odesílá událost. Použití návratové hodnoty je vzor, který by měl být použit pouze pro synchronní funkce, které vracejí pouze jednu událost.
Dávkování je doporučováno pro zlepšení výkonu při posílání více událostí do datového proudu. Dávkování umožňuje vazbám publikovat události v nejúčinnějším možném způsobu.
Podpora odesílání více událostí s výstupní vazbou na Event Hubs je k dispozici v jazycích C#, Java, Python a JavaScript.
Výstup více událostí v jazyce C
Použijte ICollector typy a IAsyncCollector při posílání více událostí z funkce v jazyce C#.
ICollector<T>.Add()Metodu lze použít jak v synchronních, tak v asynchronních funkcích. Spustí operaci přidání hned po jejím volání.IAsyncCollector<T>.AddAsync()Metoda připraví události, které mají být publikovány do datového proudu událostí. Pokud píšete asynchronní funkci, měli byste použítIAsyncCollectork lepší správě publikovaných událostí.
Příklady publikování jedné i více událostí pomocí C# najdete v dokumentaci .
Omezování a navýšení zatížení
požadavky omezování se vztahují také na výstupní vazby, nejen pro Event Hubs, ale také pro služby Azure, jako je Azure Cosmos DB. Obecně je důležité, abyste se seznámili s limity a kvótami, které se na tyto služby vztahují, a odpovídajícím způsobem naplánovat.
Chcete-li zpracovat chyby, můžete zachytit výjimky z IAsyncCollector tak, že zabalíte AddAsync a FlushAsync do obslužné rutiny výjimky pro rozhraní .NET Azure Functions nebo nepoužijete výstupní vazby a použijete přímo sadu Event Hubs SDK.
Kód funkce
V této části jsou popsány klíčové oblasti, které je třeba vzít v úvahu při psaní kódu pro zpracování událostí z funkce aktivované Event Hubs.
Asynchronní programování
Doporučuje se, aby funkce využívala neblokující asynchronní kód. To je důležité, pokud jsou zapojena vstupně-výstupní volání.
Při zvažování asynchronního programování ve funkcích existují některé základní pokyny, které by měly být dodrženy:
Všechny asynchronní nebo všechny synchronní: Pokud je funkce nakonfigurovaná tak, aby běžela asynchronně, všechna volání I/O by měla být také asynchronní. Ve většině případů je částečně asynchronní může být horší než kód, který je zcela synchronní. Vyberte buď asynchronní, nebo synchronní pro implementaci funkce a sledujte ji všemi způsoby prostřednictvím.
Vyhněte se blokování volání: Blokování volání se vrátí volajícímu až po dokončení volání. To se liší od asynchronních volání, která vrací okamžitě. Příkladem v jazyce C# je volání Task. Result nebo Task. Počkejte na asynchronní operaci.
Další informace o blokování volání
Při blokování volání na asynchronních operacích může vést ke vyčerpání fondu vláken a způsobit zhroucení procesu funkce. K tomu dochází, protože blokující volání vyžaduje vytvoření jiného vlákna, aby bylo možné kompenzovat původní volání, které nyní čeká. V důsledku toho teď vyžaduje dvakrát tolik vláken, než se operace dokončí.
Zabránění této synchronizaci prostřednictvím asynchronního přístupu je obzvláště důležité, když se Event Hubs účastní od selhání do funkce, kontrolní bod nebude aktualizovat. Při příštím volání funkce může dojít k ukončení tohoto cyklu a zdá se, že se bude zablokovat nebo se může pohybovat pomalu, protože spuštění funkcí bude nakonec vyprší časový limit.
Řešení potíží s tímto jev většinou začíná kontrolou nastavení triggeru a spouštění experimentů, které mohou zahrnovat zvýšení počtu oddílů. Šetření může také vést ke změně několika možností dávkování, jako je maximální velikost dávky nebo počet předběžných načtení. Dojmem je, že se jedná o problém s propustností nebo o nastavení konfigurace, které je třeba vhodně vyladit. Základní problém se však nachází v samotném kódu a musí se řešit pro správné řešení.
Další kroky
Než budete pokračovat, zvažte, jak si projít tyto související články:
- Monitor s
- Azure Functions spolehlivé zpracování událostí
- Návrh Azure Functions pro stejný vstup
- ASP.NET Core pokyny k asynchronnímu přenosu.
Související prostředky
- Monitorování bez serveru zpracování událostí poskytuje pokyny k monitorování architektur bez serveru řízené událostmi.
- Zpracování událostí bez serveru je referenční architektura, která podrobně popisuje typickou architekturu tohoto typu. Obsahuje ukázky kódu a diskusi o důležitých aspektech.
- Podrobnější popis toho, jak tyto části referenční architektury fungují, Event Hubs bez serveru při zpracování událostí bez serveru.