de Pier Bover

Funcțiile Cloud Firebase: cel mare, mehul și urâtul

0*P7XjBh6QtYZ5z7wJ

Cand Am revizuit Firebase anul trecut, m-am plâns că nu a fost complet fără server. Un server Node era încă necesar pentru funcționalități comune, cum ar fi trimiterea de e-mailuri sau crearea de miniaturi.

Firebase Cloud Functions au fost anunțate câteva luni mai târziu. Serviciul este încă în versiune beta, dar îl folosesc fericit de câteva luni în producție.

Să vedem cum merge.

Ce sunt funcțiile Firebase Cloud?

Dacă nu ați auzit niciodată de funcțiile cloud, conceptul este destul de simplu. Implementați o logică concisă pe un server sub formă de funcții, iar unii elfi sârguincioși pot fi invocați magic din limb pentru a face o sarcină pentru dvs. Toate acestea fără să se preocupe de infrastructură și să plătească doar pentru resursele de execuție.

În multe cazuri, această nouă paradigmă poate simplifica scrierea, menținerea și rularea codului backend.

Funcțiile Cloud Firebase, în special, sunt ca blocurile Lego pe care le puteți conecta la orice serviciu Firebase. De exemplu, o funcție poate fi declanșată atunci când o imagine este încărcată în Firebase Storage pentru a crea o miniatură sau poate curăța unele date de utilizator atunci când un nod este șters în baza de date în timp real. Aproape orice lucru de interes care se întâmplă în Firebase poate declanșa o funcție.

Dacă acest lucru nu este suficient, puteți utiliza și HTTP pentru a declanșa funcții cu GET, POST etc. Vedeți acest videoclip uimitor despre cum să combinați Firebase Hosting cu Cloud Functions pentru a crea o aplicație Express completă:

Cel Mare

Infrastructura nu devine mai ușoară decât aceasta

Infrastructura este complet abstractizată de dvs., la fel ca restul Firebase. De fiecare dată când se declanșează o funcție, un nou server virtual prinde viață, își face treaba și revine la limb. Magia Google Cloud va declanșa în mod automat funcțiile și scala infrastructurii în funcție de volumul de lucru.

Prețuri

Funcțiile cloud, în general, sunt foarte rentabile. Este dificil să comparăm prețurile furnizorilor de cloud, dar pot spune că, pe baza experienței mele, au fost funcțiile Cloud Firebase ridicol ieftin. Este greu de crezut că Google câștigă bani din asta.

Ușor de folosit

Ca de obicei cu Firebase și Google, documentele sunt grozave și nu veți face acrobații mentale ia-l. Există, de asemenea tone de probe pe Github ca să începi. Autentificarea implementării este gestionată de CLI-ul Firebase, astfel încât pornirea și funcționarea unei lumi salut este literalmente:

firebase init functionsfirebase deploy

Cred că simplitatea utilizării Firebase și Google Cloud în general este minunată, în special în comparație cu concurența.

Flexibil

Așa cum am scris înainte, aceste funcții pot fi declanșate de tot felul de evenimente. Pun pariu că nu vei rămâne fără idei despre cum să le integrezi cu proiectul tău Firebase sau chiar cu restul stivei tale.

Iată câteva dintre problemele pe care le-am rezolvat folosind Firebase Cloud Functions:

  • Generați PDF-uri pentru un serviciu de facturare online folosind Phantom.js și semnați aceste facturi cu un serviciu guvernamental
  • Conectați un serviciu Go cu un furnizor SOAP terț (ugh)
  • Trimiteți e-mailuri prin HTTP de oriunde din stiva noastră

Meh

Frigul începe

Scalabilitatea este excelentă, dar timpul de rulare poate fluctua extrem de mult. O funcție simplă Hello World poate dura 3ms pentru a-și face treaba sau 100ms.

functions.https.onRequest((request, response) => {    response.send(“Hello from Firebase!”);});
Functiile Cloud Firebase cel mare mehul si uratul

Aceste fluctuații sunt cauzate de timpii de pornire ai serverului virtual. Dacă serverul virtual care rulează funcția dvs. este treaz, funcția se va declanșa instantaneu. Dar dacă serverul trebuie să fie adus din limb, evident va avea nevoie de mai mult timp pentru a începe să funcționeze. În funcțiile de limbă cloud, aceasta este denumită pornire caldă și rece.

În practică, nu vă puteți baza pe timpi de răspuns consecvenți decât dacă vă ascundeți datele în cache, așa cum este descris în videoclipul anterior, sau nu utilizați hacks pentru a vă menține funcțiile calde.

Din păcate, pornirile la rece sunt un aspect inevitabil al gestionării funcțiilor cloud (de la orice furnizor). Va trebui să țineți cont de acest lucru atunci când decideți să utilizați o funcție cloud pentru a rezolva ceva.

Fără programator (cron)

Funcțiile cloud sunt perfecte pentru a efectua sarcini cu trafic redus, cum ar fi generarea de rapoarte sau efectuarea de copii de siguranță periodice la ora 02:00, dar cu Firebase sau Google Cloud nu există o modalitate ușoară de a vă declanșa funcțiile pe baza unui program.

Echipa Firebase recomandă crearea unui proiect App Engine pentru a orchestra aceste declanșatoare. Serviciul chiar imploră ceva de genul Programator Heroku.

Numai JavaScript

Eh, sunt ok cu JavaScript, dar atât Azure, cât și AWS acceptă multe alte limbi. Este ironic faptul că Google nu acceptă Go în serviciul său de funcții cloud, dar AWS o face.

Nodul 6

Din nou, concurența se descurcă mai bine. Ambele funcții AWS Lambda și Azure rulează deja pe nodul 8. Cel mai mare dezavantaj aici este revenirea la promisiuni fără asincronizare / așteptare sau necesitatea de a configura Babel în proiectul dvs.

Urâtul

Flux de lucru Dev

Cu exceptia Funcții declanșate de HTTP, nu vă puteți rula funcțiile la nivel local. Funcțiile declanșate de un serviciu Firebase trebuie să fie implementate în cloud.

Acest lucru are multe implicații urâte:

  • Micile greșeli ajung să coste mult timp, deoarece funcțiile noi necesită câteva minute pentru a începe să lucreze.
  • Funcțiile implementate nu au versiuni evidente. Toate jurnalele cu aceeași funcție par a fi din aceeași versiune. Nu este niciodată clar când funcționează efectiv noile funcții, deci singura dvs. alegere este să declanșați manual funcțiile și să vedeți ce se întâmplă ™.
  • Fără restituiri

Medii

Pe lângă punctele anterioare, gestionarea mediilor este… complicată.

Puteți adăuga variabile de mediu proiectelor de funcții folosind Firebase CLI dar, la fel ca alte aspecte ale Firebase, aceasta este o abordare naivă care nu scară bine.

Veți avea nevoie de acreditări pentru a accesa aproape orice în afara sandbox-ului Firebase. Pentru alte servicii Google Cloud, aceste acreditări vin sub formă de .json fișiere. Înmulțiți acest lucru cu fiecare mediu (dev, producție, organizare) și puteți ajunge la o mizerie regală.

Am ajuns să redenumesc manual fișierele de acreditări înainte de a implementa sau, mai rău, de a implementa toate acreditările și de a o selecta pe cea potrivită în timpul rulării. Vă rog, anunțați-mă în comentarii dacă ați găsit o cale de a rezolva acest lucru.

Mi-ar plăcea să văd un Mediu inconjurator fila din Consola Firebase unde aș putea gestiona cu ușurință aceste setări pentru întregul proiect Firebase. Comutarea între medii ar trebui să fie la fel de ușoară ca firebase use production.

Concluzie

În afară de unele fricțiuni în timpul fazei de dezvoltare, experiența mea cu Firebase Cloud Functions a fost pozitivă. Odată implementate, aceste lucruri sunt fiabile și necesită întreținere zero, așa cum a promis. Deci da, Firebase este în cele din urmă complet fără server. Ura!

Dacă utilizați deja Firebase, este într-adevăr un brainer. Funcțiile Cloud Firebase sunt un complement excelent pentru proiectul dvs., chiar dacă serviciul este încă în versiune beta.

Pe de altă parte, este corect să spunem că competiția are un produs mai matur. Dacă nu sunteți investit în Firebase sau Google Cloud și aveți în vedere utilizarea funcțiilor cloud în stiva dvs., probabil că ar trebui să căutați și ce AWS sau Azure au de oferit.

Pentru a fi complet sincer, sunt puțin îngrijorat de faptul că serviciul este încă în versiune beta. A trecut peste un an de când a fost anunțat și progresul se simte dureros de lent. Concurența pare mult mai dedicată produselor sale cloud, chiar dacă, potrivit Diane Greene, CEO pentru companiile cloud Google, Google Cloud este „Nor cu cea mai rapidă creștere”.

Asta e tot.

Notă: Într-o versiune anterioară a acestui articol am susținut că nu era posibil să scriu teste pentru funcții non HTTP. Acest lucru este greșit și aici sunt documentele despre cum să faci asta.