Voglio la velocità dei messaggi asincroni ma ho ancora un controllo di flusso. Come posso realizzare questo in Erlang?Come si crea una coda di messaggi con limiti di memoria in Erlang?
risposta
Al momento non vi è alcun limite per la memoria di processo, viene discusso sulla mailing list, ecc. È possibile osservare quei thread.
Sul lato superiore, quando si utilizza l'implementazione di modelli OTP come gen_server, si ha molta libertà nel recuperare i messaggi dalla coda dei processi e misurare la lunghezza della coda.
gen_server2 utilizzato in rabbitmq utilizzato per ottimizzare lo spostamento spostando i messaggi sulla struttura interna dei dati. Avendo che è possibile scartare qualsiasi nuovo messaggio in arrivo quando la coda interna è troppo lunga. Puoi farlo in silenzio o avvisare il mittente che il messaggio è stato rifiutato.
Tutto questo è a livello molto basso.
RabbitMQ fornirà questa funzionalità a livello AMQP.
Un modo comune e abbastanza efficace di applicare il controllo di flusso è quello di creare messaggi ben selezionati in chiamate che limitano la quantità di carico che ciascun client può caricare su un server, fornendo in modo estremamente semplice il ritorno di forza. Il trucco è ovviamente scegliere quali comunicazioni utilizzano chiamate sincrone :-)
Questa sarebbe la mia soluzione. Fondamentalmente costruire in qualche controllo di flusso sulla linea. Esistono anche soluzioni più avanzate per questo. –
Non sono sicuro di aver capito. Proponi chiamate di sincronizzazione su async che garantisce che i messaggi siano accodati sul lato client? Penso che dipenda dal caso d'uso. Se il cliente è transitorio, potremmo non permetterci questa soluzione. – user425720
Il nocciolo del problema è che per avere qualsiasi forma di controllo del flusso si avrà alla fine una qualche forma di sincronizzazione. Se il client che fornisce il flusso si limita semplicemente a guidare passando il messaggio, non possiamo limitarlo in alcun modo. La risposta a questo è abbastanza spesso per limitare il numero di client in primo luogo, ma ciò richiederà una qualche forma di conoscenza centralizzata del numero di client, che richiedono la sincronizzazione. Quindi alla fine si riduce a dove ci sincronizziamo. Una soluzione comune nelle app di telcom è troppo semplice per le interfacce, ma è necessario sapere quando gettare :-) –
gen_server2 sembra bello –
gen_server2 implementa il windowing? –
Non sono sicuro di quale sia lo stato corrente dell'implementazione gen_server2. Potrebbe essere in qualche modo unito a quello principale, dopo aver introdotto la corrispondenza non lineare dei messaggi nelle code dei messaggi in OTP gen_server. – user425720