Architettura di app Android di programmazione reattiva

5

Creerò un'app per Android per il mercato azionario. Le quotazioni di borsa cambiano ogni pochi secondi, quindi per mantenere aggiornata l'app ho deciso di implementare un design funzionale reattivo.

Il mio design IDEAL sarebbe:

  • Ogni volta che il server ha un nuovo valore per un titolo, l'app riceve i nuovi dati. Infine, i dati vengono visualizzati all'utente.

Tuttavia, il mio problema è che la mia fonte per i dati di borsa è una API REST (ad esempio, quella di yahoo). Con un'API REST, penso che la parte "notifica l'app" del mio progetto non sarà facilmente implementata.

Ho pensato di fare:

  • Pianifica una chiamata Api ogni X secondi utilizzando Retrofit + RxJava. Anche se questo sembra essere il modo più semplice, ci sono 2 cose che non mi piacciono:

1) Scaricherò molti più dati del necessario, dal momento che non so quali titoli hanno cambiato il loro valore, dovrò recuperarli tutti.

2) Questa non è veramente una "programmazione reattiva". In qualche modo ritengo che il server debba "trasmettere" i dati al client e non viceversa.

Puoi darmi qualche suggerimento su come implementare il design "Ideale" che ho descritto sopra?

    
posta Javier Ventajas Hernández 18.07.2016 - 02:29
fonte

2 risposte

2

Everytime that the server has a new value for a stock, the app is passed the new data. Finally, the data is displayed to the user.

Questo lascia molto fuori dalla storia. Questo è più un caso d'uso che un design.

Ci sono diversi modi per affrontare questo problema. Sono i tuoi limiti fondamentali che guidano davvero il design. Farò delle supposizioni su quali sono i tuoi limiti.

Presumibilmente non si possiede il server che è la fonte dei dati di magazzino. Hai semplicemente un'API di riposo a cui puoi connetterti. Probabilmente sei limitato a quanto puoi scaricare e quanto spesso riesci a connetterti.

Schedule an Api call every X seconds

Questo è chiamato polling. Ha gravi limitazioni sugli eventi ma può funzionare bene se fatto bene.

1) I'll be downloading much more data than is necessary, since I don't know what stocks have changed their value, I will have to fetch all of them.

Questo dipende interamente dalle limitazioni dell'API. Se l'API in realtà non ti consente di informarti su un determinato titolo ma insiste sull'invio dell'intero ticker, allora sì, questo è vero.

2) This is not really "reactive programming". I somehow feel that the server should "push" the data to the client and not the other way around.

Il polling, fatto bene, è in realtà ciò che realmente sono gli eventi. Sarebbe un design terribile se ogni x secondi ogni utente colpisse l'API e cercasse attraverso l'elenco dei ticker per lo stock di cui si interessava e controllava se il prezzo si fosse spostato. Si tratta di un sacco di lavoro e inutili spostamenti di dati.

Se l'API non ti permette di fare qualcosa di più avanzato, tira giù l'intero ticker quando lo chiami Ti raccomando di creare un server tutto tuo. Il tuo server colpirà l'API del loro server, ottieni l'intero ticker, fallo ogni x secondi, ma sarà l'unica cosa che farà questo.

Il tuo server consentirà agli utenti di registrarsi come osservatori di azioni e ogni volta che un titolo cambierà il tuo server farà il giro degli osservatori registrati e invierà loro una notifica.

Avrai bisogno di alcuni timeout e limitazioni ragionevoli per registrarti come osservatore o sarai oggetto di attacchi denial of service.

Fatto in questo modo le notifiche possono essere limitate sia agli stock di interesse, ai movimenti di prezzo di interesse, sia ai timeout, agli osservatori ancora interessati.

Ciò ti consentirebbe anche di inviare notifiche in qualsiasi forma tu voglia, UDP, TCP, SMS, email, telefonate, cartoline.

    
risposta data 18.07.2016 - 03:45
fonte
0

È possibile eseguire il polling (magari con alcuni batch / cache per più client) sul lato server. Per notificare alle app mobili le modifiche, puoi utilizzare Google Cloud Messaging e risparmiare ai client una certa larghezza di banda.

    
risposta data 13.02.2017 - 17:43
fonte

Leggi altre domande sui tag