Hi,
we are using qpid (v0.16) successfully since quite some time as part of our
infrastructure.Another part of our infrastructure is a monitoring service which
periodically connects to the broker on the qmqp port (plain tcp connection) and
closes the connection immediately after connecting. It does that in order to
make sure the service is up and running.
After running this monitoring service a while we receive OOMs (saying that the
JVM ran out of threads).Uncaught exception, shutting down.
java.lang.OutOfMemoryError: unable to create new native thread at
java.lang.Thread.start0(Native Method) at
java.lang.Thread.start(Thread.java:597) at
org.apache.qpid.transport.network.io.IoSender.initiate(IoSender.java:97) at
org.apache.qpid.transport.network.io.IoNetworkConnection.start(IoNetworkConnection.java:58)
at
org.apache.qpid.transport.network.io.IoNetworkTransport$AcceptingThread.run(IoNetworkTransport.java:225)
Turns out this monitoring service doesn't follow the amq protocol which creates
a thread leak in the broker (IOSender threads keep lingering around).
I'm aware that this client doesn't behave according to the amq protocol but the
other side of the story is that a misbehaving client (reliably and quickly is
able to bring down the service). I noticed other queueing products have the
same issue.So my question is: Is there a reason the broker doesn't detect
closed client connections and guards itself from a DoS?
Out of curiosity: What do other people use to check the availibility of the
service? We fell back to pinging the JMX port for now but are open to other
solutions.
Cheers, Marco