This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/master by this push: new a9dc99c CAMEL-16326: Add docs about exchange pooling a9dc99c is described below commit a9dc99c95034cc38a5a5642d6d324fbf4fad1a8c Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Fri Mar 12 11:14:45 2021 +0100 CAMEL-16326: Add docs about exchange pooling --- docs/user-manual/modules/ROOT/nav.adoc | 1 + .../modules/ROOT/pages/exchange-pooling.adoc | 81 ++++++++++++++++++++++ docs/user-manual/modules/ROOT/pages/index.adoc | 1 + 3 files changed, 83 insertions(+) diff --git a/docs/user-manual/modules/ROOT/nav.adoc b/docs/user-manual/modules/ROOT/nav.adoc index e736f36..2b0f340 100644 --- a/docs/user-manual/modules/ROOT/nav.adoc +++ b/docs/user-manual/modules/ROOT/nav.adoc @@ -61,6 +61,7 @@ ** xref:dozer-type-conversion.adoc[Dozer Type Conversion] ** xref:endpoint-annotations.adoc[Endpoint Annotations] ** xref:exception-clause.adoc[Exception Clause] +** xref:exchange-pooling.adoc[Exchange Pooling] ** xref:fluent-builders.adoc[Fluent Builders] ** xref:http-session-handling.adoc[HTTP-Session Handling] ** xref:parameter-binding-annotations.adoc[Parameter Binding Annotations] diff --git a/docs/user-manual/modules/ROOT/pages/exchange-pooling.adoc b/docs/user-manual/modules/ROOT/pages/exchange-pooling.adoc new file mode 100644 index 0000000..d1643fb --- /dev/null +++ b/docs/user-manual/modules/ROOT/pages/exchange-pooling.adoc @@ -0,0 +1,81 @@ +[[ExchangePooling-ExchangePooling]] += Exchange Pooling + +*Since Camel 3.9* + +Apache Camel requires a tiny resource overhead when routing message. + +For example the routing engine keeps state of each individual message, keeping track of the message flow, +and where messaging are going next. The routing engine also handles complex tasks such as error handling, +capturing metrics, and many other things. All together small numbers of Java objects is allocated +on the heap for each processing step during routing. + +With the advance of cloud computing, where work loads are precisely measured, then Camel has undergone +a series of core optimizations to reduce its overhead. + +== Pooling objects to reduce object allocations + +The _Exchange Pooling_ functionality is _object pooling_ by recycling commonly used objects by the routing enginge. + +The most significant object being reused is the `org.apache.camel.Exchange` object that is the root object +that holds the message with its payload, headers, meta-data and other content. + +Besides pooling exchanges then internal objects used by the routing engine is also pooled and recycled. +All together this dramatically reduces the object allocations, from camel core itself. + +There will always be objects allocations from the actual message content (payload and headers), and also +from the Camel components in use and its 3rd party libraries. The footprint of Camel core and its routing engine is close to zero, when pooling is enabled. + +This all sounds marvelous so what is the negatives? Yes the price to pay for object pooling, +is the complexity of managing the pool (acquire and returning objects to the pool); however +all of this is taken care of by Camel itself. The object pools are using JDK `ConcurrentMap` +instances and take up very little memory. The negative is very tiny CPU cost on adding and removing +objects from the pools, and resetting the objects before reuse. + +It is possible better to sacrifice the very tiny CPU cost for reduced object allocations, which helps +to avoid the JVM garbage collection running more frequently, and causing your application to halt or delay +processing messages at any given time. + +== Enabling Exchange Pooling + +The _object pooling_ is currently not enabled by default, and requires to be turned on. + +This can be done as shown in Java: + +[source,java] +---- +CamelContext context = ... +context.adapt(ExtendedCamelContext.class).setExchangeFactory(new PooledExchangeFactory()); +---- + +If using _Camel Main_, Camel Spring Boot, or Camel Quarkus +you can enable this in the `application.properties`: + +[source,properties] +---- +camel.main.exchange-factory = pooled +---- + +== Configuration Options + +The exchange pool can be configured with the following options: + +[width="100%",cols="25%,50%,25%",options="header"] +|=== +|Option |Description | Default +| exchange-factory | Whether to use pooling or not. Possible values are prototype or pooled | prototype +| exchange-factory-capacity | Maximum number of elemenets in the pool | 100 +| exchange-factory-statistics-enabled | Whether to capture usage statistics | false +|=== + +== Management + +If object pooling is enabled, then Camel provides a JMX MBean which allows to introspect the pools and its usage +via JMX. This requires to add `camel-management` JAR to the classpath. + +== Examples + +We have provided a few examples which we are using for performance profiling. +For example the basic `timer-log` example is on github at: https://github.com/apache/camel-performance-tests/tree/master/profiling/timer-log + + diff --git a/docs/user-manual/modules/ROOT/pages/index.adoc b/docs/user-manual/modules/ROOT/pages/index.adoc index 1baf367..e4c2301 100644 --- a/docs/user-manual/modules/ROOT/pages/index.adoc +++ b/docs/user-manual/modules/ROOT/pages/index.adoc @@ -101,6 +101,7 @@ camel routes without them knowing * xref:error-handler.adoc[Error Handler] * xref:exchange.adoc[Exchange] * xref:exchange-pattern.adoc[Exchange Pattern] +* xref:exchange-pooling.adoc[Exchange Pooling] * xref:expression.adoc[Expression] * xref:http-session-handling.adoc[HTTP-Session Handling] * xref:injector.adoc[Injector]