2014-08-27 26 views
8

Dove ha fatto la domanda:Come limitare il throughput con RabbitMQ?

Stiamo usando RabbitMQ come coda di compito. Uno dei compiti specifici: l'invio di notifiche al social network Vkontakte. L'API ha un limite di richiesta al secondo e questo limite si basa sulle dimensioni dell'applicazione. Solo 3 chiamate per app con meno di 100k persone e così via. Quindi dobbiamo limitare artificialmente la richiesta al loro servizio. Ora questa logica è basata sull'applicazione. È semplice mentre puoi usare un solo lavoratore per tale coda, basta impostare qualcosa come il sonno (300 ms) e stare calmo. Ma quando si dovrebbero usare gli operatori N questa sincronizzazione non diventa banale.

Come limitare il throughput con RabbitMQ?

Basato sulla storia sopra. Se fosse possibile impostare la dimensione di prefetch non solo in base al messaggio, ma il tempo basato su questa logica può essere molto semplice. Ad esempio, "qos to 1 message per fetch non più veloce di 1 volta in secondi" o così via.

  1. C'è qualcosa del genere?
  2. Potrebbe esserci un'altra strategia a riguardo?
+0

Si utilizzano N consumatori per la stessa coda? Hai bisogno di "programmare" una o più code? – Gabriele

+0

Sì, N consumatori nella stessa coda. Dovrebbe essere sheduled per la coda. – misterion

risposta

1

Questo non è possibile con RabbitMQ.

Hai ragione, con i consumatori distribuiti questa limitazione diventa un esercizio difficile. Suggerirei di dare un'occhiata a ZooKeeper che ti permetterebbe di sincronizzare tutti i consumatori e l'elaborazione del throttle dei messaggi sfruttando il suo Znodes/Watches per una soluzione limitata ma scalabile.