Skip to content

Commit afc2e2f

Browse files
committed
Add MongoDB Event Store Benchmark
1 parent 7417c8b commit afc2e2f

File tree

9 files changed

+163
-7
lines changed

9 files changed

+163
-7
lines changed

bench.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#!/usr/bin/env sh
22

3-
USAGE="Usage: bench.sh --driver [arangodb | postgres | mysql | mariadb] [--strategy Single | Simple | Aggregate]"
3+
USAGE="Usage: bench.sh --driver [arangodb | postgres | mysql | mariadb | mongodb] [--strategy Single | Simple | Aggregate]"
44

55
DRIVER=
66
STREAM_STRATEGY=
@@ -40,7 +40,7 @@ export DRIVER=${DRIVER}
4040
export STREAM_STRATEGY=${STRATEGY}
4141

4242
echo ""
43-
echo "Starting benchmark ${DRIVER}!"
43+
echo "Starting benchmark ${DRIVER} with strategy ${STRATEGY}!"
4444
php src/prepare.php
4545
php src/benchmark.php
4646
php src/cleanup.php

bench_docker.sh

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#!/usr/bin/env sh
22

3-
USAGE="Usage: bench_docker.sh --driver [arangodb | postgres | mysql | mariadb] [--strategy Single | Simple | Aggregate]"
3+
USAGE="Usage: bench_docker.sh --driver [arangodb | postgres | mysql | mariadb | mongodb] [--strategy Single | Simple | Aggregate]"
44

55
IDLE_TIME=20
66
DRIVER=
@@ -68,9 +68,17 @@ sed -i "s/#mem_reservation: dbmem_reservation/mem_reservation: ${MEM}M/g" docker
6868

6969
sed -i "s/BUFFER_POOL_SIZE/${BUFFER_POOL_SIZE}M/g" docker-compose.yml
7070

71-
docker-compose up -d --no-recreate database
71+
docker-compose up -d --no-recreate
7272
docker-compose ps
7373

74+
if [ ${DRIVER} == "mongodb" ]; then
75+
sleep 2
76+
docker-compose exec mongodb0 sh init.sh
77+
sleep 1
78+
docker-compose exec mongodb0 sh status.sh
79+
sleep 1
80+
fi
81+
7482
echo ""
7583
echo ""
7684
echo "Docker Info"

composer.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
"prooph/pdo-event-store":"^1.5.1",
88
"prooph/arangodb-event-store":"dev-master",
99
"prooph/arangodb-php-driver-polyfill":"dev-master",
10+
"prooph/mongodb-event-store": "dev-feature/projection-change-stream",
1011
"psr/container":"^1.0",
1112
"zendframework/zend-servicemanager":"^3.3",
1213
"vlucas/phpdotenv": "^2.4"
@@ -47,6 +48,14 @@
4748
{
4849
"type": "git",
4950
"url": "https://github.com/sandrokeil/arangodb-php-driver-polyfill"
51+
},
52+
{
53+
"type": "git",
54+
"url": "[email protected]:sandrokeil/mongodb-event-store.git"
55+
},
56+
{
57+
"type": "git",
58+
"url": "[email protected]:sandrokeil/mongodb-document-store.git"
5059
}
5160
]
5261
}

docker-compose-mongodb.yml

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
version: '2.3'
2+
services:
3+
# To run benchmark suite docker-compose run --rm php src/benchmark
4+
php:
5+
image: prooph/php:7.2-cli
6+
environment:
7+
DRIVER: "arangodb"
8+
PHP_IDE_CONFIG: "serverName=application"
9+
MONGODB_HOST: "mongodb://node0.mongodb.local:27017,node1.mongodb.local:27017,node2.mongodb.local:27017/replicaSet=cluster"
10+
MONGODB_DB: event_store_bench
11+
volumes:
12+
- "./:/app"
13+
#cpuset: phpcpuset
14+
#cpu_count: phpcpu_count
15+
#mem_limit: phpmem_limit
16+
#mem_reservation: phpmem_reservation
17+
18+
mongodb0:
19+
build: ./env/docker/mongo
20+
command: ['mongod', '--config', '/etc/mongod.conf']
21+
ports:
22+
- "27017:27017"
23+
hostname: node0.mongodb.local
24+
networks:
25+
default:
26+
aliases:
27+
- node0.mongodb.local
28+
#cpuset: dbcpuset
29+
#cpu_count: dbcpu_count
30+
#mem_limit: dbmem_limit
31+
#mem_reservation: dbmem_reservation
32+
33+
mongodb1:
34+
build: ./env/docker/mongo
35+
command: ['mongod', '--config', '/etc/mongod.conf']
36+
ports:
37+
- "27018:27017"
38+
hostname: node1.mongodb.local
39+
networks:
40+
default:
41+
aliases:
42+
- node1.mongodb.local
43+
#cpuset: dbcpuset
44+
#cpu_count: dbcpu_count
45+
#mem_limit: dbmem_limit
46+
47+
mongodb2:
48+
build: ./env/docker/mongo
49+
command: ['mongod', '--config', '/etc/mongod.conf']
50+
ports:
51+
- "27019:27017"
52+
hostname: node2.mongodb.local
53+
networks:
54+
default:
55+
aliases:
56+
- node2.mongodb.local
57+
#cpuset: dbcpuset
58+
#cpu_count: dbcpu_count
59+
#mem_limit: dbmem_limit

env/docker/mongo/Dockerfile

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
FROM mongo:4.0
2+
3+
COPY mongod.conf /etc
4+
COPY init.sh /
5+
COPY status.sh /

env/docker/mongo/init.sh

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#!/bin/bash -ex
2+
3+
mongo <<EOF
4+
rs.initiate({'_id':'cluster',members:[{'_id':0,'host':'node0.mongodb.local:27017'},{'_id':1,'host':'node1.mongodb.local:27017'},{'_id':2,'host':'node2.mongodb.local:27017'}]});
5+
EOF

env/docker/mongo/mongod.conf

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# mongod.conf
2+
3+
# for documentation of all options, see:
4+
# http://docs.mongodb.org/manual/reference/configuration-options/
5+
6+
# where to write logging data.
7+
systemLog:
8+
verbosity: 0
9+
quiet: true
10+
11+
# Where and how to store data.
12+
storage:
13+
dbPath: /data/db
14+
journal:
15+
enabled: true
16+
17+
# network interfaces
18+
net:
19+
port: 27017
20+
21+
#operationProfiling:
22+
23+
replication:
24+
replSetName: cluster
25+

env/docker/mongo/status.sh

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#!/bin/bash -ex
2+
3+
mongo <<EOF
4+
rs.status();
5+
EOF

src/functions.php

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@
55
namespace Prooph\EventStoreBenchmarks;
66

77
use ArangoDb\Connection;
8+
use MongoDB\Client;
89
use PDO;
910
use Prooph\Common\Messaging\FQCNMessageFactory;
10-
use Prooph\EventStore\ArangoDb\EventStore as ArangoDbEventStore;
11-
use Prooph\EventStore\ArangoDb\Projection\ProjectionManager as ArangoDbProjectionManager;
1211
use Prooph\EventStore\ArangoDb\Type\DeleteCollection;
1312
use Prooph\EventStore\EventStore;
13+
use Prooph\EventStore\MongoDb\MongoDbEventStore;
14+
use Prooph\EventStore\MongoDb\Projection\MongoDbProjectionManager;
1415
use Prooph\EventStore\Pdo\MariaDbEventStore;
1516
use Prooph\EventStore\Pdo\MySqlEventStore;
1617
use Prooph\EventStore\Pdo\PostgresEventStore;
@@ -32,6 +33,7 @@ function testDatabases(): array
3233
'mariadb' => \getenv('MARIADB_DB'),
3334
'postgres' => \getenv('POSTGRES_DB'),
3435
'arangodb' => \getenv('ARANGODB_DB'),
36+
'mongodb' => \getenv('MONGODB_DB'),
3537
];
3638
}
3739

@@ -69,6 +71,10 @@ function createStreamStrategy(string $driver)
6971
case 'arangodb':
7072
$class = 'Prooph\EventStore\ArangoDb\PersistenceStrategy\\' . \getenv('STREAM_STRATEGY') . 'StreamStrategy';
7173

74+
return new $class();
75+
case 'mongodb':
76+
$class = 'Prooph\EventStore\MongoDb\PersistenceStrategy\MongoDb' . \getenv('STREAM_STRATEGY') . 'StreamStrategy';
77+
7278
return new $class();
7379
default:
7480
throw new \RuntimeException(\sprintf('Driver "%s" not supported', $driver));
@@ -116,6 +122,14 @@ function createConnection(string $driver)
116122
$connection->connect();
117123

118124
return $connection;
125+
case 'mongodb':
126+
return new Client(
127+
\getenv('MONGODB_HOST'),
128+
[],
129+
['typeMap' => ['root' => 'array', 'document' => 'array', 'array' => 'array']]
130+
);
131+
default:
132+
throw new \RuntimeException(\sprintf('Driver "%s" not supported', $driver));
119133
}
120134
}
121135

@@ -151,6 +165,10 @@ function createDatabase($connection, string $driver, string $dbName): void
151165
execute($connection, null, ...eventStreamsBatch());
152166
execute($connection, null, ...projectionsBatch());
153167
break;
168+
case 'mongodb':
169+
\Prooph\EventStore\MongoDb\MongoDbHelper::createProjectionCollection($connection, $dbName, 'projections');
170+
\Prooph\EventStore\MongoDb\MongoDbHelper::createEventStreamsCollection($connection, $dbName, 'event_streams');
171+
break;
154172
default:
155173
throw new \RuntimeException(\sprintf('Driver "%s" not supported', $driver));
156174
}
@@ -159,7 +177,7 @@ function createDatabase($connection, string $driver, string $dbName): void
159177
\sleep(1);
160178
}
161179

162-
function destroyDatabase($connection, string $driver, string $dbName): void
180+
function destroyDatabase($connection, string $driver): void
163181
{
164182
switch (\strtolower($driver)) {
165183
case 'mysql':
@@ -188,6 +206,9 @@ function destroyDatabase($connection, string $driver, string $dbName): void
188206
);
189207
}
190208
break;
209+
case 'mongodb':
210+
$connection->dropDatabase(\getenv('MONGODB_DB'));
211+
break;
191212
default:
192213
throw new \RuntimeException(\sprintf('Driver "%s" not supported', $driver));
193214
}
@@ -220,6 +241,15 @@ function createEventStore(string $driver, $connection): EventStore
220241
$connection,
221242
createStreamStrategy($driver)
222243
);
244+
case 'mongodb':
245+
return new MongoDbEventStore(
246+
new FQCNMessageFactory(),
247+
$connection,
248+
\getenv('MONGODB_DB'),
249+
createStreamStrategy($driver)
250+
);
251+
default:
252+
throw new \RuntimeException(\sprintf('Driver "%s" not supported', $driver));
223253
}
224254
}
225255

@@ -246,6 +276,16 @@ function createProjectionManager(EventStore $eventStore, string $driver, $connec
246276
$eventStore,
247277
$connection
248278
);
279+
case 'mongodb':
280+
return new MongoDbProjectionManager(
281+
$eventStore,
282+
$connection,
283+
createStreamStrategy($driver),
284+
new FQCNMessageFactory(),
285+
\getenv('MONGODB_DB')
286+
);
287+
default:
288+
throw new \RuntimeException(\sprintf('Driver "%s" not supported', $driver));
249289
}
250290
}
251291

0 commit comments

Comments
 (0)