Accodamento chiamate RPC

1

Sto progettando un sistema che ascolta le chiamate JSON RPC dai client, le accumula in un elenco e, se l'elenco si riempie, le memorizza in un DB e continua a ricevere chiamate.

Il mio piano originale è quello di ascoltare le chiamate RPC da Perl con JSON-RPC e inserirle in un array. I client eseguono un lungo polling su un altro server per ottenere le risposte man mano che appaiono.

  • Che cos'è questa cosa bloccante / non bloccante?
  • Devo fare uno script per node.js per ascoltare le chiamate?
  • Quale pensi sia una buona pratica in questo caso?

L'obiettivo è ascoltare quante più chiamate possibili.

    
posta alfa64 21.05.2012 - 01:29
fonte

2 risposte

2

Mi sembra che usare una coda dei messaggi (MQ) sia l'ideale per te qui.

piles them up inside a list, and if the list gets full it should store them in a DB and keep receiving calls.

Un MQ può essere pensato come un primo servizio di archiviazione first-out. Il modo in cui funziona è che invece di accumulare le richieste di servizio e gestirle internamente, dovresti scriverle in coda e fare in modo che il tuo server elabori la coda per vedere se ci sono messaggi da elaborare.

What is this blocking/non-blocking thing?

Blocco / Non blocco si riferisce al tempo necessario affinché un'operazione compia il blocco del funzionamento del thread. Ad esempio, le operazioni di I / O e di rete sono un collo di bottiglia di blocco comune.

L'utilizzo di una coda di messaggi consente di evitare in gran parte il blocco poiché generalmente sono rapidi (dato che si trovano nella stessa rete) e ti consentiranno di attivare la chiamata RPC e continuare con l'elaborazione.

Se è necessario elaborare un risultato, questo diventa più complesso e in cui si considerano meccanismi come una coda di risultati che si esegue il polling, l'invocazione di uno script remoto, ecc.

    
risposta data 13.03.2013 - 04:00
fonte
0

Il blocco o il non blocco riguarda la possibilità o meno di attendere il completamento di una chiamata. Le chiamate non bloccanti di solito funzionano su un altro thread, quindi il thread che lo richiama può riprendere a fare altre cose. Le chiamate di blocco sono più comuni. Un motivo per effettuare una chiamata di blocco è assicurarsi che la chiamata sia riuscita senza errori prima di continuare con la prossima operazione.

Non posso dirti di usare node.js o no. Non credo che la tecnologia sia importante, potresti farlo con la maggior parte degli ambienti di programmazione.

Ciò che descrivi fondamentalmente è il buffering. Lo farei senza bloccare a meno che qualcosa sia davvero costoso (forse l'analisi della chiamata rpc è). In questo modo garantisci di non perdere nessuna chiamata.

Se lo fai senza bloccare, perché c'è un lavoro significativo, userei un pool di thread per questo, in genere finiscono per bloccare se il pool non può tenere il passo.

Dovrai sincronizzarti con qualche blocco per consentire a più thread di archiviare cose nel tuo buffer (è per questo che preferirei farlo bloccando su un singolo thread) e perderai l'ordine delle tue chiamate che potrebbero o meno essere importante.

Utilizzando un doppio buffer è possibile svuotare il buffer nel DB mentre continuano a ricevere nuove chiamate. Potrebbe essere necessario bloccare brevemente durante l'inserimento dei buffer dopo un flush.

    
risposta data 13.12.2012 - 01:53
fonte

Leggi altre domande sui tag