Skip to content

Commit d87c73d

Browse files
refs #36: add a module for performance/functionality comparisons
Record the results of running on my local machine.
1 parent a1bdde0 commit d87c73d

File tree

12 files changed

+664
-1
lines changed

12 files changed

+664
-1
lines changed

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,12 @@ mvn clean install -DskipTests
236236
(cd examples/java-dynamic-sqs-listener-core-examples && mvn exec:java)
237237
```
238238

239+
### Comparing Libraries
240+
If you want to see the difference between this library and others like the
241+
[Spring Cloud AWS Messaging](https://github.com/spring-cloud/spring-cloud-aws/tree/master/spring-cloud-aws-messaging) and
242+
[Amazon SQS Java Messaging Library](https://github.com/awslabs/amazon-sqs-java-messaging-lib), take a look at the [sqs-listener-libary-comparison](./examples/sqs-listener-library-comparison)
243+
module. This allows you to test the performance and usage of each library for different scenarios, such as heavy IO message processing, etc.
244+
239245
### Other examples
240246
See [examples](./examples) for all of the other available examples.
241247

examples/pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
<module>java-dynamic-sqs-listener-spring-starter-examples</module>
2424
<module>java-dynamic-sqs-listener-spring-aws-example</module>
2525
<module>java-dynamic-sqs-listener-spring-integration-test-example</module>
26+
<module>sqs-listener-library-comparison</module>
2627
</modules>
2728

2829
<dependencies>
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
# SQS Listener Library Comparison
2+
This module has the Spring Cloud, JMS and Java Dynamic SQS Listener libraries all integrated into a Spring Boot application. This can be used
3+
to compare the performance of each of the types of libraries with different types of messages being processed. For example, a message that has a lot of
4+
IO or to test what happens if the time to get new messages from the queue is large.
5+
6+
## Results (02/June/2019)
7+
The results that I ran on my local machine (which is not the greatest environment but gives a rough estimate) are the following:
8+
9+
### tl;dr
10+
*Ordered from fastest to slowest*
11+
12+
| Method | Concurrency | Time 1000 messages (ms) |
13+
| JMS | 30 | 4889 |
14+
| Java Dynamic SQS Listener (PrefetchingQueueListener) | 30 | 10550 |
15+
| Java Dynamic SQS Listener (PrefetchingQueueListener) | 10 | 10560ms |
16+
| JMS | 10 | 10587 |
17+
| Spring Cloud | 10 | 20284 |
18+
| Java Dynamic SQS Listener (QueueListener) | 30 | 20385 |
19+
| Java Dynamic SQS Listener (QueueListener) | 10 | 20399 |
20+
21+
### Configuration
22+
- Message latency = 100ms
23+
- Message IO time = 100ms
24+
- Commit ID = `a1bdde0d3c96d71997c3001cecc3ddba0d98c709`
25+
26+
### Raw Results
27+
#### JMS (concurrency = 10)
28+
```
29+
23:44:54.720 [DefaultMessageListenerContainer-5] INFO c.j.sqs.examples.MessageListeners - Time for processing 100 messages is 1454ms
30+
23:44:55.738 [DefaultMessageListenerContainer-5] INFO c.j.sqs.examples.MessageListeners - Time for processing 200 messages is 2472ms
31+
23:44:56.754 [DefaultMessageListenerContainer-5] INFO c.j.sqs.examples.MessageListeners - Time for processing 300 messages is 3488ms
32+
23:44:57.765 [DefaultMessageListenerContainer-6] INFO c.j.sqs.examples.MessageListeners - Time for processing 400 messages is 4499ms
33+
23:44:58.779 [DefaultMessageListenerContainer-5] INFO c.j.sqs.examples.MessageListeners - Time for processing 500 messages is 5513ms
34+
23:44:59.788 [DefaultMessageListenerContainer-5] INFO c.j.sqs.examples.MessageListeners - Time for processing 600 messages is 6522ms
35+
23:45:00.798 [DefaultMessageListenerContainer-2] INFO c.j.sqs.examples.MessageListeners - Time for processing 700 messages is 7532ms
36+
23:45:01.812 [DefaultMessageListenerContainer-4] INFO c.j.sqs.examples.MessageListeners - Time for processing 800 messages is 8546ms
37+
23:45:02.834 [DefaultMessageListenerContainer-2] INFO c.j.sqs.examples.MessageListeners - Time for processing 900 messages is 9568ms
38+
23:45:03.853 [DefaultMessageListenerContainer-6] INFO c.j.sqs.examples.MessageListeners - Time for processing 1000 messages is 10587ms
39+
```
40+
41+
#### JMS (concurrency = 30)
42+
```
43+
23:45:56.165 [DefaultMessageListenerContainer-9] INFO c.j.sqs.examples.MessageListeners - Time for processing 100 messages is 1388ms
44+
23:45:56.779 [DefaultMessageListenerContainer-10] INFO c.j.sqs.examples.MessageListeners - Time for processing 200 messages is 2002ms
45+
23:45:57.239 [DefaultMessageListenerContainer-1] INFO c.j.sqs.examples.MessageListeners - Time for processing 300 messages is 2462ms
46+
23:45:57.637 [DefaultMessageListenerContainer-3] INFO c.j.sqs.examples.MessageListeners - Time for processing 400 messages is 2860ms
47+
23:45:57.972 [DefaultMessageListenerContainer-28] INFO c.j.sqs.examples.MessageListeners - Time for processing 500 messages is 3195ms
48+
23:45:58.317 [DefaultMessageListenerContainer-15] INFO c.j.sqs.examples.MessageListeners - Time for processing 600 messages is 3540ms
49+
23:45:58.652 [DefaultMessageListenerContainer-22] INFO c.j.sqs.examples.MessageListeners - Time for processing 700 messages is 3875ms
50+
23:45:58.978 [DefaultMessageListenerContainer-28] INFO c.j.sqs.examples.MessageListeners - Time for processing 800 messages is 4201ms
51+
23:45:59.331 [DefaultMessageListenerContainer-12] INFO c.j.sqs.examples.MessageListeners - Time for processing 900 messages is 4554ms
52+
23:45:59.666 [DefaultMessageListenerContainer-21] INFO c.j.sqs.examples.MessageListeners - Time for processing 1000 messages is 4889ms
53+
```
54+
55+
#### Spring Cloud (concurrency = 10, this is the max)
56+
```
57+
23:48:11.143 [simpleMessageListenerContainer-11] INFO c.j.sqs.examples.MessageListeners - Time for processing 100 messages is 1860ms
58+
23:48:13.201 [simpleMessageListenerContainer-10] INFO c.j.sqs.examples.MessageListeners - Time for processing 200 messages is 3918ms
59+
23:48:15.265 [simpleMessageListenerContainer-4] INFO c.j.sqs.examples.MessageListeners - Time for processing 300 messages is 5982ms
60+
23:48:17.316 [simpleMessageListenerContainer-2] INFO c.j.sqs.examples.MessageListeners - Time for processing 400 messages is 8033ms
61+
23:48:19.363 [simpleMessageListenerContainer-10] INFO c.j.sqs.examples.MessageListeners - Time for processing 500 messages is 10080ms
62+
23:48:21.408 [simpleMessageListenerContainer-3] INFO c.j.sqs.examples.MessageListeners - Time for processing 600 messages is 12125ms
63+
23:48:23.452 [simpleMessageListenerContainer-4] INFO c.j.sqs.examples.MessageListeners - Time for processing 700 messages is 14169ms
64+
23:48:25.491 [simpleMessageListenerContainer-10] INFO c.j.sqs.examples.MessageListeners - Time for processing 800 messages is 16208ms
65+
23:48:27.530 [simpleMessageListenerContainer-2] INFO c.j.sqs.examples.MessageListeners - Time for processing 900 messages is 18247ms
66+
23:48:29.567 [simpleMessageListenerContainer-8] INFO c.j.sqs.examples.MessageListeners - Time for processing 1000 messages is 20284ms
67+
```
68+
69+
#### Jashmore Prefetching (concurrency = 10)
70+
```
71+
23:39:25.302 [message-listeners-prefetching-concurrency10-2] INFO c.j.sqs.examples.MessageListeners - Time for processing 100 messages is 989ms
72+
23:39:26.378 [message-listeners-prefetching-concurrency10-4] INFO c.j.sqs.examples.MessageListeners - Time for processing 200 messages is 2065ms
73+
23:39:27.446 [message-listeners-prefetching-concurrency10-4] INFO c.j.sqs.examples.MessageListeners - Time for processing 300 messages is 3133ms
74+
23:39:28.517 [message-listeners-prefetching-concurrency10-8] INFO c.j.sqs.examples.MessageListeners - Time for processing 400 messages is 4204ms
75+
23:39:29.592 [message-listeners-prefetching-concurrency10-8] INFO c.j.sqs.examples.MessageListeners - Time for processing 500 messages is 5279ms
76+
23:39:30.652 [message-listeners-prefetching-concurrency10-0] INFO c.j.sqs.examples.MessageListeners - Time for processing 600 messages is 6339ms
77+
23:39:31.712 [message-listeners-prefetching-concurrency10-7] INFO c.j.sqs.examples.MessageListeners - Time for processing 700 messages is 7399ms
78+
23:39:32.769 [message-listeners-prefetching-concurrency10-6] INFO c.j.sqs.examples.MessageListeners - Time for processing 800 messages is 8456ms
79+
23:39:33.821 [message-listeners-prefetching-concurrency10-4] INFO c.j.sqs.examples.MessageListeners - Time for processing 900 messages is 9508ms
80+
23:39:34.873 [message-listeners-prefetching-concurrency10-7] INFO c.j.sqs.examples.MessageListeners - Time for processing 1000 messages is 10560ms
81+
```
82+
83+
#### Jashmore Prefetching (concurrency = 30)
84+
```
85+
23:38:28.696 [message-listeners-prefetching-concurrency30-12] INFO c.j.sqs.examples.MessageListeners - Time for processing 100 messages is 972ms
86+
23:38:29.772 [message-listeners-prefetching-concurrency30-16] INFO c.j.sqs.examples.MessageListeners - Time for processing 200 messages is 2048ms
87+
23:38:30.847 [message-listeners-prefetching-concurrency30-15] INFO c.j.sqs.examples.MessageListeners - Time for processing 300 messages is 3123ms
88+
23:38:31.926 [message-listeners-prefetching-concurrency30-13] INFO c.j.sqs.examples.MessageListeners - Time for processing 400 messages is 4202ms
89+
23:38:32.990 [message-listeners-prefetching-concurrency30-17] INFO c.j.sqs.examples.MessageListeners - Time for processing 500 messages is 5266ms
90+
23:38:34.056 [message-listeners-prefetching-concurrency30-17] INFO c.j.sqs.examples.MessageListeners - Time for processing 600 messages is 6332ms
91+
23:38:35.119 [message-listeners-prefetching-concurrency30-16] INFO c.j.sqs.examples.MessageListeners - Time for processing 700 messages is 7395ms
92+
23:38:36.174 [message-listeners-prefetching-concurrency30-12] INFO c.j.sqs.examples.MessageListeners - Time for processing 800 messages is 8450ms
93+
23:38:37.225 [message-listeners-prefetching-concurrency30-16] INFO c.j.sqs.examples.MessageListeners - Time for processing 900 messages is 9501ms
94+
23:38:38.274 [message-listeners-prefetching-concurrency30-14] INFO c.j.sqs.examples.MessageListeners - Time for processing 1000 messages is 10550ms
95+
```
96+
97+
#### Jashmore QueueListener (concurrency = 10)
98+
```
99+
23:40:36.464 [message-listeners-queue-listener-method-concurrency10-6] INFO c.j.sqs.examples.MessageListeners - Time for processing 100 messages is 1889ms
100+
23:40:38.536 [message-listeners-queue-listener-method-concurrency10-8] INFO c.j.sqs.examples.MessageListeners - Time for processing 200 messages is 3961ms
101+
23:40:40.597 [message-listeners-queue-listener-method-concurrency10-2] INFO c.j.sqs.examples.MessageListeners - Time for processing 300 messages is 6022ms
102+
23:40:42.658 [message-listeners-queue-listener-method-concurrency10-8] INFO c.j.sqs.examples.MessageListeners - Time for processing 400 messages is 8083ms
103+
23:40:44.725 [message-listeners-queue-listener-method-concurrency10-6] INFO c.j.sqs.examples.MessageListeners - Time for processing 500 messages is 10150ms
104+
23:40:46.778 [message-listeners-queue-listener-method-concurrency10-9] INFO c.j.sqs.examples.MessageListeners - Time for processing 600 messages is 12203ms
105+
23:40:48.830 [message-listeners-queue-listener-method-concurrency10-1] INFO c.j.sqs.examples.MessageListeners - Time for processing 700 messages is 14255ms
106+
23:40:50.879 [message-listeners-queue-listener-method-concurrency10-4] INFO c.j.sqs.examples.MessageListeners - Time for processing 800 messages is 16304ms
107+
23:40:52.928 [message-listeners-queue-listener-method-concurrency10-1] INFO c.j.sqs.examples.MessageListeners - Time for processing 900 messages is 18353ms
108+
23:40:54.974 [message-listeners-queue-listener-method-concurrency10-8] INFO c.j.sqs.examples.MessageListeners - Time for processing 1000 messages is 20399ms
109+
```
110+
111+
#### Jashmore QueueListener (concurrency = 30)
112+
```
113+
23:41:39.507 [message-listeners-queue-listener-method-concurrency30-7] INFO c.j.sqs.examples.MessageListeners - Time for processing 100 messages is 1875ms
114+
23:41:41.578 [message-listeners-queue-listener-method-concurrency30-4] INFO c.j.sqs.examples.MessageListeners - Time for processing 200 messages is 3946ms
115+
23:41:43.639 [message-listeners-queue-listener-method-concurrency30-2] INFO c.j.sqs.examples.MessageListeners - Time for processing 300 messages is 6007ms
116+
23:41:45.705 [message-listeners-queue-listener-method-concurrency30-7] INFO c.j.sqs.examples.MessageListeners - Time for processing 400 messages is 8073ms
117+
23:41:47.768 [message-listeners-queue-listener-method-concurrency30-7] INFO c.j.sqs.examples.MessageListeners - Time for processing 500 messages is 10136ms
118+
23:41:49.823 [message-listeners-queue-listener-method-concurrency30-6] INFO c.j.sqs.examples.MessageListeners - Time for processing 600 messages is 12191ms
119+
23:41:51.874 [message-listeners-queue-listener-method-concurrency30-1] INFO c.j.sqs.examples.MessageListeners - Time for processing 700 messages is 14242ms
120+
23:41:53.923 [message-listeners-queue-listener-method-concurrency30-5] INFO c.j.sqs.examples.MessageListeners - Time for processing 800 messages is 16291ms
121+
23:41:55.971 [message-listeners-queue-listener-method-concurrency30-8] INFO c.j.sqs.examples.MessageListeners - Time for processing 900 messages is 18339ms
122+
23:41:58.017 [message-listeners-queue-listener-method-concurrency30-2] INFO c.j.sqs.examples.MessageListeners - Time for processing 1000 messages is 20385ms
123+
```
Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
3+
<parent>
4+
<artifactId>examples</artifactId>
5+
<groupId>com.jashmore</groupId>
6+
<version>2.3.0-SNAPSHOT</version>
7+
</parent>
8+
<modelVersion>4.0.0</modelVersion>
9+
10+
<artifactId>sqs-listener-library-comparison</artifactId>
11+
12+
<name>Java Dynamic SQS Listener - Spring Starter - Examples</name>
13+
<description>Contains examples for using the Spring Starter implementation of the framework.</description>
14+
15+
<properties>
16+
<findbugs.config.location>../../configuration/findbugs/bugsExcludeFilter.xml</findbugs.config.location>
17+
</properties>
18+
19+
<dependencies>
20+
<dependency>
21+
<groupId>org.springframework.boot</groupId>
22+
<artifactId>spring-boot-starter</artifactId>
23+
<version>${spring.boot.version}</version>
24+
</dependency>
25+
26+
<dependency>
27+
<groupId>org.springframework.boot</groupId>
28+
<artifactId>spring-boot-starter-web</artifactId>
29+
<version>${spring.boot.version}</version>
30+
</dependency>
31+
32+
<dependency>
33+
<groupId>org.projectlombok</groupId>
34+
<artifactId>lombok</artifactId>
35+
<scope>provided</scope>
36+
</dependency>
37+
38+
<dependency>
39+
<groupId>com.jashmore</groupId>
40+
<artifactId>java-dynamic-sqs-listener-spring-starter</artifactId>
41+
<version>${project.version}</version>
42+
</dependency>
43+
44+
<dependency>
45+
<groupId>org.elasticmq</groupId>
46+
<artifactId>elasticmq-rest-sqs_2.11</artifactId>
47+
<version>0.13.9</version>
48+
</dependency>
49+
50+
<dependency>
51+
<groupId>com.jashmore</groupId>
52+
<artifactId>local-amazon-sqs</artifactId>
53+
<version>${project.version}</version>
54+
</dependency>
55+
56+
<dependency>
57+
<groupId>org.springframework.cloud</groupId>
58+
<artifactId>spring-cloud-aws-messaging</artifactId>
59+
<version>2.1.0.RELEASE</version>
60+
</dependency>
61+
62+
<dependency>
63+
<groupId>org.springframework</groupId>
64+
<artifactId>spring-jms</artifactId>
65+
</dependency>
66+
67+
<dependency>
68+
<groupId>com.amazonaws</groupId>
69+
<artifactId>amazon-sqs-java-messaging-lib</artifactId>
70+
<version>1.0.4</version>
71+
<type>jar</type>
72+
</dependency>
73+
</dependencies>
74+
75+
<dependencyManagement>
76+
<dependencies>
77+
<dependency>
78+
<groupId>org.springframework.boot</groupId>
79+
<artifactId>spring-boot-dependencies</artifactId>
80+
<version>${spring.boot.version}</version>
81+
<type>pom</type>
82+
<scope>import</scope>
83+
</dependency>
84+
</dependencies>
85+
</dependencyManagement>
86+
87+
<build>
88+
<resources>
89+
<resource>
90+
<directory>${basedir}/src/main/resources</directory>
91+
<filtering>true</filtering>
92+
<includes>
93+
<include>**/*.yml</include>
94+
<include>**/application*.properties</include>
95+
</includes>
96+
</resource>
97+
<resource>
98+
<directory>${basedir}/src/main/resources</directory>
99+
<excludes>
100+
<exclude>**/*.yml</exclude>
101+
<exclude>**/application*.properties</exclude>
102+
</excludes>
103+
</resource>
104+
</resources>
105+
106+
<pluginManagement>
107+
<plugins>
108+
<plugin>
109+
<groupId>org.springframework.boot</groupId>
110+
<artifactId>spring-boot-maven-plugin</artifactId>
111+
<configuration>
112+
<mainClass>com.jashmore.sqs.examples.Application</mainClass>
113+
</configuration>
114+
<executions>
115+
<execution>
116+
<goals>
117+
<goal>repackage</goal>
118+
</goals>
119+
</execution>
120+
</executions>
121+
</plugin>
122+
<plugin>
123+
<groupId>org.apache.maven.plugins</groupId>
124+
<artifactId>maven-resources-plugin</artifactId>
125+
<configuration>
126+
<delimiters>
127+
<delimiter>${resource.delimiter}</delimiter>
128+
</delimiters>
129+
<useDefaultDelimiters>false</useDefaultDelimiters>
130+
</configuration>
131+
</plugin>
132+
133+
<plugin>
134+
<groupId>org.apache.maven.plugins</groupId>
135+
<artifactId>maven-compiler-plugin</artifactId>
136+
<configuration>
137+
<source>${java.version}</source>
138+
<target>${java.version}</target>
139+
</configuration>
140+
</plugin>
141+
</plugins>
142+
</pluginManagement>
143+
</build>
144+
145+
</project>
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.jashmore.sqs.examples;
2+
3+
import lombok.extern.slf4j.Slf4j;
4+
import org.springframework.boot.SpringApplication;
5+
import org.springframework.boot.autoconfigure.SpringBootApplication;
6+
7+
@SpringBootApplication
8+
@Slf4j
9+
public class Application {
10+
public static void main(String[] args) {
11+
SpringApplication.run(Application.class);
12+
}
13+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.jashmore.sqs.examples;
2+
3+
import lombok.experimental.UtilityClass;
4+
5+
@UtilityClass
6+
public class ExampleConstants {
7+
/**
8+
* The number of messages to place onto the queue before beginning to process the messages.
9+
*/
10+
public static final int NUMBER_OF_MESSAGES = 1_000;
11+
12+
/**
13+
* The amount of time that the thread will be slept while processing the message. This will represent IO.
14+
*/
15+
public static final long MESSAGE_IO_TIME_IN_MS = 100;
16+
17+
/**
18+
* The amount of time it takes to get a message from the remote SQS queue.
19+
*/
20+
public static final long MESSAGE_RETRIEVAL_LATENCY_IN_MS = 100;
21+
22+
}

0 commit comments

Comments
 (0)