…tai rinnakkaisten kuluttajien ja host.jsonin teho
Igor Izotov · Seuraa
9 min lukeminen · 13. tammikuuta 2019
--
TL;DR. Otan melko tavallisen palvelimettoman tapahtumankäsittelyskenaarion – Event Hubin viesteistä laukaisevan Azure-toiminnon – ja puhun siitä, kuinka tämä järjestelmä optimoidaan suoritustehoa varten:
a) yleinen arkkitehtuuri
b) EH-osiointi ja
c) Event Hub -laukaisimen säätäminenhost.json asetukset:maxBatchSize,prefetchCountjabatchCheckpointFrequency.Epäilen, että kukaan olisi kiinnostunut lukemaan vielä yhden teoreettisen opuksen, joten lukijani hyödyksi suoritin sarjan kokeita, jotka sisälsivät useiden Event Hubin osiomäärien ja yhdistelmien testaamisen.host.jsonasetukset ja tarkkailla vaikutusta latenssiin ja suorituskykyyn. Voit vapaasti hypätä suoraanlähestyä jatuloksiajulkaistu Power BI:ssä.
Toisin sanoen yritän auttaa niitä yksilöitä, jotka tällä hetkellä tuijottavat irrallaan keskietäisyyttä yrittäen ymmärtää:
Miksi Azure-funktiollani on yhtäkkiä vaikeuksia saada kiinni / jäädä muutaman tunnin jäljessä. Luulin, että tyhmä pilvi skaalaa tavarani automaattisesti...
Nkorvan reaaliaikainen tapahtumien käsittely on tehokasta ja myös monimutkaista, koska et enää ole tekemisissä perinteisen kerran päivässä tehtävän erätyön kanssa (joka voi myöhästyä, voidaan suorittaa tarvittaessa uudelleen jne.), vaan hajautetun tapahtumapohjaisen järjestelmän kanssa. yksittäisten tapahtumien (tai mikro-/minierien) käynnistämiä.
Azuressa oppikirjaton palvelimeton suoratoistoskenaario olisi Azure Function -sovellus, jonka käynnistävät tapahtumakeskuksen viestit. Se on yleinen malli, varsinkin kun tietosi edellyttävät muuntamista, jotta ne olisivat maukkaita koko prosessissasi.
Kuvittele, että olet tekemisissä gzipattujen xml-viestien virran kanssa (tapahtuu useammin kuin uskotkaan!)
Azure Functionsin alkuperäinenTapahtumakeskuksen liipaisinhuolehtii koodisi käynnistämisestä vastauksena streamin tapahtumiin. Vaikka liipaisin toimii hyvin heti, kun painat mittakaavaa (>10 000 viestiä/sek), sinun on säädettävä muutama asetushost.jsonjafunction.json. Muuten, kaikki täällä käsitelty koskee kaikkia kieliätukee Azure Functions Runtime, v1 ja v2 (jälkimmäistä suositellaan paremman suorituskyvyn vuoksi). Huomaa kuitenkin host.json-tiedoston syntaktiset erot näiden kahden version välillä.
Azure Functionin Event Hubs -triggeri ei ole yksinomaan Azure Functionsissa. Liipaisin on rakennettuTapahtumaprosessorin isäntäjoita voit käyttää rakentaessasi omia Event Hub -kuluttajia, jotka toimivat virtuaalikoneissa, säilöissä, verkkotöissä jne.
Sana viiveen ja suorituskyvyn mittaamisesta
Wkana mittaamassaviive, keskiarvon ottaminen ei ole melkein koskaan hyvä idea, se piilottaa poikkeamat; harkitse prosenttipisteiden ja maksimiarvon yhdistelmää (ahyvää luettavaajos haluat syvemmän sukelluksen). Koska emme välttämättä pysty aina täysin hallitsemaan tapahtumajulkaisijoita ja heidän verkkoyhteyttänsä, päätä, aiotko mitatapäästä päähän -latenssitaiputken latenssi (tai molemmat).
Kun mittaat päästä päähän -viivettä, tarvitset jokaisen viestin sisältävän aikaleiman, johon voit luottaa, joka tunnetaan myös nimellä Application Time. Liukulinjan latenssia mitattaessa Event HubenqueuedTimeattribuutti tallentaa luotettavasti jokaisen viestin saapumisajan. Muista, että koska putken viive perustuu viestien saapumisaikaan, ei yleensä ole huono idea ottaa käyttöön käytäntömyöhään saapuville ja poikkeaville tapahtumille.
Mittattaessaläpijuoksu, päätä, lasketkoviestejätaitavua,molemmat lähestymistavat ovat päteviä(kumpi mielestäsi sopisi paremmin, jos hyötykuormasi koko vaihtelee merkittävästi?).Lisäksi on suositeltavaa mitatajatkuva läpimenotai juoksevaa keskiarvoa riittävän pitkän ajanjakson aikana.
Joitakin suoritustehomittareita voidaan käyttää heti, kuten Event Hubin saapuvat viestit ja lähtevät viestit. Yksi tapa mitata putken latenssia on viamukautettuja mittareitasisäänAzure Application Insights. Tarvitaan vain pari ylimääräistä riviäkoodilaskeaksesi EventHubin välisen eronenqueuedTime ja koodisi kutsun aikaleima ja lähetä tämä arvo AppInsightsiin.
Tässä on puoliksi kunnollinen esimerkki SLA-lausekkeesta suoratoistoskenaariolle: 99 % kaikista Event Hubiin saapuvista tapahtumista on käsiteltävä kuumalla polulla 1 sekunnin sisällä. Suurin käsittelyviive ei saa koskaan ylittää 30 sekuntia. Putkilinjan tulee kyetä käsittelemään jopa 15 000 viestiä sekunnissa 24/7 edellyttäen, että viestin hyötykuorma ei ylitä 1KiB
Koe
Mittaataan empiirisesti, kuinka EH-osioiden määrä, erä- ja esihakukoot vaikuttavat suorituskykyyn ja latenssiin. Koska se vaatii melko vähän iteraatioita, automatisoidaan prosessiTerraform.
Luodaan jokaista iteraatiota varten 20 TU:n vakiotapahtumakeskus ja EH:n laukaisema Azure-funktio. Varustetaan myös kuormageneraattori, joka täyttää EH:n viesteillä, jotka kyllästävät sisääntulon. Tavoitteenamme on mitata tulosTteho (T) jaLtarkkaavaisuus (L) eri yhdistelmille:
-P: numeron numeroPtapahtumia
-B: MaksimiBliitoksen koko (maxBatchSizeasetus host.jsonissa) ja
-R:The pRhae raja (prefetchCountasetus host.jsonissa)
Jokaisen iteraation tulee olla riippumaton, ja siinä on yksi EH per EH-nimitila, yksi kuluttajaryhmä per EH. 20SuorituskykyyksikötSen pitäisi antaa meille mahdollisuus saavuttaa teoreettinen 20 Mt sekunnissa sisääntulopuolella (tapahtuman julkaisija) ja 40 Mt sekunnissa kuluttajapuolella (Azure Function). Suorituskyvyn lisäksi Throughput Unit rajoittaa myös sisään-/ulostulotapahtumien määrää, jokainen TU myöntää sinulle ~1 000 sisään- ja ~ 4 000 ulostulotapahtumaa sekunnissa. Sisääntulotapahtuman ja todellisen viestin välinen suhde voi olla hienovarainen ja todennäköisesti ansaitsee erillisen postauksen. Lyhyesti sanottuna, jos olettapahtumien lähettäminen erissäyksi sisääntulotapahtuma ei ole yhtä suuri kuin yksi viesti.
Event Hub -osioiden määrä ei määritä sen teoreettista suorituskykyä. Onei erityistä suoritusrajoitustaEvent Hub -osiossa (… enää)
Azure Function on käynnissä aKulutussuunnitelmaWindowsissa suorittaa tyhjäkäynnin jokaiselle viestille (se olisi voinut olla mikä tahansa) ja raportoida käsittelyviiveen viestierää kohden. Voit raportoida yksittäisiä sanomia kohti kussakin erässä, mutta sinun tulee arvioida, kuinka paljon enemmän telemetriaa luodaan ja säätäänäytteenottoasianmukaisesti.
Jos kiinnostaa, katso läpikoodi ja tutkiatuloksia Power BI:ssä tai lue eteenpäin. Tuottaakseni Power BI -raportin liitän muutamaan Azure Log Analyticsiin tallennettuun Event Hub -metriikkaan Application Insightsin mukautettuihin mittareihinresurssien välinen kyselyKustossa mikä puolestaan voi olla helppoakulutettuPower BI:ssä.
Suorita 1: 32 osiota, 20 TU:ta, maxBatchSize=64, prefetchCount=0
Kutsuisin tätä "odotetuksi käytökseksi": putkilinjan latenssi (yläkaavio) on alussa sadoissa sekunneissa, kun Azure-funktio skaalautuu vähitellen (alakaavio), kunnes lopulta se saavuttaa 32 esiintymää, mikä on täsmälleen yksi kuluttaja osiota kohden kuluttajaryhmää kohden.
Muista, että koska kyseessä on Event Hub, se on rinnakkaisia kuluttajia, ei kilpailevia kuluttajia
Kun toiminto on käynnissä täydellä kaasulla, se saavuttaa lopulta Event Hubin viestiruuhkan ja latenssi putoaa noin 220 ms:iin 15 minuutin ajon loppua kohti. 5 minuutin 95P- ja 99P-latenssiarvot olivat 3,5 ja 3,88 sekuntia, jos se olisi ollut käynnissä pidempään, arvot olisivat laskeneet entisestään.
Keskimmäinen kaavio näyttää keskimääräisen viestierän, jolla Azure-toimintoni käynnistettiin. Mielenkiintoista kyllä, se pysyy selvästi allemaxBatchSize=64mikä osoittaa jonkin verran vapaata kapasiteettia käsittelyputkessa.
Mitä jos lisäämmemaxBatchSizenumeroon 512?
Suorita 2: 32 osiota, 20 TU:ta, maxBatchSize=512, prefetchCount=0
Suorituskyky on hyvin samanlainen kuin yllä olevassa ajossa, mutta liukuhihna saavuttaa paljon nopeammin (ymmärrettävästi, katso eräkokoja alussa!). Viiden minuutin P95- ja P99-viivemittaukset ovat molemmat 180 ms, mikä on melko alhainen, jos minulta kysytään.
Okei, entä jos jatkamme Event Hub -osioiden määrän vähentämistä neljään?
Suorita 3: 4 osiota, 20 TU:ta, maxBatchSize=512, prefetchCount=0
Auts. Putki ei näytä koskaan saavan umpeen: katso kasvavaa viivettä ja eroa IncomingMessages-sanomien (eli kuinka monta viestiä oli jonossa Event Hubissa) ja OutgoingMessages-viestien (kuinka monta viestiä Azure-toiminto käsittelee) välillä.
Miksi? Ei riitä rinnakkaisuus. Osioita on vain 4, eli 4 kuluttajaa samalle 20:lle suoritustehoyksikölle. Tässä on harkittava kaksi vaihtoehtoa:
- Lisää osioiden määrää (sinun on luotava tapahtumakeskus uudelleen)
- Paranna kuluttajan suorituskykyä, jotta hän pystyy käsittelemään luotettavasti vähintään 5 000 viestiä sekunnissa. Jos käsittelysi on suorittimeen sidottu, Azure-funktion siirtäminen Premium-sovelluspalvelusopimukseen kulutussuunnitelmasta saattaa auttaa
Power BI:ssä on julkaistu vielä 57 ajoatässäjotta voit pelata.
On (karkeasti) neljä aluetta, joita kannattaa tarkastella putkilinjasi suorituskyvyn parantamiseksi ja viiveen vähentämiseksi: Tapahtumajulkaisijat, Tapahtumakeskus, Tapahtumakeskuksen triggeriasetukset ja Azure Function -koodi.
Tapahtuman julkaisijat
- Kirjoita EH:lle käyttäenerissä(huomio kokorajoitus!). Btw, tällä erän koolla ei ole mitään tekemistämaxBatchSize
- Käytä AMQP:tä tehokkuuden lisäämiseksi
- Jos raportoiHakemuksen aika, käytä UTC:tä
- Jos käytät osion affiniteettia, vältä kuumien osioiden luomista valitsemalla huonoosioavain, tämä luo vinoutta käsittelypuolelle. Jos skenaariosi ei edellytä FIFO- tai tilauskäsittelyä (joka voidaan saavuttaa vain yhdessä osiossa), älä määritä osion tunnusta ollenkaan round-robin-kirjoituksille. Vielä vähän luettavaatässä
Tapahtumakeskus
- Valitse osioiden määrä sopivasti, koska se määrittää rinnakkaisten kuluttajien määrän. Lisätietojatässä
- Harkitse Azure Event Hubsia suuritehoisissa skenaarioissaOmistettu
- Kun lasket kuinka montaSuorituskykyyksiköttarvitset, ota huomioon sekä sisään- että ulosmenopuoli. Useat kuluttajaryhmät kilpailevat ulostulokapasiteetista
- Jos otat käyttöönEvent Hub Capturevoit käyttää Blob Storageen laskeutuvia AVRO-tiedostoja käynnistääksesi kylmäpolun / eräkäsittelyn, se ontuettu laukaisinliian
Tapahtumakeskuksen triggerin asetukset: host.json ja function.json
- nimenomaisesti asetettu "kardinaalisuus”to"monet"infunction.jsonmahdollistaaksesi viestien ryhmittelyn
- maxBatchSizesisäänhost.json: oletusasetus 64 ei ehkä riitä liukuhihnalle, säätämiseen, mittaamiseen ja uudelleen säätämiseen. Muista, että muokkaaminenhost.jsonkäynnistää Azure-toiminnon uudelleen
- prefetchCountsisäänhost.json: Tämän asetuksen merkitys on "kuinka monta viestiä haetaan ja tallennetaan välimuistiin ennen niiden syöttämistä erissämaxBatchSizetoimintoon. Yleensä asetan sen nimenomaisesti2 * maksimierän koko. Muuten, aseta se mihin tahansa alla olevaan arvoonmaxBatchSizesillä on negatiivinen vaikutus suorituskykyyn pienentämällä eräkokoa
- batchCheckpointFrequencysisäänhost.json: katso Azure Functioniin liittyvää tallennustiliä ja näet, kuinka tarkistuspisteet tallennetaan pieninä json-tiedostoina osiota kohden kuluttajaryhmää kohden. Oletusasetus 1 käskee Azure Functionia luomaan tarkistuspisteen onnistuneen käsittelyn jälkeenjokaerä. Erä katsotaan onnistuneesti käsitellyksi, joskoodi toimii onnistuneesti(olet silti vastuussa poikkeuksista). Aloitan tavallisesti oletusarvolla 1 ja lisään tätä arvoa hieman, kun näen toimintoon liittyvän tallennustilin kuristustapahtumia (asiat voivat olla erityisen ikäviä, kun useat Azure Functions -toiminnot jakavat yhden tallennustilin). Lisäämisen haittapuolibatchCheckpointFrequencyon se, että kaatumisen sattuessa toimintosi joutuu toistamaan enemmän viestejä edellisen tarkistuspisteen jälkeen
Jotain lisälukemistatässäjatässä
Azure-toiminto
- Varmista, että koodisi on kirjoitettu käsittelemään tapahtumia muuttuvan kokoisina erinä
- Käytä estävää asynk.koodia
- Ota Application Insights käyttöön, mutta arvioi huolellisesti tarvitsemasi telemetrian määrä ja säädä sitäyhdistäminenjanäytteenottoasetukset host.jsonissa vastaavasti
- Poista käytöstäsisäänrakennettu kirjaus poistamalla AzureWebJobsDashboard-sovellusasetus. Oletuksena Azure Function kirjautuu lokiin Blob Storageen ja suuren työkuorman aikana saatat menettää telemetrian kuristuksen takia.
- Kulutussuunnitelma ei välttämättä aina ole hyvä suorituskyvyn näkökulmasta. Harkitse Premium App Service -sopimusten käyttöä tai sen sijaanTapahtumaprosessorin isäntäsopivan kokoisissa virtuaalikoneissa/säiliöissä
- Azure Event Hubsia käsiteltäessä ei ole käsitettä "lukitus", "deadlettering" jne. Muista käsitellä poikkeuksia yksittäisten viestien tasolla. Hieno kirjoitus aiheestatässä
Kiitos kun luit ja seuraavaan kertaan!
- Kokeilutulokset Power BI:ssä
- Kokeilukoodi ja yksityiskohtainen lähestymistapa GitHubissa
- Viestitbrilliantilta Azure FunctionsissaJeff Hollan
- Azure-toimintojen valvonta
- Event Hub laukaisee skaalauslogiikka
FAQs
How do I trigger an Azure function from event hub? ›
- Please read following documents for basic concept. ...
- Create Event Hubs namespace and Event Hub (Entity) from Portal.
- Create User-Assigned MI from Portal.
- Create Function App from Portal. (
Use the function trigger to respond to an event sent to an event hub event stream. You must have read access to the underlying event hub to set up the trigger.
What is the difference between Azure Service Bus and Event Hub and Event Grid? ›For example, an e-commerce site can use Service Bus to process the order, Event Hubs to capture site telemetry, and Event Grid to respond to events like an item was shipped. In other cases, you link them together to form an event and data pipeline. You use Event Grid to respond to events in the other services.
What is the difference between event hub and event in Azure? ›A key difference between Event Grid and Event Hubs is in the way event data is made available to the subscribers. Event Grid pushes the ingested data to the subscribers whereas Event Hubs makes the data available in a pull model. As events are received, Event Hubs appends them to the stream.
Why is my Azure function app not triggering? ›The most common cause for Azure Functions not getting triggered is that triggers are not synced properly. You can sync triggers in one of three ways: Restart your function app in the Azure portal.
What are the possible triggers for Azure function? ›- Time Trigger. This trigger is called by using the predefined schedule which we have defined. ...
- Blob Trigger. This trigger is executed when it finds the new updated blob. ...
- Event Hub Trigger. This trigger is used in application instrumentation. ...
- Http Trigger. ...
- Queue. ...
- Service Bus Trigger.
- Create an Event Hub named “meetup”. We will send Meetup events to it to be processed.
- Create a Data Lake Store. After, create a folder called “meetup” which will be our working folder for this example.
- Still in Data Explorer select the root folder and click “Access”.
You can access alerts for Azure Event Hubs by selecting Alerts from the Azure Monitor section on the home page for your Event Hubs namespace. See Create, view, and manage metric alerts using Azure Monitor for details on creating alerts.
Is Azure event hub push or pull? ›Azure Event Hub pushes events to a "event processor" client. The event processor can do checkpoint to denote upto which event in the event stream it has caught up with.
Is event hub same as Kafka? ›While Apache Kafka is software you typically need to install and operate, Event Hubs is a fully managed, cloud-native service.
Is Azure event hub a Service Bus? ›
Azure Event Hubs is more suitable with requirements to ingest massive volume of data, where Azure Service Bus is more suitable for enterprise messaging needs.
What is the difference between Service Bus queue and event hub? ›Service Bus has the concept of message session. It allows relating messages based on their session-id property whereas Event Hubs does not. 6. Service Bus the messages are pulled out by the receiver & cannot be processed again whereas Event Hubs message can be ingested by multiple receivers.
Does Azure event hub store data? ›Where does Azure Event Hubs store data? Azure Event Hubs standard, premium and dedicated tiers store and process data published to it in the region that you select when you create an Event Hubs name space. By default, customer data stays within that region.
What is the difference between queue and topic in Azure Service Bus? ›A queue allows processing of a message by a single consumer. In contrast to queues, topics and subscriptions provide a one-to-many form of communication in a publish and subscribe pattern. It's useful for scaling to large numbers of recipients.
How do I manually trigger an Azure function? ›To trigger the Timer function manually, you need to get the Function's Master Key. To do this, Navigate to the function app in Azure Portal, select App Keys, and then select the _master key.
How do I get data from Azure event hub? ›- In the Azure portal, browse to the event hubs instance you want to connect.
- Under Settings, select Shared access policies.
- Select +Add to add a new SAS policy, or select an existing policy with Manage permissions.
- Enter a Policy name.
- Select Manage, and then Create.
- Select Functions, and then select + Add to add a new function.
- Choose the Azure Queue Storage trigger template.
- Use the settings as specified in the table below the image. Setting. Suggested value. Description. Name. ...
- Select Create Function to create your function.