Wo war die Frage:
Wir verwenden RabbitMQ als Aufgabenwarteschlange. Eine der spezifischen Aufgaben - Senden von Nachrichten an das soziale Netzwerk von Vkontakte. Sie haben eine maximale Anzahl an Anfragen pro Sekunde und diese Grenze hängt von Ihrer Anwendungsgröße ab. Nur 3 Anrufe für App mit weniger als 100k Menschen und so weiter. Also müssen wir die Anfrage künstlich auf den Service beschränken. Jetzt ist diese Logik anwendungsbasiert. Es ist einfach, während Sie nur einen Arbeiter pro solche Warteschlange verwenden können, stellen Sie einfach so etwas wie Schlaf (300ms) ein und seien Sie ruhig. Aber wenn Sie N Worker verwenden sollten, wird diese Synchronisation nicht trivial.
Wie kann der Durchsatz mit RabbitMQ begrenzt werden?
Basierend auf der obigen Geschichte. Wenn es möglich wäre, die Vorabrufgröße nicht nur auf Nachrichtenbasis, sondern auf Zeit basierend auf dieser Logik festzulegen, kann dies sehr einfach sein. Zum Beispiel, "qos zu 1 Nachricht pro Abruf nicht schneller als 1 mal in Sekunden" oder so weiter.
Dies ist mit RabbitMQ nicht möglich.
Sie haben Recht, bei verteilten Verbrauchern wird dieses Drosseln zu einer schwierigen Übung. Ich würde vorschlagen, einen Blick auf ZooKeeper zu werfen, der es Ihnen ermöglichen würde, alle Konsumenten zu synchronisieren und die Verarbeitung von Nachrichten zu drosseln, indem Sie die Znodes / Uhren für eine gedrosselte und dennoch skalierbare Lösung.
Tags und Links rabbitmq message-queue task-queue vk