分布式系统中客户访问到不一致窗口的旧数据怎么处理?
分布式的系统有很多种,通常情况下,我们的业务系统有数据存储分布式的,也有应用程序分布式的,不同的场景会应用到不同的分布式解决方案。
你这个问题提到了访问到旧数据,感觉像是数据库读写分离或者是主从机的场景。通常我们对于数据库主从设计,都是设置一台主库数据库服务器,一台或多台库数据库服务器,通过数据库日志订阅的模式进行数据同步。我们的系统也是写操作在主库进行,读操作在从库进行。
而这种方式中,主库和从库之间的数据同步会需要一定的时间,所以很大概率会出现写入主库的数据还没有同步到从库,用户就去读数据了,往往读出来的就是旧数据。
那么这种情况怎么来避免呢?
其实解决方案也有不少,主要看我们的场景是什么,然后考虑如何应用。
最简单的就是半同步复制(semi-sync)这种实现方式非常简单,我们的数据库同步就自带了此功能。当我们的写请求到主库以后,主库先自己把数据保存好,但是并不返回,而是等待从库同步,从库同步完成后,主库再告诉我们的应用程序数据保存成功。
使用这种方式的话,我们不需要修改任何的代码,数据库原本就带有这样的功能,配置也非常方便。但是不好的就是,我们的写请求时间会变长,锁表的时间也会增加,这会导致数据执行效率下降、吞吐量也就降低了。
如果我们对效率比较看重,那么可以使用这种方式——缓存缓存是一个好东西,在我们的各个业务场景都大量的使用。而缓存也可以用来保证读写分离以后的数据一致性。
方法其实也比较简单,就是我们在数据Commit成功以后,让缓存里面写入一条数据,我们的读并不直接作用到从库,而是作用到缓存上,这样就能够保证用户每次读取出来的数据都是最新的了。
不过,这里有一个问题,就是如果我们在一个事务里面进行了写操作,事务提交之前去读这个数据的话,如果去读缓存,就会读到旧的数据,可能导致我们的业务失败。所以,我们这里需要做一个处理,如果在事务里面读的话,我们需要读写库。只有没有事务的读,才会读缓存,这样就可以防止这种情况了。
当然,关于数据库缓存的一致性保证,其实是一个比较复杂的场景,还有很多的问题在里面,也有很多的解决方案。不管如何,使用这种方式的话,首先是需要增加设备成本——缓存服务器,其次就是代码需要进行改动,业务逻辑复杂度也会提高。
Copyright © 广州京杭网络科技有限公司 2005-2024 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有