alexlcdee/messenger-tarantool-bundle
Installation
composer require alexlcdee/messenger-tarantool-bundle
Ensure your config/bundles.php includes:
Alexlcdee\MessengerTarantoolBundle\AlexlcdeeMessengerTarantoolBundle::class => ['all' => true],
Configuration
Add to config/packages/alexlcdee_messenger_tarantool.yaml:
messenger_tarantool:
dsn: 'tarantool://user:password@localhost:3301/'
space: 'messages'
queue: 'default'
First Use Case Create a message class:
namespace App\Message;
class SendEmail {
public string $email;
public string $subject;
}
Dispatch it via Messenger:
$bus->dispatch(new SendEmail('user@example.com', 'Welcome!'));
Worker Setup Run the worker:
php bin/console messenger:consume messenger_tarantool -vv
Message Dispatching
Use Symfony Messenger’s BusInterface to send messages to Tarantool:
$bus->dispatch(new ProcessOrder($orderId));
The bundle serializes and stores messages in Tarantool’s specified space.
Handling Messages Create a handler:
namespace App\MessageHandler;
use App\Message\ProcessOrder;
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
#[AsMessageHandler]
class ProcessOrderHandler {
public function __invoke(ProcessOrder $message) {
// Process logic
}
}
Queue Management
config/packages/alexlcdee_messenger_tarantool.yaml:
messenger_tarantool:
queues:
high_priority: { space: 'messages', queue: 'high' }
default: { space: 'messages', queue: 'default' }
$bus->dispatch(new UrgentTask(), ['queue' => 'high_priority']);
Retry Logic
Leverage Symfony Messenger’s retry middleware (enabled by default). Customize in config/packages/messenger.yaml:
messenger:
transports:
messenger_tarantool:
dsn: '%env(MESSENGER_TARANTOOL_DSN)%'
retry_strategy:
max_retries: 3
delay: 1000
multiplier: 2
Batching Use Tarantool’s batch operations for bulk processing:
$bus->dispatch(new BatchProcess([$task1, $task2, $task3]), ['queue' => 'batch']);
Event-Driven Architecture Combine with Symfony Events for pre/post-processing:
$dispatcher->addListener(MessageBusInterface::MESSAGE, function ($message) {
// Log or transform messages
});
Monitoring Use Tarantool’s admin interface to monitor queue sizes:
tarantoolctl --host localhost --port 3301
> box.space.messages:select()
Testing Mock Tarantool in PHPUnit:
$this->getContainer()->get('messenger.transport.messenger_tarantool')->setClient($mockTarantool);
Async Validation Validate messages before dispatching:
$validator = $this->getContainer()->get('validator');
$errors = $validator->validate($message);
if (count($errors) > 0) {
throw new \RuntimeException('Validation failed');
}
Serialization Issues
use Symfony\Component\Serializer\Annotation\SerializedName;
class UserCreated {
#[SerializedName('user_id')]
public int $id;
}
@SerializedName).Connection Timeouts
messenger_tarantool.yaml:
messenger_tarantool:
options:
connect_timeout: 5.0
recv_timeout: 10.0
Worker Stuck on Failures
messenger:failed:remove to clean up:
php bin/console messenger:failed:remove --limit=100
Space/Queue Mismatch
space and queue names in config. Tarantool is case-sensitive:
messenger_tarantool:
space: 'Messages' # Wrong if your space is named 'messages'
Missing Middleware
Symfony\Component\Messenger\Middleware\HandleMessage is included in your pipeline. The bundle adds it by default, but custom setups may omit it.Log Messages
Enable debug mode in messenger_tarantool.yaml:
messenger_tarantool:
debug: true
Logs will appear in var/log/dev.log.
Check Tarantool Logs Inspect Tarantool’s logs for connection errors:
tail -f /var/log/tarantool/tarantool.log
Verify Message Storage Manually inspect the Tarantool space:
-- In Tarantool console
box.space.messages:select()
Worker Verbosity
Run the worker with -vvv for detailed output:
php bin/console messenger:consume messenger_tarantool -vvv
Custom Serializer
Override the default serializer in config/packages/messenger.yaml:
messenger:
transports:
messenger_tarantool:
dsn: '%env(MESSENGER_TARANTOOL_DSN)%'
serializer: App\Serializer\TarantoolSerializer
Pre/Post Dispatch Hooks
Use Symfony’s MessageBus decorator to add logic:
$bus = new MessageBus([
new PreDispatchMiddleware(),
$bus->all(),
new PostDispatchMiddleware(),
]);
Dynamic Queue Routing
Implement Symfony\Component\Messenger\Transport\Serialization\SerializerInterface to route messages dynamically:
class DynamicQueueSerializer implements SerializerInterface {
public function decode(array $encoded): array {
$queue = $encoded['headers']['queue'] ?? 'default';
return ['queue' => $queue, 'body' => $encoded['body']];
}
}
Tarantool Schema Management Extend the bundle to create/update spaces/queues on install:
use Doctrine\DBAL\Connection;
use Symfony\Component\HttpKernel\Bundle\Bundle;
class CustomBundle extends Bundle {
public function boot() {
$connection = $this->container->get('database_connection');
$connection->executeStatement('
box.schema.space.create("messages", {if_not_exists=true})
');
}
}
How can I help you explore Laravel packages today?