2013-10-03 5 views
15

Ich benutze RabbitMQ erfolgreich. Allerdings habe ich ein Problem, wo, wenn ich in der Situation bin, wo viele Nachrichten in der Warteschlange sind, der Verbraucher (ein Windows-Dienst) versucht, sie alle zu bekommen und hält dann nur an ihnen, aber nie Aktionen oder quittiert sie.RabbitMQ wie den Verbraucher zu drosseln

Wenn die Anzahl der Nachrichten im Bereitschaftszustand niedrig ist, dann behandeln die Verbraucher den Durchsatz gut, es ist nur, wenn es ein Problem gab und es einen Rückstand gibt, dann wird es viel zu gierig.

Gibt es eine Möglichkeit, die maximale Anzahl von Nachrichten zu konfigurieren, für die ein Konsument gleichzeitig die Verantwortung übernimmt?

Ich kann das RequestedChannelMax Feld auf RabbitMQ.Client.ConnectionFactory ist das die richtige Einstellung, um dies zu begrenzen?

Dank

+0

Related: http://stackoverflow.com/questions/29841690/how-to-consume-one-message – Nav

Antwort

21

Ein Verbraucher, wird standardmäßig so viele Nachrichten wie die Bandbreite verarbeiten kann unabhängig von der tatsächlichen Meldungsverarbeitungszeit durch den Verbraucher lesen.

Sie müssen Vorabrufwerte festlegen, indem Sie die QoS (Quality of Service) des Kanals ändern, um zu beschränken, wie viele Nachrichten gleichzeitig abgerufen werden sollen. Überprüfen Sie basic.qos here. Es hat 3 Parameter, eine Größe (in Oktetten), eine Zählung (die Anzahl der ganzen Nachrichten, die es auf einmal aufnehmen wird) und eine globale Flagge.

This blog post ist eine interessante Lektüre, wenn Sie daran interessiert sind, den Durchsatz zu optimieren und spricht über Prefetching etwa 2/3 des Weges auf der Seite.

Hoffe, dass hilft!

+1

Dank dies ist eine sehr umfassende Antwort und hat mich richtig zu dem, was ich brauchte. '_model.BasicQos (0,100, false);' – baynezy