Redis
 sql >> Teknologi Basis Data >  >> NoSQL >> Redis

Dorong ke antrian Laravel dari luar Laravel (NodeJS)

Pertama, perhatikan bahwa ini adalah format pekerjaan dalam antrian berbasis database di Laravel 5.3. Versi Laravel yang lebih baru berisi perubahan.

Kolom payload harus berisi objek json dengan format berikut. Pekerjaan (...\\[email protected] ) dapat di-hard-code dalam skenario ini. Saya percaya kunci commandName hanya untuk tujuan tampilan. Kunci perintah, bagaimanapun, adalah bagian yang lebih sulit, itu harus menjadi objek valid yang didukung oleh unserialize(). Sepertinya ada paket yang tersedia di npm untuk tujuan ini, pencarian cepat muncul di php-serialization.

{
    "job": "Illuminate\\Queue\\[email protected]",
    "data": {
        "commandName": "App\\Jobs\\MyJobClass",
        "command": "O:19:\"App\\Jobs\\MyJobClass\"... /* stuff */"
    }
}

Payload json yang Anda berikan menghasilkan objek berikut. Baik pekerjaan maupun kunci data itu penting.

{
  "job": "Illuminate\\Broadcasting\\BroadcastEvent",
  "data": {
    "event": "O:28:\"App\\Events\\NotificationEvent\":5:{s:7:\"\u0000*\u0000name\";s:12:\"notification\";s:4:\"data\";a:4:{s:4:\"testkey\";s:14:\"testval\";s:9:\"timestamp\";s:19:\"2017-02-24 11:07:48\";s:5:\"event\";s:12:\"notification\";s:5:\"class\";s:28:\"App\\Events\\NotificationEvent\";}s:10:\"\u0000*\u0000channel\";N;s:7:\"\u0000*\u0000user\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":2:{s:5:\"class\";s:8:\"App\\User\";s:2:\"id\";i:2;}s:6:\"socket\";N;}"
  },
  "id": "XuUKRTf8CTSdzaVgp2gRcvmxQqLcpBUG",
  "attempts": 1
}

Bagian yang bermasalah, saya kira, adalah objek serial. Diformat ulang dengan cara yang lebih mudah dibaca (tetapi benar-benar merusaknya) ...

O:28:"App\Events\NotificationEvent":5:{
    // protected $name = 'notification'
    s:7:" * name";s:12:"notification";

    // public $data = array(...)
    s:4:"data";a:4:{
        // 'testkey => 'testval'
        s:4:"testkey";s:14:"testval";

        // 'timestamp' => '2017-02-24 11:07:48';
        s:9:"timestamp";s:19:"2017-02-24 11:07:48";

        // 'event' => 'notification';
        s:5:"event";s:12:"notification";

        // 'class' => App\Events\NotificationEvent::class;
        s:5:"class";s:28:"App\Events\NotificationEvent";
    }

    // protected $channel = null;
    s:10:"\0*\0channel";N;

    // protected $user = (instance of ModelIdentifier)
    s:7:"\0*\0user";O:45:"Illuminate\Contracts\Database\ModelIdentifier":2:{
        // public $class = App\User::class;
        s:5:"class";s:8:"App\User";

        // public $id = 2;
        s:2:"id";i:2;
    }

    // public $socket = null;
    s:6:"socket";N;
}

Format ini memperlihatkan fakta bahwa pekerjaan Anda menggunakan sifat SerializesModels yang menggantikan referensi ke model sebagai entri sederhana yang berisi class+identifier, dan akan memulihkannya selama __wakeup.

Saya yakin masalah Anda adalah dengan parsing mental json dan format serialisasi; struktur tebakan Anda ... salah.

Langkah selanjutnya adalah tidak menebak apa-apa.1. Gandakan pemberitahuan pengujian yang tepat ini yang sudah Anda miliki payloadnya. Cukup copy-paste saja. (Anda mungkin perlu mengubah id, saya kira itu digunakan untuk deduplikasi.)2. Bangun data acara menggunakan php-serialisasi dan bertujuan untuk membangun sesuatu yang identik dengan muatan acara asli. Tidak ada perubahan sama sekali.3. Jika berhasil sejauh ini, jangan ragu untuk mengubah data peristiwa bersambung untuk melihat apa yang terjadi.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. redis bgsave gagal karena fork Tidak dapat mengalokasikan memori

  2. Redis publish/subscribe:lihat channel apa yang saat ini disubscribe

  3. Pisahkan string dengan karakter di Lua

  4. Redis Pub/Sub dengan Keandalan

  5. Simpan sesi pengguna di Redis dengan ASP.NET Core di Azure