这段时间Db不给力,经常出现主从同步延迟或者挂掉的情况,导致很多业务出现异常,大家就讨论怎么样让程序强制读master,关于这个方面的讨论比较激烈,主要为两种。
- 底层DB类不应该关注主从的抉择,应该交于业务侧的用户抉择,这样业务层使用起来比较灵活。
- 业务层的用户不应该关注主从的抉择,应该交给DB层解决,因为如果业务层人为不小心把强制读master的代码上到了压力大的线上,会对Db造成很大的压力,会出现很多不可控的因素。
我本人持第二种观点,程序中的bug,大部分都是人的失误造成的,在编程的世界里,人才是最大的bug,不应该把业务的稳定性依赖于人。
但是现在业务上主从的问题要解决,并且再快的主从同步也会出现延迟,在不依赖其他的存储工具的情况下,使用强制读master是必须要实现的功能,那么怎么才能设计出来一个安全性高一些的操作方式呢?
最初的想法,通过在调用查询函数时加入强制读master参数。
$daoCity = new \dao\City();
$ret = $daoCity->findAllBySql("select * from city limit 1",$useMaster=true);
这个想法很快被淘汰了,原因如下。
- 所有要修改的读取函数太多,太麻烦。
- 使用方法不优美,忍不了。
- 如果出现不了解的程序员直接拷贝代码,将其上线到线上环境,可能出现事故。
接着出现了第二版的设计,通过一个函数来开启master读取,再主动关闭master读取。
$da