Come progettare gli URI per avviare lavori batch in un servizio RESTful

6

Se voglio eseguire un lavoro alla fine del mese per calcolare la commissione per tutti i consulenti di vendita in base ai dati correnti della transazione, ad esempio il tasso di commissione per la persona, le vendite effettuate nel mese e i pagamenti ricevuti dai loro clienti, che diventa potenzialmente un'operazione batch complessa.

Le mie risorse esistenti sono qualcosa come:

  • /consultant < - Dettagli di ciascun consulente di vendita
  • /payment < - transazioni di denaro ricevute dai clienti
  • /customer < - Dettagli dei clienti nel file
  • /order < - Qualcosa che si traduce in una fattura, si riferisce a un consulente di vendita e ad un cliente, così come ad altre cose, ad esempio quali servizi e beni sono stati venduti su tale ordine

Quale sarà il mio batch che avvia l'URI? Anch'io sto pensando /consultant?filter=have-made-sales&action=generate-commission-report

Ma non sembra giusto, quindi l'altro modo sarebbe trattare i "batchjobs" come una risorsa virtuale, ad esempio

  • /batchjobs?jobname=consultants-comission
  • /batchjobs?jobname=email-invoices

Che mi consente di restituire un ID di lavoro, che posso utilizzare in un successivo GET per scoprire se il lavoro è stato eseguito, ad es. /batchjobs?jobid=123

Un'altra risorsa che non è una risorsa è cosa fare sui rapporti. Questi sono abbastanza simili a quelli di Batch. Quando il client richiede che venga generato un report, il servizio deve restituire OK 200 e pochi minuti dopo il report PDF deve trovarsi nella posta in arrivo del richiedente. In questo caso, potrei nominare i miei URI come segue:

  • /reports?report=sales-for-the-month
  • /reports?report=accounts-outstanding

O esiste un'alternativa migliore e più accettabile?

Sembra che il problema che sto affrontando riguardi la risorsa rispetto all'operazione. Il problema è che le operazioni batch hanno un impatto su molte risorse, quindi per essere RESTFUL un cliente dovrebbe OTTENERE lo stato di tutte le risorse, eseguire il batch, quindi PUT lo stato aggiornato per ogni singola risorsa. Esiste un problema di prestazioni, in particolare dal momento che Internet introduce una latenza inaccettabile, e come risultato un rischio per l'integrità dei dati (condizioni di gara - PUT dovrebbe essere idempotente) C'è poco da impedire a un altro cliente di PUTare qualcosa da un'altra a una delle risorse interessate mentre il batch viene elaborato, o anche immediatamente dopo, annullando così il lavoro batch per una risorsa specifica una volta. Il blocco delle risorse sembra essere irremovibile. Quindi come si fa?

    
posta Johan 27.10.2014 - 11:31
fonte

1 risposta

1

Potresti POST /salesreport con { "start" : <START>, "end": <END> } .

Questo ti darebbe un 201 Created, Location: /salesreport/<ID>

Quando per la prima volta GET sarà { "start" : <START>, "end": <END>, "status": "pending", "progress": <PROGRESS> } (considera l'utilizzo delle direttive della cache per limitare il tasso di polling del client).

Puoi utilizzare DELETE per interrompere una generazione di report mentre è in corso.

I processi batch relativi a un tipo di risorsa specifico potrebbero essere nidificati di conseguenza, ad esempio l'URL potrebbe essere /order/salesreport o /consultant/commission/ o qualsiasi altra cosa.

Non penso che sia saggio esporre le operazioni a lungo termine tramite un'API, ma questa è una storia completamente diversa.

    
risposta data 27.10.2014 - 19:10
fonte

Leggi altre domande sui tag