scout searchable() 异步执行遇到数据库读写分离延迟问题

环境说明

linux + laravel 5.5 + redis 异步队列
阿里云 mysql 数据库(读写分离两库)

# 开启了全文索引
SCOUT_DRIVER=elastic
# composer 的 es 类库
composer require babenkoivan/scout-elasticsearch-driver

问题说明

首先 mysql 数据库分了master 和 slave,slave 作为只读数据库。
$model->where('id', 10)->searchable(); 方法执行 es 数据同步。由于使用 redis 异步队列,队列进程在执行同步任务查询数据时,使用的是 slave 数据库连接,恰巧由于 slave 同步慢于队列任务的执行,导致查询不到记录用于 es 同步。

解决办法

scout searchable() 异步执行遇到数据库读写分离延迟问题
这个 laravel 官方 scout 的代码,执行队列任务添加。
我通过->delay(Carbon::now()->addSecond(10));延迟执行异步任务是可以尽可能的避免上诉问题。但我不想改动底层的代码。

不改动框架代码的情况下,有没更优的处理方法?

比如:能否在队列任务执行前,指定该任务使用 master 数据库连接。

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

再写一个 CustomSearchable 的 trait,引入 scout 原来的 Searchable ,然后重写 queueMakeSearchable 方法。

或者建一个 SearchableModel 的抽象类,继承 Model 类,引入 Searchable ,重写方法,需要用 scout 的模型类都继承这个 SearchableModel。

1年前 评论
JohnnyDen (楼主) 1年前
讨论数量: 6

直接指定连接主库查询,例如:DB::connection(‘write’)->table(‘test’)->get();Model也可以TestModel::onWriteConnect()->get();

1年前 评论
JohnnyDen (楼主) 1年前

加机子就解决了 1主多从 多主多从

1年前 评论
JohnnyDen (楼主) 1年前

再写一个 CustomSearchable 的 trait,引入 scout 原来的 Searchable ,然后重写 queueMakeSearchable 方法。

或者建一个 SearchableModel 的抽象类,继承 Model 类,引入 Searchable ,重写方法,需要用 scout 的模型类都继承这个 SearchableModel。

1年前 评论
JohnnyDen (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!