保持?jǐn)?shù)據(jù)一致性
項目服務(wù)之間共用配置信息可以存儲在遠(yuǎn)程的redis,怎樣保存數(shù)據(jù)的一致性是個問題墓懂∈缯疲可以使用redis 的發(fā)布訂閱功能及時同步數(shù)據(jù)吊圾,思路
- 數(shù)據(jù)有變化的服務(wù)更新遠(yuǎn)程redis顶捷,并publish key 值到頻道
- 訂閱了數(shù)據(jù)的服務(wù)就會收到信息并去同步數(shù)據(jù)
可以把更新操作加到任務(wù)隊列挂绰,這樣就可以把業(yè)務(wù)和redis 處理分開。用laravel 這樣實現(xiàn)
# controller
public function updateConfig(Request $request)
{
// 其他邏輯...
// 分發(fā)任務(wù)到隊列
cacheJob::dispatch('setCacheData', $request->all());
}
# 命令創(chuàng)建任務(wù) php artisan make:job cacheJob
class cacheJob implements ShouldQueue{
public function __construct($callback, $arguments)
{
$this->callback =$callback;
$this->arguments =$arguments;
}
public function handle()
{
call_user_func($this->callback, $this->arguments);
}
# setCacheData
public function setCacheData($params)
{
// set....
$value = $params['data'];
$this->redis = $this->getRedis();
$this->redis->set('dataKey', $value);
// publish 比如頻道名test
$this->redis->publish('test', 'dataKey');
}
}
接下來再啟動php artisan queue:work 去處理隊列里面的任務(wù)焊切“缡冢可以用supervisor 管理該進程芳室,設(shè)置隨系統(tǒng)啟動专肪,啟動的進程個數(shù)。
那些訂閱遠(yuǎn)程redis test 頻道的客戶端就會收到同步信息堪侯,可以在需要訂閱數(shù)據(jù)的服務(wù)所在機器上簡單建一個訂閱服務(wù)嚎尤,一旦收到信息就同步。如下圖
subscribe1.png
subscribe/publish 在同一臺機器上伍宦,可以是不相關(guān)的兩個服務(wù)芽死。在subscribe 利用laravel構(gòu)建自定義命令乏梁,別忘記在Console/Kernel.php 添加命令類。同樣利用surpvisor 管理訂閱進程关贵,這樣就可以保持?jǐn)?shù)據(jù)一致性了遇骑!
# php artisan make command subscribeTest
class subscribeTest extends Command{
public function handle()
{
$this->redis = $this->getRedis();
$this->redis->subscribe(['test'], function ($message) {
// 獲取數(shù)據(jù)....
$this->getData($message);
});
}
}
歡迎大家給我留言,提建議揖曾,指出錯誤落萎,一起討論學(xué)習(xí)技術(shù)的感受!