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 数据库连接。

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
最佳答案

再写一个 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年前

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