mehr-it/system-broadcast

基于 Redis 的分布式系统内部通信的广播库

1.0.0 2019-05-20 21:25 UTC

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 方法为发布者和监听者设置相同的密钥。

请参阅类文档以获取其他签名参数。