Lehtrid ja päästikud
Lehter on graaf. Käik on rida. Ootamine on aeg.
See on kogu mudel, ja iga selle toote raske omadus tuleb nendest kolmest lausest. Elava lehtri redigeerimine on nende tõttu ohutu. Kordus ei saa topelt saata nende tõttu. Inimene, kes teisipäeval loobus, ei kuulda neljapäeval mitte midagi nende tõttu.
Mis tegelikult juhtub, kui see käivitub
Lehtri avaldamine kirjutab muutmatu versiooni. Keegi siseneb, ja ilmub rida: üks käik, sellele kontaktile, seotud selle versiooniga, hoides praegust sõlme, ärkamisaega ja oma konteksti.
Töötaja võtab rendile käigud, mille ärkamaeg on möödunud, ja haardes neid SKIP LOCKED abil, et kaks töötajat ei saaks sama käigu kätte. Ta täidab sõlmed, kuni jõuab ooteni või lõppsõlmeni, kirjutab siis järgmise ärkamae ja laseb lahti.
Sõlm on puhas funktsioon käigust, kontaktist ja sõlmest — ja selle mõjud kinnitatakse samas tehingus käigu enda edasiliikumisega. Just see üks omadus muudab korduskatse ohutuks. Töötaja, kes hukatakse poole sekundi jooksul „saada“ ja „liigu edasi“ vahel, jätab maha kas mõlemad või kumbagi, mitte kunagi ühe.
Ja kuna rakendus annab aja, mitte andmebaas, on nüüd kirjutatud rida tähtaegne juba praegu. Ajastamise veerg, mis kasutab andmebaasi kellaaega vaikimisi, pole kirjutamise hetkel veel tähtaegne ja jääb just sellest tikist mööda — viga, mis ei näi üldse midagi, kuni sõnum jääb tunni aega hiljaks.
- 1Rendile võtmine
wake_at <= now(),FOR UPDATE SKIP LOCKED. Järjekord ilma rendita saadab vaikimisi topelt. - 2TäitmineSõlmed järjekorras, kuni ooteni või lõppsõlmeni. Igaüks kirjutab sammu: mida otsustas, mida väljastas.
- 3KommitaMõjud ja edasiliikumine, üks tehing. See on kogu nipp.
- 4UinubJärgmine
wake_atkirjutatud. Allavoolu ridu ei ole veel, ega neid ka vaja.
Üks käik kontakti ja versiooni kohta
Neliteist päästikut
Mis saab käigu käivitada
Mõned neist on asjad, mida sina teed. Enamus on asjad, mida sinu klient teeb või ei tee — ja tegevuse puudumine on sama hea päästik kui tegevus ise.
Nad saabuvad
form_submit, list_join, contact_created, tag_added ja segment_enter. Segmendi on elav predikaat, nii et „siseneb segmenti“ hõlmab kõiki „on muutunud“ väljendeid — kolm tellimust, üheksakümmend päeva vaikus, kulutab üle läve.
Nad teevad midagi
page_visit saidilõikurilt, message_opened, link_clicked, booking_made ja payment_made. Sõnumi avamine on ise kontakti sündmus, nii et üks lehter saab oodata reaktsiooni viimasele saadetule.
Aeg, või sina
date_field nihkega — sünnipäev, uuendus, „aasta möödunud“, seitse päeva enne või kolm päeva pärast. schedule korduva jaoks. manual teadaande jaoks, mille saadad, sest otsustasid nii.
Sinu oma rakendus
api_event on kohandatud sündmus, mille postitad oma koodist oma tokeniga. Kõik, mida sinu toode teab, saab päästikuks: aktiveeris, kutsus kollega, jõudis piirini, tühistas, ekspordis. Just see muudab meilitööriista sinu toote osaks.
Tagasitulek, otsustatud üks kord
Lehter on kas uuestisisenemise võimaldav või mitte, ja andmebaas seda jõustab: üks käik kontakti ja lehtri kohta, kui sa ei öelnud teisiti. Sama päästik kaks korda samal sekundil ei saa kogemata kahte käiku tekitada.
Sisenemistingimused
Päästik vallandub ja sisenemiskirjeldus otsustab, kas just see kontakt on sobiv — segmendi predikaat ukse ees. Odavam kui tingimussõlm esimesel sammul, ja hoiab graafiku selle kohta, mis juhtub, mitte selle kohta, kes tohib sisse.

Neliteist asja saavad selle käivitada. Kuusteist asja saab seejärel juhtuda.
Kuusteist tegevust ja seitse voolusõlme
Mida lehter suudab, ja kuidas ta otsustab
Saada midagi
send_email, send_sms, send_push, send_letter — neli kanalit, üks graaf — pluss notify_team, kui teavitatav töötab sinu juures.
Muuda kontakti
add_tag, remove_tag, add_to_list, remove_from_list, set_field. Märgistamine käigu pealt on see, mis muudab järgmise lehtri segmendi lihtsaks.
Jõua väljapoole
http_request kellelegi, create_payment sinu enda ühendatud konto vastu, ja book_slot broneerimisressursi vastu. Maksja jääb sinu omaks; keegi ei saa meie kliendiks.
Liigu lehtrite vahel
enter_funnel ja exit_funnel. Ehita üks tervitussari ja kutsu seda neljast kohast, mitte hoia nelja koopiat, mis märtsiks on laiali valgunud.
Loo saatmise hetkel
ai_generate täidab liitmismuutujad iga kontakti kohta, arvestatakse sinu kvoodi mahus ja puhvredatakse loomingu ning kontaktiatribuudi räsi järgi — muidu maksaksid iga adressaadi eest iga saatmise korral.
Oota, haru, jaga, ühenda
wait võtab vastu kestuse, kuupäeva-kellaaja, nädalapäeva ja kellaaja või kuupäevavälja koos nihkega. condition on segmendi predikaat ja- ja ei-haruga. split on A/B/n kaaludega. join toob harud tagasi kokku.
goal — see, mis tegelikult loeb
Eesmärk lõpetab jooksu kõigile, kes selle saavutavad. Nad broneerisid, nad ostsid, nad vastasid: ülejäänud jada tühistatakse neile spetsiifiliselt. Kellelegi ei saadeta „meil on sinust puudust tundnud“ kirja päev pärast tema tagasitulekut, ja just see sõlm hoiab selle ära.
throttle ja quiet_hours
Throttle reguleerib saatmislainet, et madala kiiruspiiriga postkast ei saaks peatusele surutud. Vaiksed tunnid hoiavad kirja kuni tsiviliseeritud ajani — rakendatakse sõnumi tasandil, mitte kopeeritakse igasse graafi harusse.
Kontrollitakse enne käivitumist
Valideerija keeldub sinu ja AI puhul samadest asjadest
Graaf kontrollitakse enne avaldamist, ja kontroll ei ole nõustav. Koodirada on sama, olgu lehter inimese joonistatud või mudeli genereeritud — just seetõttu on genereeritud lehtrid üldse usaldusväärsed.
Täpselt üks sisenemispunkt
Kaks sisenemissõlme on mitmestimõistmine, mida keegi ei märka, kuni nimekirja vale pool ei saa vale jada.
Iga sõlm on kättesaadav
Orvuks jäänud haru on kas viga või kiri, mille arvad välja minevat, aga ei lähe. Mõlemat on vaja teada saada.
Iga tsükkel peab sisaldama ootust
Ahel ilma ootuseta on lõputu tsükkel, mille keskel on saatmine. See reegel on erinevus lehtri ja intsendi vahel.
Igal saatmisel on oma looming
send_email sõlme ilma loomingu ja teemata ei saa avaldada. Kiri õige teema ja tühja sisuga on reaalne veaolukord; siin keeldutakse sellest.
Iga muutuja on teada
Liitmismuutujad valideeritakse avaldamisel. {{frist_name}} on trükiviga, mida näed redigeerimise ajal, mitte „Tere ,“ neljakümnes tuhandes postkastis.
Seejärel simuleeri seda
Käivita reaalne kontakt läbi kogu graafi kuivproovina ja loe tagasi läbitud tee ning iga kirja, mis saadetaks, koos päevaga. Midagi ei lahku hoonest.
Kohmakad juhtumid
Seitse asja, mis murdavad naivi mootori
Igaüks neist on test deterministliku kella taga, sest igaüks murdab implementatsiooni, mis näib täiuslikult korrektne, kuni kohtub reaalsusega.
- 1Lehter, mis lookleb iseendasseLegitiinne, tavaline ja korras — eeldusel, et tsükkel sisaldab ootust, mida valideerija nõuab.
- 2Keegi loobub tellimusest poole teekonna ajalAllasumist kontrollitakse saatmise hetkel, mitte järjekorda paneku hetkel. Järjekorra hetkel kontrollides saadetakse kirjad neile, kes lahkusid ooteaja jooksul.
- 3Lehtrit muudetakse, kui sees on kümme tuhat inimestNad käivad edasi versiooni, millele nad sisenesid, lõpuni. Uued sisenejad käivad uut.
- 4Sama päästik vallandub kaks korda ühe sekundi jooksulÜks jooks, sest unikaalsus on indeks, mitte kontroll millele järgneb sisestus.
- 5Kontakt kustutatakse jooksu ajalJooks lõpeb. Kustutamine, mis jätab jada ikkagi kellelegi adresseerituna, ei ole kustutamine.
- 6Ootus ulatub üle suveaja muudatuse„Kolm päeva hommikul kella üheksal“ tähendab kella üheksat hommikul mõlemal pool kellaaja muudatust.
- 7Töötaja tapetakse saatmise ja edasiliikumise vahelMõjud ja edasiliikumine on üks tehing. Kas mõlemad toimusid või kumbki ei toimunud.
Deterministlik kellIga test murdab ühe usutava implementatsiooni
Kampaaniad on teine pool
Lehter reageerib. Kampaania on ühekordne saadetis: sihtrühm, ajakava, pihustuspiir ja saatmine. See on teistsuguse kujuga asi ja hoitakse tahtlikult eraldi, mitte ei esitata seda lehtrina ühe sõlmega.
Kaks reeglit muudavad selle turvaliseks. Sihtrühm materialiseeritakse üks kord ja keeldub kaks korda jooksutamast — uuesti lahendamine lisaks vaikselt kõik, kes on liitunud pärast saatmise algust, ja deduplitseerimisindeks peidaks selle, takistades duplikaate, mida ta ise lõi. Ja loendurid arvutatakse ümber kohaletoimetamise sündmustest, mitte kunagi ei suurendata kohapeal, nii et uuesti saadetud webhook ei saa aruannet üles puutuda.
Kumb kasutada: kui see juhtub inimese tehtud asja tõttu, on see lehter. Kui see juhtub, sest sa otsustasid selle teisipäeval, on see kampaania. Üllatavalt palju turundusautomaatikast läheb valesti, sundides teist esimese kuju sisse.