Skip to content

D9nni/Distributed-Shop

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

16 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Proiect - OLX distribuit

Scurta descriere

Acest proiect simuleaza functionarea unui site care permite publicarea de anunturi de vanzare de produse, similar cu OLX.

Utilizatorii pot fi vanzatori (sellers) sau cumparatori (customers). Pentru a cumpara un produs, acestia au puncte pe site (pe care le pot cumpara cu bani reali, teoretic). Fiecare produs expus are un pret in puncte.

Site-ul e distribuit (componenta de server web poate rula pe mai multe instante).

Componente:

Fiecare componenta ruleaza intr-un container separat de docker, iar intreaga aplicatie este un stack.

  1. Modul de autentificare si gestionare roluri (Keycloak)
  2. Baza de date (PostgreSQL)
  3. Server web HTTP (Flask)
  4. Cache distribuit (Redis)
  5. Broker de notificari (MQTT)
  6. Modul pentru cereri de inregistrare utilizatori noi (Flask)

Flux normal de functionare

Din perspectiva utilizatorului nou: Utilizatorul intra pe site, se logheaza (sau isi creeaza un cont direct din Keycloak daca nu are deja unul). By default va primi roluri default din Keycloak, dar daca doreste rolul de seller sau de customer trebuie sa publice o cerere in platforma de tichete si un administrator ii va da acces.

Din perspectiva cumparatorului: Cumparatorul poate intra pe lista cu toate produsele sau poate cauta un produs dupa nume in bara de search de pe prima pagina. Poate intra pe pagina unui produs si il poate cumpara, daca acesta mai e disponibil si daca are banii necesari. In pagina sa proprie poate vedea si ce produse a cumparat in trecut si cati bani mai are.

Din perspectiva vanzatorului: Seller-ul are un dashboard unde poate vedea toate anunturile publicate de el. Anunturile nu pot fi editate, pot fi doar sterse si repostate. Vanzatorul primeste notificari si bani in cont cand un cumparator a cumparat un produs.

Din perspectiva adminului: Daca un utilizator posteaza anunturi nepotrivite, administratorul le poate sterge si ii poate restrictiona contul dandu-i rolul de 'banned'. Adminul are un dashboard de unde poate administra toate anunturile existente si poate face cereri catre api end-ul /delete/<product_id> pentru a sterge un anunt.

Rute

GET

/ - home
/login - login si register
/callback - redirect pt Keycloak
/customer - customer dashboard
/seller - seller dashboard
/admin - admin dashboard
/logout - logout
/upload-product - formularul de upload
/products - lista tuturor produselor
/product/<id> - pagina unui produs <id>
/buy/<id> - cumpara produsul <id>
/profile/<user> - profilul lui <user>
/messages - mesajele primite/trimise

POST

/upload-product - pentru formularul din aceeasi pagina
/profile/<user> - trimite mesajul din formular catre <user>

Modul pentru tichete

Am considerat oportuna separarea partii de tichete de restul site-ului, deoarece aceasta componenta va fi folosita mai rar decat intregul site. Pe aceasta platforma secundara utilizatorii pot crea cereri pentru inregistrarea unui cont care trebuie sa fie aprobate de un administrator.

Ceea ce e interesant la aceasta platforma e faptul ca este folosita fara un sistem de login propriu, pot intra pe ea doar utilizatorii care sunt logati deja pe platforma principala si au un token de sesiune valid.

Rutele modulului pentru tichete sunt urmatoarele:

GET

/ - home
/create_ticket - ruta cu formular pentru un nou ticket
/opentickets - tichetele deschise pt admin
/mytickets - tichetele mele pt user
/ticket/<tid> - vezi tichetul cu id tid si formular pt raspuns

POST

/create_ticket - primeste datele din formular si salveaza noul tichet
/ticket/<tid> - raspunde la tichet prin formular

Notificari

Cand un eveniment se produce, backend-ul de Flask posteaza un mesaj catre brokerul de MQTT in topicul asociat utilizatorului implicat. Brokerul distribuie mesajul catre utilizato, care asculta cu un client MQTT pe topicul sau. Daca clientul e conectat, ii va creste numarul de notificari necitite pe clopotel si in partea din dreapta jos va vedea un text.

Exista notificari pentru urmatoarele evenimente:

  • am primit un mesaj
  • cineva a cumparat produsul meu
  • produsul meu a ramas cu stoc 0

Tranzactii

Clientii au niste puncte locale la nivelul bazei de date cu care pot face tranzactii.

Tranzactiile sunt pastrate persistent in baza de date. Cand un client cumpara un produs ii scad punctele din cont.

Conditiile de cursa care ar fi putut aparea la cumpararea unui produs cand clientul nu are fonduri suficiente sau cumpararea unui produs care nu mai e in stoc au fost tratate prin salvarea datelor despre stoc si banii utilizatorului logat in memoria cache distribuita Redis.

Build

docker build flask -t flask-lad
docker build registration -t flask-registration
docker stack deploy -c stack/stack.yml olx
docker stack services olx

Scalabilitate

Serviciul de web poate rula pe mai multe instante distribuite. Pentru a fi mai clar asta, pe pagina home apare si numele host-ului de pe care ruleaza serverul.

docker service scale olx_web=NUM_REPLICAS

Testare

Functionarea corecta a componentelor individuale a fost testata prin teste unitare.

  • Pentru functiile care interactioneaza cu baza de date exista testele test_dbconn.py.

About

Platforma web distribuita de vanzare produse, implementata ca arhitectura de microservicii scalabile cu docker swarm.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages