graze / graze/queue

AMQP Adapter

Offen
#32 3 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
Vorherrschende Sprache
PHP
Sterne
49
Forks
10
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

This is just a placeholder for discussion regarding a new AMQP adapter (RabbitMQ, etc).

I did some prototyping of a new adapter using the SqsAdapter as a baseline and my preferred library (one of the best AFAIK): https://github.com/videlalvaro/php-amqplib.

I was able to `enqueue` and `dequeue` the messages rather easily, but have had trouble with `acknowledge` thus far. I'll continue to work on that and link to it when I have something functional.

The AMQP library recommends that consumers use `$channel->basic_consume()`.
https://github.com/videlalvaro/php-amqplib/blob/master/PhpAmqpLib/Channel/AMQPChannel.php#L898

This works by declaring a callback and the consumer will remain attached and receiving messages as long as the callback is registered.

The core logic looks roughly like this:

```
try {
// params: $queue, $consumer_tag, $no_local, $no_ack, $exclusive, $nowait, $callback
$channel->basic_consume($this->name, '', false, false, false, false, $callback);
} catch (Exception $e) {
// @TODO Channel setup exception
}

// Loop as long as the channel has callbacks registered
while (count($channel->callbacks)) {
try {
var_dump('waiting');
$channel->wait();
} catch (Exception $e) {
// @TODO Channel wait exception
}
}
```

I have not yet been able to `dequeue` using the above `basic_consume` logic which I think will be the best long-term approach for this new adapter. I'll circle back to this after I can get `acknowledge` working.

However, I was able to get the `$channel->basic_get()` operation to work within a loop yielding `$factory->createMessage()` items.
https://github.com/videlalvaro/php-amqplib/blob/master/PhpAmqpLib/Channel/AMQPChannel.php#L981

The AMQP library doesn't recommend this due to inefficiencies (etc), but I have seen their maintainers suggest this method as an option for people trying to build their own blocking consumers.

A third option is also a possibility: `$channel->batch_basic_publish()`
https://github.com/videlalvaro/php-amqplib/blob/master/PhpAmqpLib/Channel/AMQPChannel.php#L1115
I haven't used it myself and didn't know it was even available until last week.

Beitragsleitfaden

Beitragsleitfaden öffnen

Rechercherichtung

Beginne mit dem Vergleich des vorhandenen SqsAdapter mit den im Issue erwähnten Einstiegspunkten von php-amqplib AMQPChannel: basic_consume(), basic_get() und batch_basic_publish(). Untersuche zuerst die Bestätigungs- und Consumer-Verhaltensweisen; abgeschlossen ist die Arbeit, wenn ein funktionaler AMQP-Adapter vorhanden ist, der enqueue, dequeue und acknowledge unterstützt.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
php, rabbitmq
Bereich
backend, distributed-systems
Issue-Typ
Feature
Schwierigkeit
5/5
Geschätzter Aufwand
Über eine Woche
Aktivitätsstatus
Veraltet
Klarheit
Muss geklärt werden
Anfängerfreundlichkeit
25/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.