2016-09-05 1 views
4

Ich habe eine kleine Spring-Boot-App, die als Produzent für einige Warteschlangen fungiert. Es verwendet die folgende Abhängigkeit:Spring AMQP - gleichzeitige Veröffentlichung in RabbitMQ Broker scheint zu blockieren

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-amqp</artifactId> 
    <version>1.4.0.RELEASE</version> 
</dependency> 

Innerhalb der App starte ich 4 Threads. Innerhalb jeder Aufgabe werden zufällige Nachrichten mit einer maximalen Größe von 10 KB erstellt. Diese Nachrichten werden mit der Methode convertAndSend von AmqpTemplate an einen direkten Austausch gesendet. Für jeden Thread wird ein separater Kanal verwendet. Bis jetzt läuft alles glatt.

Während der Laufzeit habe ich die JVM mit Java VisualVM untersucht. Ich konnte sehen, dass die 4 Threads funktionierten, war aber ein wenig überrascht, dass die Threads die meiste Zeit im Monitor (blocked) Zustand sind. Sehen Sie im folgenden Screenshot:

http://i.stack.imgur.com/i8uX7.png

Und hier ist ein Stück eines Stack-Trace:

java.lang.Thread.State: BLOCKED 
at com.rabbitmq.client.impl.SocketFrameHandler.writeFrame(SocketFrameHandler.java:144) 
- waiting to lock <1407a47> (a java.io.DataOutputStream) owned by "Thread-7" [email protected] 
at com.rabbitmq.client.impl.AMQConnection.writeFrame(AMQConnection.java:514) 
at com.rabbitmq.client.impl.AMQCommand.transmit(AMQCommand.java:102) 
- locked <316a68> (a com.rabbitmq.client.impl.CommandAssembler) 
at com.rabbitmq.client.impl.AMQChannel.quiescingTransmit(AMQChannel.java:334) 
- locked <1d8e172> (a java.lang.Object) 
at com.rabbitmq.client.impl.AMQChannel.transmit(AMQChannel.java:310) 
- locked <1d8e172> (a java.lang.Object) 
at com.rabbitmq.client.impl.ChannelN.basicPublish(ChannelN.java:657) 

so dass nicht aussehen wie parallel Publishing zu mir.

Kann jemand sagen, ob dieses Verhalten korrekt ist? Für mich scheint es, dass es nicht ist, aber ich kann nicht herausfinden, was falsch läuft.

Wenn ich die gleiche Producer-App auf einer zusätzlichen Maschine starte, scheint sich der Blocking-Zustand zu verschlechtern, als würde der Rabbitmq-Broker den Zugriff synchronisieren. Der Makler selbst ist in Ordnung. Keine physikalischen Grenzen getroffen. Keine Flusskontrolle. Selbst die eingehenden Nachrichtenraten werden mit einer zusätzlichen Producer-App fast verdoppelt.

Das ergibt keinen Sinn für mich. Hat jemand eine Idee? Muss ich mir Sorgen machen?

Vielen Dank im Voraus!

+0

Irgendeine Schlussfolgerung zu diesem? Ich glaube, ich leide an dem gleichen Problem – Jaskey

Antwort

0

Wahrscheinlich ist dies das Problem:

https://groups.google.com/forum/#!topic/rabbitmq-users/15cv2qroCps

ich es auch konfrontiert, diese Funktion ist der Grund:

Der RabbitMQ Server erkennt die Gesamtmenge an RAM im Computer installiert beim Start und wenn rabbitmqctl set_vm_memory_high_watermark Fraktion ausgeführt wird. Wenn der RabbitMQ-Server 40% des installierten RAM-Speichers über verwendet, löst er standardmäßig einen Speicheralarm aus und blockiert alle -Verbindungen, die Nachrichten veröffentlichen.

So können Sie es beheben, wenn Sie diesen Schwellenwert erhöhen/plus Speicher für das Gerät hinzufügen.

http://www.rabbitmq.com/memory.html

Verwandte Themen