summaryrefslogtreecommitdiff
path: root/qpid/doc/book/src/producer-flow-control.xml
diff options
context:
space:
mode:
Diffstat (limited to 'qpid/doc/book/src/producer-flow-control.xml')
-rw-r--r--qpid/doc/book/src/producer-flow-control.xml351
1 files changed, 0 insertions, 351 deletions
diff --git a/qpid/doc/book/src/producer-flow-control.xml b/qpid/doc/book/src/producer-flow-control.xml
deleted file mode 100644
index fd44f51e81..0000000000
--- a/qpid/doc/book/src/producer-flow-control.xml
+++ /dev/null
@@ -1,351 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
-
--->
-
-<section id="producer-flow-control">
- <title>
- Producer Flow Control
- </title>
-
- <section role="h2" id="producerflowcontrol-Overview">
- <title>
- Overview
- </title>
- <para>
- As of release 0.10, the C++ broker supports the use of flow control to
- throttle back message producers that are at risk of overflowing a
- destination queue.
- </para>
-
- <para>
- Each queue in the C++ broker has two threshold values associated with it:
- </para>
-
- <para>
- Flow Stop Threshold: this is the level of queue resource
- utilization above which flow control will be enabled. Once this
- threshold is crossed, the queue is considered in danger of overflow.
- </para>
-
- <para>
- Flow Resume Threshold - this is the level of queue resource utilization
- below which flow control will be disabled. Once this threshold is
- crossed, the queue is no longer considered in danger of overflow.
- </para>
-
- <para>
- In the above description, queue resource utilization may be
- defined as the total count of messages currently enqueued, or the total
- sum of all message content in bytes.
- </para>
-
- <para>
- The value for a queue's Flow Stop Threshold must be greater than or
- equal to the value of the queue's Flow Resume Threshold.
- </para>
-
- <section role="h3" id="producerflowcontrol-QueueThresholdsExample">
- <title>
- Example
- </title>
-
- <para>
- Let's consider a queue with a maximum limit set on the total number of
- messages that may be enqueued to that queue. Assume this maximum
- message limit is 1000 messages. Assume also that the user configures a
- Flow Stop Threshold of 900 messages, and a Flow Resume Threshold of 500
- messages. Then the following holds:
- </para>
-
- <para>
- The queue's initial flow control state is "OFF".
- </para>
-
- <para>
- While the total number of enqueued messages is less than or equal to
- 900, the queue's flow control state remains "OFF".
- </para>
-
- <para>
- When the total number of enqueued messages is greater than 900, the
- queue's flow control state transitions to "ON".
- </para>
-
- <para>
- When the queue's flow control state is "ON", it remains "ON" until the
- total number of enqueued messages is less than 500. At that point, the queue's
- flow control state transitions to "OFF".
- </para>
-
- <para>
- A similar example using total enqueued content bytes as the threshold
- units are permitted.
- </para>
- </section>
-
- <para>
- Thresholds may be set using both total message counts and total byte
- counts. In this case, the following rules apply:
- </para>
-
- <para>
- 1) Flow control is "ON" when either stop threshold value is crossed.
- </para>
- <para>
- 2) Flow control remains "ON" until both resume thresholds are satisfied.
- </para>
-
- <section role="h3" id="producerflowcontro-MultiThresholdExample">
- <title>
- Example
- </title>
-
- <para>
- Let's consider a queue with a maximum size limit of 10K bytes, and 5000
- messages. A user may assign a Flow Stop Threshold based on a total
- message count of 4000 messages. They may also assigne a Flow Stop
- Threshold of 8K bytes. The queue's flow control state transitions to
- "ON" if either threshold is crossed: (total-msgs greater-than 4000 OR total-bytes
- greater-than 8K).
- </para>
-
- <para>
- Assume the user has assigned Flow Resume threshold's of 3000 messages and
- 6K bytes. Then the queue's flow control will remain active until both
- thresholds are satified: (total-msg less-than 3000 AND total-bytes less-than 6K).
- </para>
- </section>
-
- <para>
- The Broker enforces flow control by delaying the completion of the
- Message.Transfer command that causes a message to be delivered to a queue
- with active flow control. The completion of the Message.Transfer command
- is held off until flow control state transitions to "OFF" for all queues
- that are a destination for that command.
- </para>
-
- <para>
- A message producing client is permitted to have a finite number of
- commands pending completion. When the total number of these outstanding
- commands reaches the limit, the client must not issue further commands
- until one or more of the outstanding commands have completed. This
- window of outstanding commands is considered the sender's "capacity".
- This allows any given producer to have a "capacity's" worth of messages
- blocked due to flow control before the sender must stop sending further
- messages.
- </para>
-
- <para>
- This capacity window must be considered when determining a suitable
- flow stop threshold for a given queue, as a producer may send its
- capacity worth of messages _after_ a queue has reached the flow stop
- threshold. Therefore, a flow stop threshould should be set such that
- the queue can accomodate more messages without overflowing.
- </para>
-
- <para>
- For example, assume two clients, C1 and C2, are producing messages to
- one particular destination queue. Assume client C1 has a configured
- capacity of 50 messages, and client C2's capacity is 15 messages. In
- this example, assume C1 and C2 are the only clients queuing messages to
- a given queue. If this queue has a Flow Stop Threshold of 100
- messages, then, worst-case, the queue may receive up to 165 messages
- before clients C1 and C2 are blocked from sending further messages.
- This is due to the fact that the queue will enable flow control on
- receipt of its 101'st message - preventing the completion of the
- Message.Transfer command that carried the 101'st message. However, C1
- and C2 are allowed to have a total of 65 (50 for C1 and 15 for C2)
- messages pending completion of Message.Transfer before they will stop
- producing messages. Thus, up to 65 messages may be enqueued beyond the
- flow stop threshold before the producers will be blocked.
- </para>
- </section>
-
- <section role="h2" id="producerflowcontrol-UserInterface">
- <title>
- User Interface
- </title>
-
- <para>
- By default, the C++ broker assigns a queue's flow stop and flow resume
- thresholds when the queue is created. The C++ broker also allows the
- user to manually specify the flow control thresholds on a per queue
- basis.
- </para>
-
- <para>
- However, queues that have been configured with a Limit Policy of type
- RING or RING-STRICT do NOT have queue flow thresholds enabled by
- default. The nature of a RING queue defines its behavior when its
- capacity is reach: replace the oldest message.
- </para>
-
- <para>
- The flow control state of a queue can be determined by the "flowState"
- boolean in the queue's QMF management object. The queue's management
- object also contains a counter that increments each time flow control
- becomes active for the queue.
- </para>
-
- <para>
- The broker applies a threshold ratio to compute a queue's default flow
- control configuration. These thresholds are expressed as a percentage
- of a queue's maximum capacity. There is one value for determining the
- stop threshold, and another for determining the resume threshold. The
- user may configure these percentages using the following broker
- configuration options:
- </para>
-
- <programlisting>
- --default-flow-stop-threshold ("Queue capacity level at which flow control is activated.")
- --default-flow-resume-threshold ("Queue capacity level at which flow control is de-activated.")
- </programlisting>
-
- <para>
- For example:
- </para>
-
- <programlisting>
- qpidd --default-flow-stop-threshold=90 --default-flow-resume-threshold=75
- </programlisting>
-
- <para>
- Sets the default flow stop threshold to 90% of a queue's maximum
- capacity and the flow resume threshold to 75% of the maximum capacity.
- If a queue is created with a default-queue-limit of 10000 bytes, then
- the default flow stop threshold would be 90% of 10000 = 9000 bytes and
- the flow resume threshold would be 75% of 10000 = 7500. The same
- computation is performed should a queue be created with a maximum size
- expressed as a message count instead of a byte count.
- </para>
-
- <para>
- If not overridden by the user, the value of the
- default-flow-stop-threshold is 80% and the value of the
- default-flow-resume-threshold is 70%.
- </para>
-
- <para>
- The user may disable default queue flow control broker-wide by
- specifying the value 0 for both of these configuration options. Note
- that flow control may still be applied manually on a per-queue basis in
- this case.
- </para>
-
- <para>
- The user may manually set the flow thresholds when creating a queue.
- The following options may be provided when adding a queue using the
- <command>qpid-config</command> command line tool:
- </para>
-
- <programlisting>
- --flow-stop-size=<replaceable>N</replaceable> Sets the queue's flow stop threshold to <replaceable>N</replaceable> total bytes.
- --flow-resume-size=<replaceable>N</replaceable> Sets the queue's flow resume threshold to <replaceable>N</replaceable> total bytes.
- --flow-stop-count=<replaceable>N</replaceable> Sets the queue's flow stop threshold to <replaceable>N</replaceable> total messages.
- --flow-resume-count=<replaceable>N</replaceable> Sets the queue's flow resume threshold to <replaceable>N</replaceable> total messages.
- </programlisting>
-
- <para>
- Flow thresholds may also be specified in the
- <command>queue.declare</command> method, via the
- <command>arguments</command> parameter map. The following keys can be
- provided in the arguments map for setting flow thresholds:
- </para>
-
- <table>
- <title>Queue Declare Method Flow Control Arguments</title>
- <tgroup cols="2">
- <thead>
- <row>
- <entry>Key</entry>
- <entry>Value</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>qpid.flow_stop_size</entry>
- <entry>integer - queue's flow stop threshold value in bytes</entry>
- </row>
- <row>
- <entry>qpid.flow_resume_size</entry>
- <entry>integer - queue's flow resume threshold value in bytes</entry>
- </row>
- <row>
- <entry>qpid.flow_stop_count</entry>
- <entry>integer - queue's flow stop threshold value as a message count</entry>
- </row>
- <row>
- <entry>qpid.flow_resume_count</entry>
- <entry>integer - queue's flow resume threshold value as a message count</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- <para>
- The user may disable flow control on a per queue basis by setting
- the flow-stop-size and flow-stop-count to zero for the queue.
- </para>
-
- <para>
- The current state of flow control for a given queue can be
- determined by the "flowStopped" statistic. This statistic is
- available in the queue's QMF management object. The value of
- flowStopped is True when the queue's capacity has exceeded the
- flow stop threshold. The value of flowStopped is False when the
- queue is no longer blocking due to flow control.
- </para>
-
- <para>
- A queue will also track the number of times flow control has been
- activated. The "flowStoppedCount" statistic is incremented each time
- the queue's capacity exceeds a flow stop threshold. This statistic can
- be used to monitor the activity of flow control for any given queue
- over time.
- </para>
-
- <table>
- <title>Flow Control Statistics available in Queue's QMF Class</title>
- <tgroup cols="3">
- <thead>
- <row>
- <entry>Statistic Name</entry>
- <entry>Type</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>flowStopped</entry>
- <entry>Boolean</entry>
- <entry>If true, producers are blocked by flow control.</entry>
- </row>
- <row>
- <entry>flowStoppedCount</entry>
- <entry>count32</entry>
- <entry>Number of times flow control was activated for this queue</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </section>
- <!--h2-->
- </section>