lexdss/nats
Composer 安装命令:
composer require lexdss/nats
包简介
nats jetstream client for php
关键字:
README 文档
README
Feel free to contribute or give any feedback.
- Installation
- Connection
- Publish Subscribe
- Request Response
- JetStream Api Usage
- Key Value Storage
- Using NKeys with JWT
- Performance
- Configuration Options
Installation
The recommended way to install the library is through Composer:
$ composer require basis-company/nats
The NKeys functionality requires Ed25519, which is provided in libsodium extension or sodium_compat package.
Connection
use Basis\Nats\Client; use Basis\Nats\Configuration; // this is default options, you can override anyone $configuration = new Configuration([ 'host' => 'localhost', 'jwt' => null, 'lang' => 'php', 'pass' => null, 'pedantic' => false, 'port' => 4222, 'reconnect' => true, 'timeout' => 1, 'token' => null, 'user' => null, 'nkey' => null, 'verbose' => false, 'version' => 'dev', ]); // default delay mode is constant - first retry be in 1ms, second in 1ms, third in 1ms $configuration->setDelay(0.001); // linear delay mode - first retry be in 1ms, second in 2ms, third in 3ms, fourth in 4ms, etc... $configuration->setDelay(0.001, Configuration::DELAY_LINEAR); // exponential delay mode - first retry be in 10ms, second in 100ms, third in 1s, fourth if 10 seconds, etc... $configuration->setDelay(0.01, Configuration::DELAY_EXPONENTIAL); $client = new Client($configuration); $client->ping(); // true
Connecting to a cluster with TLS enabled
Typically, when connecting to a cluster with TLS enabled the connection settings do not change. The client lib will automatically switch over to TLS 1.2. However, if you're using a self-signed certificate you may have to point to your local CA file using the tlsCaFile setting.
When connecting to a nats cluster that requires the client to provide TLS certificates use the tlsCertFile and tlsKeyFile to point at your local TLS certificate and private key file.
Nats Server documentation for:
Connection settings when connecting to a nats server that has TLS and TLS Client verify enabled.
use Basis\Nats\Client; use Basis\Nats\Configuration; // this is default options, you can override anyone $configuration = new Configuration([ 'host' => 'localhost', 'jwt' => null, 'lang' => 'php', 'pass' => null, 'pedantic' => false, 'port' => 4222, 'reconnect' => true, 'timeout' => 1, 'token' => null, 'user' => null, 'nkey' => null, 'verbose' => false, 'version' => 'dev', 'tlsCertFile' => "./certs/client-cert.pem", 'tlsKeyFile' => "./certs/client-key.pem", 'tlsCaFile' => "./certs/client-key.pem", ]); $configuration->setDelay(0.001); $client = new Client($configuration); $client->ping(); // true
Publish Subscribe
$client->subscribe('hello', function ($message) { var_dump('got message', $message); // tester }); $client->publish('hello', 'tester'); $client->process(); // if you want to append some headers, construct payload manually use Basis\Nats\Message\Payload; $payload = new Payload('tester', [ 'Nats-Msg-Id' => 'payload-example' ]); $client->publish('hello', $payload);
Request Response
There is a simple wrapper over publish and feedback processing, so payload can be constructed manually same way.
$client->subscribe('hello.request', function ($name) { return "Hello, " . $name; }); // async interaction $client->request('hello.request', 'Nekufa1', function ($response) { var_dump($response); // Hello, Nekufa1 }); $client->process(); // process request // sync interaction (block until response get back) $client->dispatch('hello.request', 'Nekufa2'); // Hello, Nekufa2
JetStream Api Usage
use Basis\Nats\Stream\RetentionPolicy; use Basis\Nats\Stream\StorageBackend; $accountInfo = $client->getApi()->getInfo(); // account_info_response object $stream = $client->getApi()->getStream('mailer'); $stream->getConfiguration() ->setRetentionPolicy(RetentionPolicy::WORK_QUEUE) ->setStorageBackend(StorageBackend::MEMORY) ->setSubjects(['mailer.greet', 'mailer.bye']); // stream is created with given configuration $stream->create(); // and put some tasks so workers would be doing something $stream->put('mailer.greet', 'nekufa@gmail.com'); $stream->put('mailer.bye', 'nekufa@gmail.com'); var_dump($stream->info()); // can stream info // this should be set in your worker $greeter = $stream->getConsumer('greeter'); $greeter->getConfiguration()->setSubjectFilter('mailer.greet'); // consumer would be created would on first handle call $greeter->handle(function ($address) { mail($address, "Hi there!"); }); var_dump($greater->info()); // can consumer info $goodbyer = $stream->getConsumer('goodbyer'); $goodbyer->getConfiguration()->setSubjectFilter('mailer.bye'); $goodbyer->create(); // create consumer if you don't want to handle anything right now $goodbyer->handle(function ($address) { mail($address, "See you later"); }); // you can configure batching and iteration count using chain api $goodbyer ->setBatching(2) // how many messages would be requested from nats stream ->setIterations(3) // how many times message request should be sent ->handle(function () { // if you need to break on next iteration simply call interrupt method // batch will be processed to the end and the handling would be stopped // $goodbyer->interrupt(); }); // if you need to append some headers, construct payload manually use Basis\Nats\Message\Payload; $payload = new Payload('nekufa@gmail.com', [ 'Nats-Msg-Id' => 'single-send' ]); $stream->put('mailer.bye', $payload);
Key Value Storage
$bucket = $client->getApi()->getBucket('bucket_name'); // basics $bucket->put('username', 'nekufa'); echo $bucket->get('username'); // nekufa // safe update (given revision) $entry = $bucket->getEntry('username'); echo $entry->value; // nekufa $bucket->update('username', 'bazyaba', $entry->revision); // delete value $bucket->delete('username'); // purge value history $bucket->purge('username'); // get bucket stats var_dump($bucket->getStatus());
Using NKeys with JWT
To use NKeys with JWT, simply provide them in the Configuration options as jwt and nkey.
You can also provide a credentials file with CredentialsParser
use Basis\Nats\Client; use Basis\Nats\Configuration; use Basis\Nats\NKeys\CredentialsParser; $configuration = new Configuration( [ 'host' => 'localhost', 'port' => 4222 ], CredentialsParser::fromFile($credentialPath) ); $client = new Client($configuration);
Performance
Testing on i5-4670k with nats running in docker gives 420k rps for publish and 350k rps for receive in non-verbose mode.
You can run tests on your environment.
% wget https://getcomposer.org/download/latest-stable/composer.phar ... Saving to: ‘composer.phar’ % ./composer.phar install Installing dependencies from lock file (including require-dev) ... % export NATS_HOST=0.0.0.0 % export NATS_PORT=4222 % export NATS_CLIENT_LOG=1 % composer run perf-test PHPUnit 9.5.10 by Sebastian Bergmann and contributors. Runtime: PHP 8.1.1 Configuration: /home/nekufa/software/github/nats.php/phpunit.xml.dist Warning: No code coverage driver available [2022-01-19T10:42:14.008230+00:00] SubjectTest.testPerformance.INFO: start performance test [] [] [2022-01-19T10:42:14.246606+00:00] SubjectTest.testPerformance.INFO: publishing {"rps":421871.0,"length":100000,"time":0.23703885078430176} [] [2022-01-19T10:42:14.530670+00:00] SubjectTest.testPerformance.INFO: processing {"rps":355120.0,"length":100000,"time":0.2839939594268799} [] % export NATS_CLIENT_VERBOSE=1 % composer run perf-test PHPUnit 9.5.10 by Sebastian Bergmann and contributors. Runtime: PHP 8.1.1 Configuration: /home/nekufa/software/github/nats.php/phpunit.xml.dist Warning: No code coverage driver available [2022-01-19T10:42:21.319838+00:00] SubjectTest.testPerformance.INFO: start performance test [] [] [2022-01-19T10:42:21.766501+00:00] SubjectTest.testPerformance.INFO: publishing {"rps":224640.0,"length":100000,"time":0.4451560974121094} [] [2022-01-19T10:42:21.922010+00:00] SubjectTest.testPerformance.INFO: processing {"rps":353317.0,"length":100000,"time":0.15544414520263672} [] . 1 / 1 (100%) nekufa@fasiga ~ % cat /proc/cpuinfo | grep i5 model name : Intel(R) Core(TM) i5-4670K CPU @ 3.40GHz
Configuration Options
The following is the list of configuration options and default values.
| Option | Default | Description |
|---|---|---|
inboxPrefix |
"_INBOX" |
Sets de prefix for automatically created inboxes |
jwt |
Token for JWT Authentication. Alternatively you can use CredentialsParser | |
nkey |
Ed25519 based public key signature used for NKEY Authentication. | |
pass |
Sets the password for a connection. | |
pedantic |
false |
Turns on strict subject format checks. |
pingInterval |
2 |
Number of seconds between client-sent pings. |
port |
4222 |
Port to connect to (only used if servers is not specified). |
timeout |
1 | Number of seconds the client will wait for a connection to be established. |
token |
Sets a authorization token for a connection. | |
tlsKeyFile |
TLS 1.2 Client key file path. | |
tlsCertFile |
TLS 1.2 Client certificate file path. | |
tlsCaFile |
TLS 1.2 CA certificate filepath. | |
user |
Sets the username for a connection. | |
verbose |
false |
Turns on +OK protocol acknowledgements. |
lexdss/nats 适用场景与选型建议
lexdss/nats 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 1.1k 次下载、GitHub Stars 达 0, 最近一次更新时间为 2022 年 11 月 24 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「queue」 「storage」 「client」 「response」 「publish」 「messaging」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 lexdss/nats 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 lexdss/nats 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 lexdss/nats 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
A SDK for working with B2 cloud storage.
Small library to access Microsoft Windows Azure Blob Storage with a Service or a StreamWrapper.
PHP AMQP Binding Library
A Laravel package to monitor queue jobs.
Mock PSR-18 HTTP client
Asynchronous MQTT client built on React
统计信息
- 总下载量: 1.1k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 18
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: mit
- 更新时间: 2022-11-24