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 同步。
解决办法
这个 laravel 官方 scout 的代码,执行队列任务添加。
我通过->delay(Carbon::now()->addSecond(10));
延迟执行异步任务是可以尽可能的避免上诉问题。但我不想改动底层的代码。
不改动框架代码的情况下,有没更优的处理方法?
比如:能否在队列任务执行前,指定该任务使用 master 数据库连接。
再写一个 CustomSearchable 的 trait,引入 scout 原来的 Searchable ,然后重写
queueMakeSearchable
方法。或者建一个 SearchableModel 的抽象类,继承 Model 类,引入 Searchable ,重写方法,需要用 scout 的模型类都继承这个 SearchableModel。