werkspot / message-bus
一个通用的消息总线,可用于实现 CommandBus 或 EventBus 或其他类似结构。
Requires
- php: ^7.1
- ramsey/uuid: ^3.5
- roave/security-advisories: dev-master
Requires (Dev)
- doctrine/dbal: ^2.5
- doctrine/orm: ^2.5
- friendsofphp/php-cs-fixer: ^2.0
- mockery/mockery: v1.0.0-alpha1
- phpunit/phpunit: ^5.7
Suggests
- werkspot/message-bus-werkspot-message-queue-adapter: The adapter for the Werkspot/MessageQueue.
- werkspot/message-queue: A message queue that is proven to work with this message bus.
This package is auto-updated.
Last update: 2020-10-21 07:22:34 UTC
README
本项目是什么
一个库,能够通过某些其他队列库同步或异步地发送消息到目的地。
要发送的消息可以是任何内容,目的地可以由任何字符串指定。
可以配置一个中间件链(DeliveryChain),消息将通过所有这些中间件,使我们能够在发送消息之前和/或之后执行各种操作,如验证消息、开始和提交事务、根据某些标准替换目的地、执行某些日志记录,或我们需要的任何操作。
为什么这个项目存在
消息总线可以使项目非常灵活和高效。我们可以在消息总线之上轻松创建 Command Bus、Event Bus、Event Sourcing、队列或任何类似的结构。
用法
MessageDispatcher
是消息总线的入口点。该库已经提供了一些中间件,您可以在 src/Bus/DeliveryChain
中找到。
$bus = Bus::fromMiddlewareList($middleware1, $middleware2 /*, ... */); $messageDispatcher = new MessageDispatcher($bus); $messageDispatcher->dispatchSynchronousMessage( $someObjectOrStringOrWhatever, // some payload to deliver, persisted by the MessageRepository '{"deliver_to": "SomeServiceId"}', // destination to be decoded by the delivery service (MessageDeliveryServiceInterface) [] // some whatever metadata );
如果您需要异步发送消息,则需要将 AsynchronousDeliveryMiddleware
添加到总线中。
AsynchronousDeliveryMiddleware
依赖于 MessageQueueServiceInterface
。因此,您需要选择一个队列库并创建该库的适配器,该适配器实现了 MessageQueueServiceInterface
,以便它可以注入到 AsynchronousDeliveryMiddleware
中。
例如
$messageQueueService = new MessageQueueServiceAdapterThatImplementsMessageQueueServiceInterface(/* ... */); $bus = Bus::fromMiddlewareList( $middleware1, $middleware2, new AsynchronousDeliveryMiddleware($messageQueueService) /*, ... */ ); // Now you can send an Asynchronous (potentially Queued) message $messageDispatcher->dispatchQueuedMessage( $someObjectOrStringOrWhatever, // some payload to deliver, persisted by the MessageRepository '{"deliver_to": "SomeServiceId"}', // destination to be decoded by the delivery service (MessageDeliveryServiceInterface) [], // some whatever metadata new DateTimeImmutable('2037-10-08'), // some (optional, future) delivery date new Priority(Priority::NORMAL) // some priority, from 1 to 9 );
如果您想同时发送同步和异步消息,需要注意的一点是,您需要确保在总线中先调用 AsynchronousDeliveryMiddleware
,然后再调用 SynchronousDeliveryMiddleware
。否则,同步中间件将始终在消息排队之前处理它,排队将无法正常工作。
安装
要安装该库,运行以下命令并将获得最新版本
composer require werkspot/message-bus
测试
要执行测试,请运行
make test
覆盖率
要生成测试覆盖率,请运行
make test-with-coverage
代码规范
要修复代码规范,请运行
make cs-fix