m1x0n / eventsauce-mongo-message-repository
MongoDB 存储实现,用于领域事件
v1.1.0
2020-01-22 08:28 UTC
Requires
- php: ^7.2
- ext-json: *
- ext-mongodb: ^1.6
- eventsauce/eventsauce: ~0.7
- mongodb/mongodb: ^1.5
- ramsey/uuid: ^3.9
Requires (Dev)
- phpstan/phpstan: ^0.12.3
- phpunit/phpunit: ^8
- squizlabs/php_codesniffer: ^3.5
This package is auto-updated.
Last update: 2024-09-22 19:08:52 UTC
README
为EventSauce消息存储库的MongoDB实现。
要求
- php: ^7.2
- ext-mongodb: ^1.6
安装
composer require m1x0n/eventsauce-mongo-message-repository
测试
docker-compose up -d
./vendor/bin/phpunit
用法
为了插入此存储库
- 您的环境中必须安装MongoDB。(例如,请参阅
docker-compose.yaml
) - 必须为php安装
ext-mongodb
- EventSauce 聚合根存储库应配置如下
$mongoDbName = 'mydb'; $eventsCollectionName = 'events'; // Initialize mongo client and select target database $client = new MongoDB\Client( null, [ 'username' => 'user', 'password' => 'secret' ] ); $database = $client->selectDatabase($mongoDbName); // Configure message repository or see MongoDbMessageRepositoryFactory $messageRepository = new \EventSauceExtensions\MongoDbMessageRepository( $database, new \EventSauceExtensions\MongoDbMessageSerializer( new \EventSauce\EventSourcing\Serialization\ConstructingMessageSerializer() ), $eventsCollectionName ); // MongoDbMessageSerializer also supports upcasting. // Upcasting is possible by passing upcaster itself as second argument // This is mostly for example and can be replaced with MessageBus dispatcher like RabbitMQ. // See eventsauce/rabbitmq-bundle-bindings $messageDispatcher = new \EventSauce\EventSourcing\SynchronousMessageDispatcher(); // MyAggregateClass must implement $bulbsAggregateRepository = new \EventSauce\EventSourcing\ConstructingAggregateRootRepository( MyAggreateClass::class, $messageRepository, $messageDispatcher );
可以使用依赖注入容器略微简化配置。
事件文档结构
事件序列化/反序列化是在以下文档结构下进行的
{
"_id": ObjectId("5dfe3322e006a263d256da36"),
"event_id": "482eacef-04f3-46c1-b88b-79457f67c778",
"event_type": "foo.bar.baz",
"aggregate_root_id": "3be51408-3e1e-4970-88e1-faadeb6796f3",
"aggregate_root_version": 5,
"time_of_recording": ISODate("2019-12-21T14:58:42.800Z"),
"headers": {
"__event_type": "foo.bar.baz",
"__time_of_recording": "2019-12-21 14:58:42.800066+0000",
"__aggregate_root_id": "3be51408-3e1e-4970-88e1-faadeb6796f3",
"__aggregate_root_version": 5,
"__aggregate_root_id_type": "foo.bar.id"
},
"payload": {
"id": "3be51408-3e1e-4970-88e1-faadeb6796f3"
}
}
最重要的信息放在 headers
和 payload
属性下。
性能
以下唯一索引应强制执行以提高性能,无论是对于 ConstructingAggregateRootRepository
还是 ConstructingAggregateRootRepositoryWithSnapshotting
。
Index := unique(aggregate_root_id + aggregate_root_version)
这可以在应用程序启动时完成
$database ->selectCollection('events') ->createIndex( [ 'aggregate_root_id' => 1, 'aggregate_root_version' => 1, ], [ 'unique' => true ] );
或通过mongo shell
db.events.createIndex( { aggregate_root_id: 1, aggregate_root_version: 1 }, { unique: true } )