diff --git a/bench.sh b/bench.sh index 270b559..58d3f16 100755 --- a/bench.sh +++ b/bench.sh @@ -1,6 +1,6 @@ #!/usr/bin/env sh -USAGE="Usage: bench.sh --driver [arangodb | postgres | mysql | mariadb] [--strategy Single | Simple | Aggregate]" +USAGE="Usage: bench.sh --driver [arangodb | postgres | mysql | mariadb | mongodb] [--strategy Single | Simple | Aggregate]" DRIVER= STREAM_STRATEGY= @@ -40,7 +40,7 @@ export DRIVER=${DRIVER} export STREAM_STRATEGY=${STRATEGY} echo "" -echo "Starting benchmark ${DRIVER}!" +echo "Starting benchmark ${DRIVER} with strategy ${STRATEGY}!" php src/prepare.php php src/benchmark.php php src/cleanup.php diff --git a/bench_docker.sh b/bench_docker.sh index 3a36f26..ba36b92 100755 --- a/bench_docker.sh +++ b/bench_docker.sh @@ -1,6 +1,6 @@ #!/usr/bin/env sh -USAGE="Usage: bench_docker.sh --driver [arangodb | postgres | mysql | mariadb] [--strategy Single | Simple | Aggregate]" +USAGE="Usage: bench_docker.sh --driver [arangodb | postgres | mysql | mariadb | mongodb] [--strategy Single | Simple | Aggregate]" IDLE_TIME=40 DRIVER= @@ -68,9 +68,17 @@ sed -i "s/#mem_reservation: dbmem_reservation/mem_reservation: ${MEM}M/g" docker sed -i "s/BUFFER_POOL_SIZE/${BUFFER_POOL_SIZE}M/g" docker-compose.yml -docker-compose up -d --no-recreate database +docker-compose up -d --no-recreate docker-compose ps +if [ ${DRIVER} == "mongodb" ]; then + sleep 2 + docker-compose exec mongodb0 sh init.sh + sleep 1 + docker-compose exec mongodb0 sh status.sh + sleep 1 +fi + echo "" echo "" echo "Docker Info" diff --git a/composer.json b/composer.json index 9e24be2..672cc21 100644 --- a/composer.json +++ b/composer.json @@ -7,6 +7,7 @@ "prooph/pdo-event-store":"^1.5.1", "prooph/arangodb-event-store":"dev-master", "prooph/arangodb-php-driver-polyfill":"dev-master", + "prooph/mongodb-event-store": "dev-feature/projection-change-stream", "psr/container":"^1.0", "zendframework/zend-servicemanager":"^3.3", "vlucas/phpdotenv": "^2.4" @@ -47,6 +48,14 @@ { "type": "git", "url": "https://github.com/sandrokeil/arangodb-php-driver-polyfill" + }, + { + "type": "git", + "url": "git@github.com:sandrokeil/mongodb-event-store.git" + }, + { + "type": "git", + "url": "git@github.com:sandrokeil/mongodb-document-store.git" } ] } diff --git a/docker-compose-mongodb.yml b/docker-compose-mongodb.yml new file mode 100644 index 0000000..0c58b3c --- /dev/null +++ b/docker-compose-mongodb.yml @@ -0,0 +1,59 @@ +version: '2.3' +services: + # To run benchmark suite docker-compose run --rm php src/benchmark + php: + image: prooph/php:7.2-cli + environment: + DRIVER: "arangodb" + PHP_IDE_CONFIG: "serverName=application" + MONGODB_HOST: "mongodb://node0.mongodb.local:27017,node1.mongodb.local:27017,node2.mongodb.local:27017/replicaSet=cluster" + MONGODB_DB: event_store_bench + volumes: + - "./:/app" + #cpuset: phpcpuset + #cpu_count: phpcpu_count + #mem_limit: phpmem_limit + #mem_reservation: phpmem_reservation + + mongodb0: + build: ./env/docker/mongo + command: ['mongod', '--config', '/etc/mongod.conf'] + ports: + - "27017:27017" + hostname: node0.mongodb.local + networks: + default: + aliases: + - node0.mongodb.local + #cpuset: dbcpuset + #cpu_count: dbcpu_count + #mem_limit: dbmem_limit + #mem_reservation: dbmem_reservation + + mongodb1: + build: ./env/docker/mongo + command: ['mongod', '--config', '/etc/mongod.conf'] + ports: + - "27018:27017" + hostname: node1.mongodb.local + networks: + default: + aliases: + - node1.mongodb.local + #cpuset: dbcpuset + #cpu_count: dbcpu_count + #mem_limit: dbmem_limit + + mongodb2: + build: ./env/docker/mongo + command: ['mongod', '--config', '/etc/mongod.conf'] + ports: + - "27019:27017" + hostname: node2.mongodb.local + networks: + default: + aliases: + - node2.mongodb.local + #cpuset: dbcpuset + #cpu_count: dbcpu_count + #mem_limit: dbmem_limit diff --git a/env/docker/mongo/Dockerfile b/env/docker/mongo/Dockerfile new file mode 100644 index 0000000..35958af --- /dev/null +++ b/env/docker/mongo/Dockerfile @@ -0,0 +1,5 @@ +FROM mongo:4.0 + +COPY mongod.conf /etc +COPY init.sh / +COPY status.sh / diff --git a/env/docker/mongo/init.sh b/env/docker/mongo/init.sh new file mode 100644 index 0000000..598a33b --- /dev/null +++ b/env/docker/mongo/init.sh @@ -0,0 +1,5 @@ + #!/bin/bash -ex + +mongo < \getenv('MARIADB_DB'), 'postgres' => \getenv('POSTGRES_DB'), 'arangodb' => \getenv('ARANGODB_DB'), + 'mongodb' => \getenv('MONGODB_DB'), ]; } @@ -69,6 +71,10 @@ function createStreamStrategy(string $driver) case 'arangodb': $class = 'Prooph\EventStore\ArangoDb\PersistenceStrategy\\' . \getenv('STREAM_STRATEGY') . 'StreamStrategy'; + return new $class(); + case 'mongodb': + $class = 'Prooph\EventStore\MongoDb\PersistenceStrategy\MongoDb' . \getenv('STREAM_STRATEGY') . 'StreamStrategy'; + return new $class(); default: throw new \RuntimeException(\sprintf('Driver "%s" not supported', $driver)); @@ -116,6 +122,14 @@ function createConnection(string $driver) $connection->connect(); return $connection; + case 'mongodb': + return new Client( + \getenv('MONGODB_HOST'), + [], + ['typeMap' => ['root' => 'array', 'document' => 'array', 'array' => 'array']] + ); + default: + throw new \RuntimeException(\sprintf('Driver "%s" not supported', $driver)); } } @@ -151,6 +165,10 @@ function createDatabase($connection, string $driver, string $dbName): void execute($connection, null, ...eventStreamsBatch()); execute($connection, null, ...projectionsBatch()); break; + case 'mongodb': + \Prooph\EventStore\MongoDb\MongoDbHelper::createProjectionCollection($connection, $dbName, 'projections'); + \Prooph\EventStore\MongoDb\MongoDbHelper::createEventStreamsCollection($connection, $dbName, 'event_streams'); + break; default: throw new \RuntimeException(\sprintf('Driver "%s" not supported', $driver)); } @@ -159,7 +177,7 @@ function createDatabase($connection, string $driver, string $dbName): void \sleep(1); } -function destroyDatabase($connection, string $driver, string $dbName): void +function destroyDatabase($connection, string $driver): void { switch (\strtolower($driver)) { case 'mysql': @@ -188,6 +206,9 @@ function destroyDatabase($connection, string $driver, string $dbName): void ); } break; + case 'mongodb': + $connection->dropDatabase(\getenv('MONGODB_DB')); + break; default: throw new \RuntimeException(\sprintf('Driver "%s" not supported', $driver)); } @@ -220,6 +241,15 @@ function createEventStore(string $driver, $connection): EventStore $connection, createStreamStrategy($driver) ); + case 'mongodb': + return new MongoDbEventStore( + new FQCNMessageFactory(), + $connection, + \getenv('MONGODB_DB'), + createStreamStrategy($driver) + ); + default: + throw new \RuntimeException(\sprintf('Driver "%s" not supported', $driver)); } } @@ -246,6 +276,16 @@ function createProjectionManager(EventStore $eventStore, string $driver, $connec $eventStore, $connection ); + case 'mongodb': + return new MongoDbProjectionManager( + $eventStore, + $connection, + createStreamStrategy($driver), + new FQCNMessageFactory(), + \getenv('MONGODB_DB') + ); + default: + throw new \RuntimeException(\sprintf('Driver "%s" not supported', $driver)); } }