Himeji: Un sistem centralizat scalabil pentru autorizare la Airbnb

In ultimii ani, ingineria Airbnb s-a mutat de la o arhitectura monolitica Ruby on Rails la o arhitectura orientata spre servicii. In arhitectura noastra Rails, am avut un API pe resursa pentru a accesa datele subiacente. Aceste API-uri au avut verificari de autorizare pentru a proteja datele sensibile. simpson porno Deoarece exista o singura modalitate de a accesa datele unei resurse, gestionarea acestor verificari a fost usoara. In tranzitia la SOA, am trecut la o arhitectura stratificata in care exista servicii de date care impacheteaza baze de date si servicii de prezentare hidratate de la mai multe servicii de date. Abordarea initiala a mutarii verificarilor de permisiune de la monolit la SOA a fost mutarea acestor verificari in serviciile de prezentare. video porno maman salope Cu toate acestea, acest lucru a dus la mai multe probleme:

  1. Verificari de autorizare duplicate si dificil de gestionat: Adesea, mai multe servicii de prezentare care furnizau acces la aceleasi date subiacente aveau cod duplicat pentru verificari de autorizare. In unele cazuri, aceste verificari nu au fost sincronizate si au fost greu de gestionat.
  2. Aflati mai multe servicii: majoritatea acestor verificari de autorizare necesita apelarea la alte servicii. teens porno Acest lucru a fost lent, sarcina a fost greu de intretinut si a afectat performanta generala si fiabilitatea.

Verificari anticipate ale autorizatiei

Verificari de autorizare bazate pe Himeji

Pentru a aborda aceste probleme, am facut doua modificari:

  1. Am mutat verificarile de autorizare in serviciile de date, in loc sa efectuam verificari de autorizare numai in serviciile de prezentare. Acest lucru ne-a ajutat sa amelioram problemele de verificare duplicate si inconsistente. porno hup
  2. Am creat Himeji , un sistem de autorizare centralizat bazat pe Zanzibar, care se numeste din stratul de date. Stocheaza date despre permisiuni si efectueaza verificarile ca o sursa centrala de adevar. In loc sa ne ventilam la citire, scriem toate datele privind permisiunile atunci cand resursele sunt mutate. porno francais en famille Avem grija de scrieri in loc de citiri, avand in vedere volumul nostru de munca greu de citit.

Himeji expune un API de verificare pentru serviciile de date pentru a efectua verificari de autorizare. Semnatura API este urmatoarea:

// Poate directorul sa faca relatii cu entitatea?



verificare booleana (entitate, relatie, principal)

O verificare a permisiunilor va arata dupa cum urmeaza, care afirma „poate utilizatorul 123 sa scrie in descrierea listei 10?”:

check (entitate: „LISTING: 10: DESCRIPTION”,



relatie: WRITE,



principal: User (123))

Acest lucru este interpretat de Himeji ca afirmatia „este utilizatorul 123 in setul de utilizatori care pot scrie in descrierea listei 10?”. jeune francaise porno

Similar cu Zanzibar, unitatea de baza de stocare pentru Himeji este un tuplu in forma entitate # relatie @ principal.

  • O entitate este tripla (tip de entitate: id entitate: parte entitate); aceasta provine dintr-o abordare a limbajului natural: LISTA: 10: DESCRIERE → „listarea descrierii 10”.
  • Un ID de entitate este ID-ul corespunzator din sursa de date a adevarului. porno kabyle
  • Un tip de entitate defineste permisiunile de date pentru care se aplica. Exemple: LISTARE, REZERVARE, UTILIZATOR
  • O parte de entitate este o componenta optionala. Exemple: DESCRIERE, PRET, WIFI_INFO
  • O relatie descrie relatia, cum ar fi PROPRIETAR, CITITI sau SCRIVE, dar poate fi specifica cazurilor de utilizare; unele exemple includ HOST pentru gazda unei rezervari si DENY_VIEW pentru refuzul accesului la o lista. video porno jeune
  • Un principal este fie o identitate de utilizator autentificat precum User (123), fie o alta entitate precum Reference (LISTING: 15).

Daca ar trebui sa scriem un tuplu pentru fiecare permisiune exacta care este verificata, volumul de date si denormalizarea ar creste exponential. De exemplu, ar trebui sa scriem atat LISTING: 10 # WRITE @ User (123), cat si LISTING: 10 # READ @ User (123) pentru ca proprietarul listei sa poata citi si scrie. xvideo porno

Pe baza configuratiei Zanzibar, folosim un limbaj de configurare bazat pe YAML care permite rezolutia verificarilor permisiunilor prin algebra setata, permitand unui dezvoltator sa mapeze o verificare la o operatie setata:




LISTA : ‘#WRITE’:



union:



– ‘#WRITE’



– ‘#OWNER’



‘#READ’:



union:



– ‘#READ’



– ‘#WRITE’

Sa presupunem ca utilizatorul 123 este proprietarul listarii 10. Apoi baza de date va avea tuplul LISTING: 10 # OWNER @ User (123).

Cand solicitam verificarea (entitate: „LISTING: 10”, relatie: WRITE, userId: 123), Himeji interpreteaza LISTING # READ ca uniunea READ & WRITE si tranzitiv LISTING # WRITE ca uniunea WRITE & OWNER. chez cathy porno Prin urmare, va prelua urmatoarele din baza de date, cu orice potriviri apartinand setului LISTING # WRITE:

Interogare LISTING: 10 # WRITE @ User (123) => Gestionare



interogare LISTING: 10 # OWNER @ User (123) => Potrivire utilizator (123)

De exemplu, utilizatorul 123 trebuie sa aiba doar LISTING: 10 # OWNER @ User (123) pentru a fi in setul LISTING: 10 # WRITE.

Am observat ca entitatile de la Airbnb acorda frecvent acces altor entitati ca urmare a existentei lor. De exemplu, un oaspete al unei rezervari obtine acces la locatia unei inregistrari, impreuna cu alte informatii ale listei. mon porno du jour Reprezentam acest caz de utilizare cu un tuplu in care principalul este o referinta la o entitate, adica LISTING: $ id # RESERVATION @ Reference (RESERVATION: $ reservationId). Acest lucru ne permite sa exprimam conceptul ca un utilizator din setul „invitat” al unei rezervari care se afla in setul „rezervare” al unei listari se afla in setul LISTING: LOCATION # READ, minimizand cantitatea de date care trebuie stocate. :

LISTA :



LOCATIE:



‘#READ’:



union:



– # proprietar – LISTA



: $ id # RESERVARE @



Referinta (REZERVARE: $ reservationId # GUEST)

In cazul in care aceasta abordare difera de Zanzibar este ca un astfel de tuplu nu contine o relatie (adica Referinta (REZERVARE: $ id # GUEST)) in cadrul principalului. swinger porno Relatia care urmeaza unei entitati de referinta este statica si recuperata din configuratie. Luand exemplul listarii si apoi verificand alte cazuri de utilizare, am constatat ca, de obicei, va fi urmata o referinta la relatii multiple. In produsul nostru, nu exista variatii in setul de relatii utilizate intre doua tipuri de entitati; o modificare a setului inseamna o modificare a produsului si se aplica tuturor tipurilor de entitati. porno dans la rue Daca setul de relatii intre doua tipuri de entitati (adica Referinta (REZERVARE: $ id # GUEST), Referinta (REZERVARE: $ id # COTRAVELLER), Referinta (REZERVARE: $ id # BOOKER), .



  • porno avec scenario
  • nabilla porno
  • porno camping
  • porno anal francais
  • yasmine porno
  • marocaine porno
  • telerealite porno
  • rue porno
  • plombier porno
  • fre porno
  • porno algérien
  • pussy porno
  • recit porno inceste
  • porno beau pere
  • kelly helard porno
  • femme ronde porno
  • actrice porno blonde
  • porno netflix
  • film porno français complet
  • film porno complet francais





.. rue du porno ) are dimensiunea M, scriind un tuplu pentru fiecare dintre acestea duce la N * M tupluri. Tragand relatia in configuratie,

La momentul executarii citirii, sa presupunem ca urmatoarele tupluri sunt stocate in baza de date:

LISTA: 10 # PROPRIETAR @ Utilizator (123)



LISTA: 10 # REZERVARE @ Referinta (REZERVARE: 500)



REZERVARE: 500 # GUEST @ Utilizator (456)

Acum, daca un client trimite o cerere precum:

verificati (LISTA: 10: LOCATIE # CITITI, Utilizator (456))

apoi pe baza configuratiei, Himeji emite prima preluare a bazei de date pe baza informatiilor din cerere si a configurarii de mai sus:

LISTARE interogare: 10 # REZERVARE => Referinta potrivire (REZERVARE: 500)



LISTARE interogare: 10 # OWNER @ User (456) => Gol

Himeji va emite apoi a 2-a preluare DB, inlocuind ID-ul rezervarii gasite, unde o potrivire indica faptul ca utilizatorul 456 se afla in setul de utilizatori carora li se permite sa citeasca listarea locatiei 10.

Interogare REZERVARE: 500 # GUEST @ User (456) => Match User (456)

Himeji este impartit in trei straturi:

  • Stratul de orchestratie primeste cereri de la clienti si este responsabil pentru emiterea preluarilor pentru date, conform logicii de configurare si analizeaza rezultatele. porno maison Stratul de orchestratie se directioneaza catre stratul de cache cu hash consistent.
  • Stratul de stocare in cache , care este impartit si reprodus (o instanta per AZ per fragment), este responsabil pentru filtrarea in memorie si deduplicarea incarcarilor din baza de date in cazul ratarilor. Fiecarei fragmente i se atribuie un set de date pe care sa le detina prin hash consistent. video one porno Tintim o rata de accesare de ~ 98% pe cache.
  • Stratul de date , care consta din baze de date impartite logic.

Cele mai semnificative schimbari pe care le-am facut lui Himeji cu privire la configurarea Zanzibarului sunt urmatoarele:

  1. Separati nivelul de orchestrare a cererii de nivelul cache, astfel incat nivelul de orchestratie sa poata fi actualizat mai usor fara a reporni cache-ul. porno français vintage
  2. Invalidati fragmentele cache pe baza mutatiilor publicate din bazele de date.
  3. Utilizati Amazon Aurora pentru stocarea bazelor de date ca parte a calatoriei noastre in cloud, care difera de utilizarea de Zanzibar a Spanner.

Implementam aceleasi caracteristici de fiabilitate (de acoperire, de stocare in cache cu niveluri) si de descarcare a sarcinii ca si Zanzibar pentru disponibilitate. yaoi porno

Himeji serveste verificari in productie de aproximativ un an, iar randamentul sau a crescut de la 0 in martie 2020 la 850.000 de entitati / sec in martie 2021, mentinandu-si in acelasi timp obiectivele de disponibilitate si latenta in ultimul an:

Disponibilitate 99,9990%



P50 Latenta 1,8 ms



P95 Latenta 7 ms



P99 Latenta 12 ms

Pentru a reduce timpul de integrare si a stimula adoptarea dezvoltatorilor, am construit cateva instrumente precum:

  • Completare bazata pe configuratie: migrarea verificarilor de permisiune existente in Himeji ne-a impus sa completam tuplurile de permisiune pentru entitatile existente. In loc ca fiecare proprietar de servicii de date sa isi construiasca propriul flux de umplere, am construit o solutie generica bazata pe Apache Airflow si Apache Spark. actrices porno Proprietarii de servicii trebuie sa furnizeze doar o mica configurare care sa indice modul in care ar trebui sa se formeze tuplul lor din exporturile bazei de date.
  • Generarea automata de coduri: Pentru a facilita integrarea, am furnizat scripturi pentru generarea automata a codurilor Java si Scala.
  • Client gros: am furnizat unui client http gros cu jurnal, valori si controale de lansare a migrarii. mario porno
  • Instrument de interfata pentru depanare si sarcini unice: investigarea problemelor de permisiune unica poate deveni obositoare si necesita verificarea datelor de permisiune scrise in sistem, asa ca am construit o interfata de utilizare pentru a analiza datele si a remedia problemele de permisiuni.

Sistemul de autorizare Himeji, bazat pe Zanzibar, unifica datele si logica autorizatiei pentru Airbnb. Inainte de introducerea sa, a fost dificila mentinerea consistentei si a performantei pe bucati logice disjuncte. Himeji utilizeaza un model de date simplu, cu o configuratie logica flexibila, pentru a centraliza toate produsele si autorizarea datelor. Himeji se extinde asupra scalabilitatii si atributelor de performanta ale Zanzibarului si impinge latentele mai mici prin cache-ul distribuit cu niveluri ridicate de acces. Toate acestea impreuna au ca rezultat ca Himeji sa stocheze zeci de miliarde de relatii si sa deserveasca aproape un milion de autorizatii de entitati pe secunda, mentinand in acelasi timp o latenta scazuta si o disponibilitate ridicata.

Himeji a fost posibil prin contributiile multor membri ai echipei din cadrul Airbnb. Multumim membrilor anteriori si actuali ai echipei – Max Burkhardt, Alex Rosenblatt, Jefferson Lee, Divya Gupta, Clare Liu, Houkun Li, Leelakrishna Nukala, Karen Kim, Gary Leung, Ryan Flood, Tony Tran si Gurer Kiratli. Multumiri suplimentare conducerii noastre actuale si anterioare, care sprijina incredibil aceasta lucrare – Anish Das Sarma, Vijaya Kaza, Jason Sobel, Bipin Suresh, Marc Blanchou, Raymie Stata si Aristotel Balogh.

Aceasta munca si multe lucruri interesante se intampla intotdeauna la Airbnb. Daca doriti sa ni se alature, consultati pagina noastra Cariere Airbnb.

„Rails” si „Ruby on Rails” sunt marca inregistrata a lui David Heinemeier Hansson.

Apache Kafka, Apache Airflow, Apache Spark si Apache sunt marci comerciale inregistrate sau marci comerciale ale The Apache Software Foundation in Statele Unite si / sau in alte tari.

AWS si Amazon Aurora sunt marci comerciale ale Amazon.com, Inc. sau ale filialelor sale din Statele Unite si / sau alte tari.

Java este marci comerciale inregistrate ale Oracle si / sau ale afiliatilor sai.

Toate marcile comerciale sunt proprietatile proprietarilor respectivi. Orice utilizare a acestora are doar scop de identificare si nu implica sponsorizare sau aprobare.