mgdigital/busque
Busque is a lightweight command bus for Laravel that maps commands to dedicated handlers, keeping controllers and services thin. It supports middleware pipelines and queued command execution, making it easy to organize complex application logic with a clean, testable CQRS-style approach.
Architecture fit. Busque is a self-contained job pipeline: a long-running worker daemon, a cron-like scheduler, and a Redis-backed state store with an operator UI, wrapped for Laravel via a service provider. Architecturally it is an alternative to Laravel's native queue plus schedule:run, not a layer on top of them. That distinction is decisive, because it competes with the exact subsystem the framework has since absorbed and productized (Horizon, queue:work, schedule:work, database-backed failed jobs). Adopting it means opting out of a core framework subsystem and owning the replacement indefinitely.
Fit is therefore narrow: a Laravel 5.5–8 application on PHP 7.x that wants queue, scheduler, and dashboard from a single dependency and is not prepared to build or configure Horizon-style observability. Outside that envelope it is a poor architectural match regardless of code quality.
Integration feasibility. MIT license, no commercial entanglement, no runtime licensing cost. Installation is composer require plus provider registration — trivially feasible in isolation. The blockers are not installation; they are the version envelope and the maintenance posture.
Technical risk.
ShouldQueue/Queueable. Job classes are not portable to or from the framework queue, so the engineering investment is stranded on exit.maxmemory-policy noeviction, and support for TLS, ACL users, and cluster topologies is unverified and unlikely given the Redis 3–5 era. Validate against your actual managed Redis endpoint, not localhost.Key questions for the team.
schedule:work may satisfy it with zero new dependencies.noeviction on the Redis instance under memory pressure, in writing, with alerting?Stack fit. Green-light only where the application is PHP 7.x / Laravel ≤8 and the realistic alternative is building a scheduler and queue-visibility layer in-house. There, busque is a defensible short-term buy against weeks of internal work. Where the stack is PHP 8.1+ / Laravel 9+, decline — the compatibility work exceeds the value delivered by an archived package with modest adoption.
Migration path. Assume no in-flight migration. Busque's payload format and job contract are its own; jobs already queued under the framework's queue driver cannot be drained into it. The realistic sequence is:
schedule:run/schedule:work to prevent double-firing.Budget for this being one-way in practice: reversing it means the same operation plus a rewrite of any job that leaned on busque-specific behaviour. Document the migration as irreversible in the design record.
Compatibility work, in order of effort.
replace so a Packagist delisting cannot break builds; pin to a commit SHA, never a floating constraint.noeviction, TLS, ACL, and key-prefix behaviour against the real managed endpoint.Sequencing. Fork-and-pin → local validation of dispatch, delay, and schedule semantics → staging soak with realistic volume including delayed and scheduled jobs (not just happy-path dispatch) → production on one non-critical queue → broaden. Gate each step on observed behaviour, not on the README.
Maintenance. Archived means your team is the maintainer. Realistic cost: one to three engineer-weeks to fork, pin, containerize, and reach credible familiarity with the codebase, plus a standing 10–15% of one engineer for security triage and PHP/Redis drift. Every subsequent framework upgrade acquires a "does busque still work" gate. That recurring tax — not the install time — is the number to put in front of the sponsor.
Support. No upstream fixes and no maintainer to escalate to. The community is small (117 stars, low score), so public answers are sparse and dated. Institutional knowledge must be written down deliberately or it leaves with the engineer who wired it up.
Scaling. The daemon is a per-node process: you scale by adding processes and hosts, not by autoscaling on queue depth without building that control yourself. Throughput is bounded by Redis round-trips and configured worker count. There is no first-class backpressure, rate limiting, or fair priority handling comparable to a modern queue manager. The scheduler is a single logical component — run two instances and you get duplicate execution unless every scheduled command is idempotent.
Failure modes to design around explicitly.
allkeys-lru policy under memory pressure deletes queued jobs with no error surfaced anywhere. Enforce noeviction and alert on memory headroom.Ramp-up. New engineers must learn busque's bespoke command contract, its scheduler expression format, and its Redis key layout — knowledge that transfers to no other system and appears in no hiring pipeline. Estimate two to five days for a mid-level engineer to become productive, and record it as a permanent onboarding line item rather than a one-time cost.
Recommendation posture. Treat busque as a technical-debt acquisition with a defined exit, not a solution. Approve only with a named owner, a forked-and-pinned repository, a dated plan to migrate to Horizon plus schedule:work (or another maintained scheduler) within two quarters, and explicit written acceptance of the Redis durability requirements above. Otherwise decline and build the visibility layer on framework primitives.
How can I help you explore Laravel packages today?