Design della ricerca di prodotti nell'applicazione e-commerce?

0

Sto cercando di creare un'architettura di alto livello per la ricerca di prodotti in applicazioni di e-commerce scalabili come Amazon / Best Buy, ecc.

Caso di utilizzo: - cerca qualsiasi elemento in testo libero. Dì prodotto di ricerca utente "galaxy white", può essere cellulare, aria condizionata, marca di abbigliamento, prodotto beaty ecc. Devo visualizzare tutti i prodotti nella pagina. Per ora, esci dal prodotto di classificazione.

Progettare i punti dati: -

  1. Ci sarà un database ben definito con ogni frammento che contiene una particolare categoria di prodotto.
  2. Allo stesso modo ci saranno server cache distribuiti (possono essere redis o memcached) dove ogni server conterrà un dato specifico della categoria di prodotto. per esempio un server può contenere dati mobili con chiave come nome del marchio e valore come mappa di nuovo. Questa mappa nidificata conterrà il modello come chiave e il dettaglio del prodotto come chiave. I dettagli del prodotto possono inoltre contenere un elenco di venditori ecc.
  3. Inoltre memorizzeremo nella cache la Product_category_map che conterrà i nomi dei prodotti più ricercati come categorie chiave e di prodotto come elenco valori. Potrebbe essere caricato all'avvio del server e potrebbe essere aggiornato dopo un intervallo di tempo regolare di 4 ore. Ad esempio: - La mappa conterrà "galassia" come chiave e valore come {"Mobile", "indumento"}
  4. Ora, quando l'utente cerca il prodotto "galaxy white", cercherà nella cache Product_category_map, se trova lì, otterrà il nome delle categorie di prodotto come valore
  5. Se non è stato trovato nel passaggio 4, la chiamata parallela (riduci mappa) passerà a tutti i DB a caratteri grigi per il recupero della categoria di prodotto
  6. Una volta trovate le categorie di prodotti, recupererà tutti i prodotti corrispondenti dalla cache, ovvero dal rispettivo server cache per ogni categoria e quindi applicare ulteriori filtri come descrizione / colore / altro_attributo è bianco in questo caso.
  7. Un altro approccio alternativo al passaggio 6 può essere, recuperare i prodotti corrispondenti dal DB shar per ciascuna categoria. Qui posso usare l'indice DB per il filtro sull'attributo bianco

Voglio confermare sotto i punti

  1. Approccio al punto 3. Quando l'utente digita un testo, shoild costruisco la cache Product_category_map in anticipo, recuperandola da lì. Non sono sicuro se sia buono approccio a caching di tutti i nomi dei prodotti contro la loro categoria o dovrebbe recuperare le categorie dai DB sharded (in parallelo usando framework come mapreduce)
  2. Tra l'approccio 6/7, qual è il migliore?
  3. Il desgign è simile a qualsiasi applicazione di e-commerce scalabile?
posta user3222249 23.03.2017 - 02:20
fonte

3 risposte

3

Stai ottimizzando prematuramente strutture che saranno estremamente costose e di cui quasi certamente non avrai bisogno. L'unico modo in cui un nuovo sistema di e-commerce richiede la scalabilità e le prestazioni di Amazon è se lo stai scrivendo come rimpiazzo diretto per il sistema esistente di Amazon. Altrimenti, il tuo sistema sarà più piccolo (probabilmente di più ordini di grandezza) ed eseguirà meno transazioni al secondo (allo stesso modo) per il prossimo futuro.

Progetta ciò di cui hai bisogno ora, non quello che pensi possa aver bisogno di un anno o cinque lungo la linea. Ma progettalo con un'interfaccia astratta, quindi se hai bisogno di cambiarlo, puoi farlo senza preoccuparti che altre parti del sistema interagiscano con ît. Ecco come si costruisce un sistema scalabile.

Più in particolare, non iniziare con un design dettagliato. Inizialmente, un singolo server di database dovrebbe essere più che adeguato. Se trovi che è necessario ridimensionarlo, la replica è molto più semplice rispetto a sharding, quindi dovrebbe essere il tuo primo approccio. Aggiungere cache al front-end può essere d'aiuto, ma eseguirle sul tuo server front-end ... Le cache distribuite sono meno performanti e improbabili che siano necessarie.

    
risposta data 22.04.2017 - 14:30
fonte
1

Hai cercato di utilizzare una piattaforma di ricerca consolidata anziché un RDBMS per la ricerca in negozio del cliente?

Ad esempio Solr è open source e utilizzato da diverse aziende e strutture come Hybris in un contesto di e-commerce. Supporta concetti come sinonimi, tokenizzazione localizzata, derivazione o ricerca fuzzy out-of-the-box che richiederebbe un certo sforzo per replicare con un RDBMS. È anche abbastanza semplice scalare usando meccanismi come repliche e sharding. Rimuove la tensione dal tuo RDBMS, che può quindi concentrarsi sulla tracciatura dei dati operativi del prodotto.

    
risposta data 23.11.2018 - 14:30
fonte
0

Sembra molto complicato, molto incline a prestazioni scadenti e resistente alle principali strategie di sintonizzazione.

C'è una ragione per cui desideri creare un motore / strategia di caching da zero quando un RDBMS decente ne include uno come standard? All'interno di un RDBMS utilizzato principalmente come sorgente di lettura, i dati più utilizzati verranno memorizzati nella cache entro i primi minuti di funzionamento, dopodiché rimarrà disponibile fino a quando non sarà più tra i più utilizzati. Sì, dovrai fare un po 'di lavoro in SQL per avere query ben progettate che supportino le prestazioni del sistema, ma queste informazioni sono piuttosto ben documentate.

È possibile aggiungere più memoria al server del database, aggiungere più core del processore, scalare orizzontalmente aggiungendo istanze del database con mirroring, sebbene sia possibile trovare un'istanza del database in grado di supportare un lotto di server delle app in modo dovrai colpire enormi volumi prima che questo diventi necessario. Questo approccio avrà anche il vantaggio di evitare l'ottimizzazione prematura. Puoi scalare aggiungendo server Web, load balancer, cache e server di database come richiesto e in risposta a problemi del mondo reale piuttosto che creare un'architettura eccessivamente complicata e costosa per un sito web che non decolla come sperato o se lo fa, finisce con problemi in un'area che non avevi previsto.

    
risposta data 23.03.2017 - 07:08
fonte