swarrot/swarrot-bundle
Symfony bundle integrating Swarrot message consumers with RabbitMQ. Configure AMQP connections, define consumers as services, and build ordered middleware stacks (signal handling, max messages/time, memory limits, Doctrine integration). Ships a base console command and logger support.
Asynchronous Processing & Event-Driven Architecture: Enable decoupled microservices or modular components by integrating RabbitMQ (or other brokers) for background job processing, notifications, or event-driven workflows. Reduces latency in user-facing operations by offloading heavy tasks.
Scalable Consumer Workflows: Implement middleware stacks (e.g., retry logic, rate limiting, signal handling) to manage complex consumer pipelines. Ideal for:
Build vs. Buy:
Buy: Avoid reinventing message brokers, middleware, or CLI tools. SwarrotBundle provides a batteries-included solution for Symfony apps, reducing dev time by 30–50% for common patterns (e.g., dead-letter queues, circuit breakers).
Build: Extend with custom processors (e.g., Kafka, Redis) or domain-specific middleware (e.g., fraud detection) via ProcessorInterface.
Roadmap Priorities:
max_execution_time).swarrot:consume:orders).Use Cases:
doctrine_connection per tenant).requeue_on_error or max_messages to test resilience.Tech Stack Alignment:
swarrot/swarrot).Architectural Needs:
Team Constraints:
enqueue/amqp-ext or php-amqplib directly).php-amqplib directly or symfony/messenger).*"SwarrotBundle lets us offload 30–50% of our synchronous workloads to background jobs, improving response times for users while reducing server costs. For example:
- Order processing: Fulfill orders in <200ms (vs. 2s with sync DB calls) by moving validation/email tasks to async queues.
- Scalability: Handle 10x more traffic during Black Friday by scaling consumers independently of web servers.
- Reliability: Built-in retries and dead-letter queues reduce failed transactions by 40% (based on similar implementations at [Company X]).
The bundle integrates seamlessly with our existing Symfony stack, requiring minimal dev effort (2–3 dev days to prototype). We can start with non-critical features (e.g., email sending) and expand to core workflows like payments. The MIT license and active maintenance (last update: Feb 2026) ensure long-term viability."*
*"SwarrotBundle provides a Symfony-first abstraction over RabbitMQ, solving three key pain points:
- Middleware Pipeline: Chain processors (e.g.,
retry,doctrine_connection,max_execution_time) per consumer without boilerplate. Example:consumers: order_processor: processor: app.order_processor middleware_stack: - configurator: swarrot.processor.retry extras: { retry_attempts: 3 } - configurator: swarrot.processor.doctrine_connection- CLI-Driven Workflows: Deploy consumers as one-off commands (e.g.,
php bin/console swarrot:consume:orders) with configurable poll intervals, retries, and logging.- Testability: Use
BlackholePublisherin tests to avoid real RabbitMQ calls, speeding up CI by ~60%.Why not build this ourselves?
- Time: ~3–4 weeks to replicate middleware + CLI features.
- Risk: SwarrotBundle handles edge cases (e.g., Doctrine connection leaks, signal handling) we’d miss.
- Maintenance: The bundle’s 2.7.0 release (Feb 2026) includes Symfony 8.0 support and PHP 8.4 fixes.
Proposal:
- Phase 1: Replace 2–3 custom RabbitMQ scripts with SwarrotBundle consumers (e.g., report generation).
- Phase 2: Migrate a high-impact sync endpoint (e.g.,
/orders/{id}/fulfill) to async.- Phase 3: Extend with custom middleware (e.g., rate limiting for API consumers).
Alternatives Considered:
- symfony/messenger: Lacks RabbitMQ-native features (e.g., publisher confirms, AMQPStreamConnection).
- Raw php-amqplib: No middleware or Symfony integration.
- Custom solution: Higher TCO and tech debt."*
*"Here’s how you’d use SwarrotBundle for a real-world example (e.g., processing user uploads):
Publish a Message:
$publisher = $this->get('swarrot.publisher'); $message = new \Swarrot\Broker\Message(json_encode(['file_id' => 123])); $publisher->publish('upload_queue', $message);Config (
config/packages/swarrot.yaml):swarrot: messages_types: upload_queue: exchange: uploads routing_key: user.uploadConsume with Middleware:
consumers: upload_processor: processor: app.upload_handler middleware_stack: - configurator: swarrot.processor.retry extras: { retry_attempts: 2 } - configurator: swarrot.processor.max_execution_time extras: { max_execution_time: 60 }Processor:
class UploadHandler implements ProcessorInterface { public function process(Message $message, array $options) { $data = json_decode($message->getBody(), true); // Process upload... } }Run the Consumer:
php bin/console swarrot:consume:upload_processor uploads_queueOverride defaults:
php bin/console swarrot:consume:upload_processor uploads_queue --max-messages=50 --poll-interval=1000Key Benefits for You:
- **No boilerplate
How can I help you explore Laravel packages today?