Skip to content

Support ​

The Support component provides shared utilities used across FriendsOfHyperf packages, including a fluent dispatch API, serializable closure jobs, and retry backoff strategies.

Installation ​

shell
composer require friendsofhyperf/support

AMQP, Kafka, and async queue integrations are optional. Install the corresponding Hyperf package before dispatching that message type.

Fluent Dispatch ​

The dispatch() helper selects a pending dispatcher from the value type:

  • Closure creates a CallQueuedClosure and uses the async queue dispatcher.
  • ProducerMessageInterface uses the AMQP producer dispatcher.
  • ProduceMessage uses the Kafka producer dispatcher.
  • Other values are rejected with InvalidArgumentException.

Async Queue ​

php
use function FriendsOfHyperf\Support\dispatch;

dispatch(function (UserService $users) {
    $users->synchronize();
})
    ->onPool('default')
    ->delay(30)
    ->setMaxAttempts(3);

The closure supports dependency injection. The pending object dispatches when it is destroyed.

AMQP and Kafka ​

php
dispatch($amqpMessage)
    ->onPool('default')
    ->setExchange('events')
    ->setRoutingKey('user.updated')
    ->setTimeout(5)
    ->setConfirm(true);

dispatch($kafkaMessage)->onPool('default');

Conditional Configuration ​

All pending dispatchers support when() and unless():

php
dispatch($job)
    ->when($highPriority, fn ($pending) => $pending->onPool('high-priority'))
    ->unless($canRunNow, fn ($pending) => $pending->delay(60));

Closure Jobs ​

Create a serializable async queue job directly when you need to pass it to another API:

php
use FriendsOfHyperf\Support\CallQueuedClosure;

$job = CallQueuedClosure::create(function () {
    return 'completed';
});
$job->setMaxAttempts(3);

Backoff Strategies ​

Backoff implementations return the next delay in milliseconds and expose next(), reset(), getAttempt(), and sleep().

Array Backoff ​

php
use FriendsOfHyperf\Support\Backoff\ArrayBackoff;

$custom = new ArrayBackoff([100, 500, 1000, 2000]);
$short = ArrayBackoff::fromPattern('short');
$fromString = ArrayBackoff::fromString('100, 500, 1000');

Set the constructor's second argument to false when the strategy should return 0 after the array is exhausted instead of repeating the last value.

Available Strategies ​

  • FixedBackoff: constant delay.
  • LinearBackoff: delay grows by a fixed step.
  • ExponentialBackoff: exponential growth with optional jitter.
  • FibonacciBackoff: Fibonacci sequence delays.
  • PoissonBackoff: delays based on a Poisson distribution.
  • DecorrelatedJitterBackoff: decorrelated jitter for distributed retries.
  • ArrayBackoff: caller-defined delay sequence.

Other Utilities ​

The package also contains retry() and once() helpers, plus ConfigurationUrlParser, Env, HtmlString, Number, Once, Sleep, Timebox, UuidContainer, RedisCommand, pipeline helpers, and reusable traits. Review the classes under FriendsOfHyperf\Support before adding a duplicate utility to another component.