Sto progettando un software che si connetterà a un servizio remoto e le invierà richieste da un'applicazione locale. Questo servizio remoto implementa un algoritmo di leaky-bucket per determinare se elaborare la richiesta o restituire un'eccezione.
La documentazione per il servizio remoto è completa. Posso progettare la mia applicazione locale per conformarmi ai suoi requisiti finché non cambiano.
Detto questo, il servizio remoto restituisce anche dati in questo modo nelle sue risposte alla mia applicazione locale:
quota-max: 18000
quota-remaining: 17998
quota-resetson: 2017-09-03T00:00:00.000Z
( NOVITÀ ) Se l'applicazione locale riempie l'intero bucket del servizio remoto (ovvero utilizza l' quota
), quindi tenta di inviare comunque una o più richieste, il servizio remoto rispondere a ciascuno con QuotaExceeded
e non elaborare le richieste. Non sono sicuro e non vorrei scoprire se ci sono altre implicazioni a causare regolarmente QuotaExceeded
(ad esempio, se i proprietari del servizio remoto negheranno l'accesso interamente all'applicazione locale).
Una domanda a cui deve rispondere la mia applicazione locale è:
- In questo momento , posso inviare una richiesta?
( NUOVO ) Se l'applicazione locale causa un eccesso di quota del servizio remoto, dovrà essere in grado di capire che il messaggio che ha provato ad inviare dovrebbe essere inviato nuovamente la volta successiva è possibile (e non dovrebbe tentare un rinvio fino a quel momento). Verrà eseguito in background, in modo che possa consentire il riemissione delle richieste a un ritmo ragionevole. L'applicazione locale è in realtà anche un servizio; si iscrive ai canali definiti di un database locale e forma richieste per il servizio remoto in base a ciò che accade nel database locale.
Questo mi porta ad alcune domande sul design:
-
È una buona idea determinare sempre "posso inviare" esclusivamente da:
- dati che registro nell'applicazione locale riguardo a quando sono state fatte richieste precedenti?
- dati restituiti dal servizio remoto per quanto riguarda lo stato del bucket che perde, al momento dell'ultima richiesta?
-
Sarebbe un over-engineering per tracciare "posso inviare" utilizzando entrambi dati tracciati localmente e dati restituiti dal servizio remoto?
Le risposte, mi rendo conto, possono essere soggettive. Ho letto Stack Overflow " Good Subjective, Bad Subjective ". Spero che qualcuno abbia avuto esperienza nella progettazione di un sistema che doveva fare qualcosa di molto simile, e può condividere la sua esperienza sotto forma di una risposta (n. 4 in "Linee guida per grandi domande soggettive"). Si prega di fare il backup con fatti / riferimenti, se possibile (# 5).