mehr-it / system-broadcast
基于 Redis 的分布式系统内部通信的广播库
1.0.0
2019-05-20 21:25 UTC
Requires
- php: ^7.0
- predis/predis: ^1.1
Requires (Dev)
- phpunit/phpunit: ^7.4
- spatie/async: ^1.0
This package is auto-updated.
Last update: 2024-09-05 21:14:00 UTC
README
本包实现了使用 Redis 的分布式系统内部广播。
内部使用 Redis 的 publish
/subscribe
命令。这个库提供了一个简单的接口用于发布和接收消息,并提供了检查在广播频道未订阅时是否有消息被遗漏的机制。
基本用法
实现发布者非常简单
$broadcast = new SystemBroadcast(['host' => '127.0.0.1'], 'my-channel');
$broadcast->publish('my-message');
相应的监听器如下所示
$broadcast = new SystemBroadcast(['host' => '127.0.0.1'], 'my-channel');
$broadcast->handler('my-message', function() {
// do something
})
$broadcast->listen();
与消息一起传递数据
您可以将任何可序列化为 JSON 的数据与消息一起传递
$broadcast->publish('my-message', $data);
处理程序将数据作为第一个参数接收
$broadcast->handler('my-message', function($data) {
// do something
})
遗漏的消息
在监听广播时,监听器会接收到所有消息。但是,如果您的监听器进程因任何原因没有运行,在此期间发布的所有消息都将永久丢失。
即使您无法恢复遗漏的消息,您也可以检查是否在广播频道上遗漏了任何发布消息。您的处理程序可以接收一个序列值并将其保存到文件中
$broadcast->handler('my-message', function($data, $broadcast) {
$seq = $broadcast->sequence();
/* ... save it to file */
})
在开始监听之前,您可以注册一个 onListen
-回调,该回调在监听建立后立即接收当前的序列值。如果此值与处理程序存储的最后一个值不相等,则表示您遗漏了一些消息
$broadcast->onListen(function($sequence) {
$expected = /* ... load last sequence value from file */
if ($sequence != $expected) {
/* handle inconsitency */
}
});
签名消息
由于消息可能非常关键,您可以对消息进行签名。要这样做,请使用 setSignKey
方法为发布者和监听者设置相同的密钥。
请参阅类文档以获取其他签名参数。