Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Bits Laravel Package

glhd/bits

Generate unique 64‑bit IDs for distributed systems in PHP. Create Twitter Snowflake, Sonyflake, or custom bit-sequence identifiers with configurable worker/datacenter IDs and epoch for compact, time-ordered, collision-resistant IDs across multiple servers.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture Fit

  • Distributed ID Generation: Perfect fit for Laravel-based microservices, SaaS platforms, or event-driven architectures requiring globally unique, sortable IDs without UUID overhead.
  • Database Optimization: 64-bit IDs reduce storage costs by ~50% vs. UUIDs/ULIDs and enable time-based queries (e.g., WHERE id > firstForTimestamp(now()->subDay())).
  • Multi-Region Support: Native BITS_DATACENTER_ID/BITS_WORKER_ID configuration aligns with Kubernetes, Laravel Vapor, or multi-AZ deployments, avoiding collisions.
  • Event Sourcing/CQRS: IDs embed timestamps, enabling chronological event replay without separate created_at columns.

Integration Feasibility

  • Laravel Native: Seamless integration via:
    • HasSnowflakes trait (replaces HasUuids).
    • Eloquent casting ($casts = ['id' => Snowflake::class]).
    • Livewire synthesizers for client-side ID generation.
  • Database Agnostic: Works with MySQL, PostgreSQL, SQLite (no schema changes required).
  • API/Event Compatibility: Implements JsonSerializable and Query\Expression, ensuring compatibility with Laravel’s query builder and API responses.

Technical Risk

Risk Area Mitigation Strategy
Worker ID Conflicts Enforce unique BITS_WORKER_ID per process (e.g., via env vars or config).
Epoch Mismatch Validate BITS_EPOCH during deployment (e.g., CI/CD checks).
Lambda/Vapor Limits Use Redis-backed sequence resolution for serverless (see CacheSequenceResolver).
Time Skew Configure BITS_EPOCH to 2023-01-01 (default) or adjust for testing.
Frontend JS Limits Cast IDs to strings for JavaScript (handled automatically via JsonSerializable).

Key Questions

  1. Scalability Needs:
    • Will you exceed 1,024 workers (5-bit datacenter + 5-bit worker)? If so, consider a custom bitmask.
    • Do you need millisecond precision (Snowflake) or higher sequence resolution (Sonyflake)?
  2. Deployment Model:
    • How will BITS_WORKER_ID/BITS_DATACENTER_ID be managed in dynamic environments (e.g., Kubernetes, serverless)?
  3. Time-Based Queries:
    • Will you rely on toCarbon() for analytics? Test performance with large datasets (e.g., 10M+ records).
  4. Legacy Systems:
    • How will existing UUID-based relationships migrate to Snowflakes? (Consider a dual-write phase.)
  5. Testing:
    • How will you handle time travel in tests? Use Bits::setTestNow() instead of Carbon::setTestNow.

Integration Approach

Stack Fit

Laravel Component Integration Method
Eloquent Models use HasSnowflakes trait or $casts = ['id' => Snowflake::class].
API Responses Automatic JSON serialization via JsonSerializable.
Query Builder Query\Expression support enables direct ID comparisons (e.g., where('id', '>', ...)).
Livewire Register SnowflakeSynth in AppServiceProvider for client-side ID generation.
Events/Jobs Use snowflake_id() helper for concise ID generation in queues.
Testing Mock Bits::setTestNow() for deterministic test IDs.

Migration Path

  1. Phase 1: Pilot Service
    • Replace UUIDs in one microservice (e.g., Orders) with Snowflakes.
    • Use dual-write (store both UUID and Snowflake temporarily) for cross-service compatibility.
  2. Phase 2: Database Schema
    • Modify primary keys to BIGINT UNSIGNED (64-bit).
    • Add indexes on Snowflake IDs for time-based queries.
  3. Phase 3: Full Rollout
    • Replace HasUuids with HasSnowflakes across models.
    • Update API contracts to use Snowflake IDs in responses.
  4. Phase 4: Optimization
    • Enable time-based queries (e.g., User::where('id', '>', firstForTimestamp(...))).
    • Configure Redis-backed sequence resolution for high-throughput workers.

Compatibility

  • Laravel Versions: Tested up to Laravel 13 (backward-compatible with 11+).
  • Database: No schema changes required; works with MySQL, PostgreSQL, SQLite.
  • PHP: Requires PHP 8.1+ (for named arguments and attributes).
  • Dependencies: Compatible with Carbon v3, Livewire 3.x, and Redis (for distributed sequence resolution).

Sequencing

  1. Configure IDs:
    # Set in .env
    BITS_DATACENTER_ID=1
    BITS_WORKER_ID=1
    BITS_EPOCH=2023-01-01
    
  2. Install Package:
    composer require glhd/bits
    
  3. Apply to Models:
    use Glhd\Bits\Database\HasSnowflakes;
    
    class Order extends Model
    {
        use HasSnowflakes;
        protected $casts = ['id' => Snowflake::class];
    }
    
  4. Test ID Generation:
    $order = Order::create(['user_id' => 1]);
    assert($order->id instanceof Snowflake);
    assert($order->id->toCarbon()->year === 2023);
    
  5. Enable Livewire (Optional):
    // app/Providers/AppServiceProvider.php
    Livewire::propertySynthesizer(SnowflakeSynth::class);
    

Operational Impact

Maintenance

  • Configuration Drift: Monitor BITS_WORKER_ID/BITS_DATACENTER_ID in dynamic environments (e.g., Kubernetes pods).
  • Epoch Updates: Avoid setting BITS_EPOCH to a future date (throws exception).
  • Sequence Resolution: For high-throughput systems, use Redis-backed CacheSequenceResolver to avoid collisions.
  • Deprecation: No breaking changes in recent releases; MIT license allows forks if needed.

Support

  • Debugging IDs:
    $id = Snowflake::fromString('1234567890');
    $id->toCarbon(); // Extract timestamp
    $id->datacenter_id; // Verify worker/datacenter
    
  • Common Issues:
    • ID collisions: Ensure BITS_WORKER_ID is unique per process.
    • Time skew: Sync clocks across servers (NTP).
    • JavaScript limits: Cast IDs to strings when passing to frontend.
  • Community: Active maintainer (last release 2026-03-23), but no dependents suggests early adoption.

Scaling

Scenario Solution
Multi-Region Assign unique BITS_DATACENTER_ID per region (0–31).
High Throughput Use Redis-backed sequence resolution (CacheSequenceResolver).
Serverless (Vapor) Implement locking for worker IDs or use a centralized ID service.
Legacy UUIDs Use a migration script to backfill Snowflakes for existing records.

Failure Modes

Failure Scenario Impact Mitigation
Worker ID collision Duplicate IDs Enforce unique IDs via config.
Epoch misconfiguration Invalid timestamps Validate BITS_EPOCH in CI/CD.
Clock skew > 1ms ID generation gaps Sync NTP across servers.
Redis failure (sequence) Sequence exhaustion Fallback to in-memory resolver.
Database overflow (64-bit) ID wrap-around (2269 AD) Monitor and adjust epoch if needed.

Ramp-Up

  • Developer Onboarding:
    • 1-hour workshop: Cover HasSnowflakes, toCarbon(), and Livewire integration.
    • Cheat sheet: Include common patterns (e.g., time-based queries, ID casting).
  • **Performance
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
davejamesmiller/laravel-breadcrumbs
artisanry/parsedown
christhompsontldr/phpsdk
enqueue/dsn
bunny/bunny
enqueue/test
enqueue/null
enqueue/amqp-tools
bower-asset/punycode
bower-asset/inputmask
bower-asset/jquery
bower-asset/yii2-pjax
laravel/nova
spatie/laravel-mailcoach
spatie/laravel-superseeder
laravel/liferaft
nst/json-test-suite
danielmiessler/sec-lists
jackalope/jackalope-transport
twbs/bootstrap4