m1x0n/eventsauce-mongo-message-repository

MongoDB 存储实现,用于领域事件

v1.1.0 2020-01-22 08:28 UTC

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"
    }
}

最重要的信息放在 headerspayload 属性下。

性能

以下唯一索引应强制执行以提高性能,无论是对于 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 }
)