Come progettare un sistema di distribuzione delle richieste (Un po 'simile a Uber)

-2

Sto progettando un'app di consegna in cui un Richiedente richiede una cosa dal suo cellulare e la richiesta viene inviata a più agenti sul campo. Quando un agente accetta la richiesta, verrà assegnato al richiedente e dovrà effettuare la consegna.

Voglio alcuni suggerimenti per l'architettura di questo sistema. Sto usando lo stack .Net. Ecco alcune sfide:

1) In qualsiasi momento verranno notificati solo 5 agenti. Nel caso in cui nessuno di loro accetti la richiesta, la richiesta verrà inviata ad altri 5. Gli agenti che sono stati notificati per una particolare richiesta verranno registrati nel database. Nel caso in cui un agente accetti una richiesta, il database verrà aggiornato. Se dopo 10 secondi nessuno degli agenti accetta la richiesta, il servizio Windows invierà la richiesta ai successivi 5 agenti.

Domanda: È giusto continuare a eseguire la scansione del database con query ogni 5 secondi utilizzando un servizio Windows per verificare se la richiesta è stata accettata? Il sistema deve essere progettato per carichi pesanti.

2) Il richiedente può pianificare una richiesta.

Domanda: È giusto continuare a eseguire la scansione del database con query ogni 5 secondi per verificare se l'orario pianificato si è avvicinato?

Sto usando l'API WEB ASP.Net per ricevere informazioni dal cellulare, FCM per inviare notifiche al cellulare e windows sevice per completare le 2 attività precedenti.

Per favore consiglia un approccio, un'architettura e le tecnologie ottimali da utilizzare per ottenere questo risultato.

    
posta delta-nada 24.01.2017 - 18:27
fonte

2 risposte

3

Will it be right to keep scanning the database with queries every 5 seconds using a windows service to see if the request has been accepted?

In caso di dubbio, spingere le informazioni anziché tirarle. Ricevi le informazioni che la richiesta è stata accettata, presumibilmente dalla tua web API. Quando gestisci quel messaggio per inserirlo nel database, devi anche inoltrarlo a chiunque altro stia ascoltando.

Ci saranno problemi di concorrenza, quindi usare la verifica dei vincoli del database è una buona idea. Qualsiasi altro tentativo di accettare la richiesta dovrebbe fallire e avvisare l'utente.

Will it be right to keep scanning the database with queries every 5 seconds to see if the scheduled time has approached?

Invece di eseguire la scansione, crea un'attività pianificata. Ci sono molte librerie con questa funzionalità; Hangfire sembra una scelta solida. Quando ricevi il messaggio per pianificare una richiesta, accoda un compito per gestirlo in qualsiasi momento sia stato richiesto.

    
risposta data 24.01.2017 - 20:00
fonte
1

In alternativa puoi utilizzare una sorta di servizio di accodamento come i servizi web Amazon SQS o rabbitMq per mantenere la richiesta in giro (attraverso più istanze del tuo servizio) finché la richiesta non viene accettata. Il database deve essere aggiornato solo quando la richiesta viene consegnata a un agente (ad esempio una tabella chiamata "offerte"). Il messaggio può anche contenere l'elenco degli agenti che hanno già ricevuto la richiesta. Una volta accettata la richiesta, è possibile eliminarla dalla coda e contrassegnare le "offerte" come rifiutate / scadute / accettate. I tuoi agenti dovrebbero essere avvisati con qualche servizio come mqtt quando un'offerta è disponibile o non più disponibile (perché qualcun altro l'ha accettata).

    
risposta data 24.01.2017 - 20:44
fonte

Leggi altre domande sui tag