如何触发查询分离

这个问题是说应该在什么时候保存一份数据到查询数据库,即什么时候触发查询分离这个动作。

一般来说,查询分离的触发逻辑分为3种:

  • 修改业务代码,在写入常规数据后同步更新查询数据

  • 修改业务代码,在写入常规数据后,异步更新查询数据

  • 监控数据库日志,如有数据变更,则更新查询数据。

三种触发逻辑的优缺点和适用场景

优点
缺点
适用场景

修改业务代码,同步更新

  • 保证数据的实时性和一致性

  • 业务逻辑灵活可控

  • 侵入业务代码

  • 减缓写操作速度

  • 业务场景比较简单

  • 对写操作的响应性要求不高

修改业务代码,异步更新

  • 不影响主流程

  • 数据一致性较弱

  • 业务场景比较简单

  • 能够接受一定的数据不一致

监控数据库日志

  • 不影响主流程

  • 业务代码零侵入

  • 数据一致性较弱

  • 业务代码比较复杂

  • 能够接受一定的数据不一致

说明

业务逻辑灵活可控

一般来说,写业务代码的人能从业务逻辑中快速判断出何种情况下更新查询数据而监控数据库日志的人并不能将全部的数据库变更分支穷举出来,再把所有的可能性关联到对应的查询数据更新逻辑中,最终导致任何数据的变更都需要重新建立查询数据。

减缓写操作速度

当只是简单更新了订单的一个标识时,本来更新这个字段的时间只需要2毫秒,但是去更新订单的查询数据时,可能会涉及索引重建(比如使用Elasticsearch查询数据库时,会涉及索引、分片、主从备份,其中每个动作又细分为很多子动作),这时更新查询数据的过程可能就需要1秒了。