数据不一致产生的原因
互联网的工程开发,与传统软件相比,往往要面临非常复杂多变的业务场景,这是老生常谈的问题了。虽然在工程开发与协同领域已经有了比较多的实践案例,但对于比较底层的一些技术框架的协同,由于选型的原因,往往是比较多元化的,这也就导致了一些基础框架之间的协同会出现一些问题。
举个例子,在搜索领域,往往会采用ES这一类的全文检索引擎进行加速,但由于搜索往往还要带有广告、推荐等信息,很多时候还需要读取具备ACID的RDMS数据库,或者是一些NoSQL数据库,多种数据库组合在一起,才能满足业务上的需求。
这么多异构的数据源组合在一起,虽然能够将系统做的更大和更灵活,但也会带来很多问题,例如:
-
工程上的实现更加繁琐,没有办法将所有数据库的操作封装到统一的DAL层;
-
在一些可回滚的业务场景里,数据要在多个数据库之间同步的进行ACID操作。
例如广告业务场景里,有一个业务场景是只计费一次,流程有如下的步骤:
-
数据写入Mysql;
-
数据写入ES;
-
数据写入Redis。
步骤1是为了将数据传递给财务系统,步骤2是为了重新调整检索顺序,步骤3是为了一些事实的推荐场景应用。如果第1步就失败了,那么整个顺序就不需要执行,但如果第1步成功而第2步失败,那么虽然计费成功了,但是在检索的时候就会出现问题,导致出现第二次的计费。
如果业务对于一致性