Redis
 sql >> Baza danych >  >> NoSQL >> Redis

Push do kolejki Laravel z zewnątrz Laravel (NodeJS)

Po pierwsze, zauważ, że jest to format zadań w kolejce opartej na bazie danych w Laravel 5.3. Nowsze wersje Laravela zawierają zmiany.

Kolumna ładunku powinna zawierać obiekt json w następującym formacie. Zadanie (...\\[email protected] ) mogą być zakodowane na stałe w tym scenariuszu. Uważam, że klawisz commandName służy tylko do wyświetlania. Klucz polecenia jest jednak trudniejszy, powinien być prawidłowym obiektem, który obsługuje unserialize(). Wygląda na to, że na npm dostępne są pakiety do tego celu, szybkie wyszukiwanie uruchomiło serializację php.

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

Podany ładunek json daje wynik w następującym obiekcie. Zarówno zadanie, jak i klucze danych są ważne.

{
  "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
}

Przypuszczam, że problematyczną częścią jest obiekt zserializowany. Sformatowany w sposób, który jest łatwiejszy do odczytania (ale całkowicie go psuje) ...

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;
}

Ten format uwidacznia fakt, że Twoje zadanie używa cechy SerializesModels, która zastępuje odniesienia do modeli jako prosty wpis zawierający klasę+identyfikator i przywraca je podczas __wakeup.

Uważam, że twój problem dotyczy mentalnego parsowania json i formatu serializacji; Twoja odgadnięta struktura jest ... błędna.

Następnymi krokami nie byłoby zgadywanie czegokolwiek.1. Zduplikuj dokładnie to powiadomienie testowe, dla którego już masz ładunek. Po prostu skopiuj i wklej. (Może być konieczna zmiana identyfikatora, myślę, że jest on używany do deduplikacji.)2. Zbuduj dane zdarzenia za pomocą serializacji php i staraj się zbudować coś identycznego z oryginalnym ładunkiem zdarzenia. Brak zmian.3. Jeśli to działa tak daleko, możesz zmienić serializowane dane zdarzenia, aby zobaczyć, co się stanie.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Serwer MongoDB jest niedostępny w sieci lokalnej pomimo wiązania ip

  2. Jak usunąć klucze pasujące do wzorca w Redis

  3. Jak zwiększyć wydajność Redis przy 100% CPU? Fragmentowanie? Najszybszy klient .Net?

  4. Połączenie Redis z 127.0.0.1:6379 nie powiodło się - połącz ECONNREFUSED

  5. Uzyskiwanie adresu Redis Master z Sentinel C#