当前位置: 首页 > 科技观察

微服务架构下,使用Sharding-jdbc解决读写分离和查询延迟的问题

时间:2023-03-15 15:33:04 科技观察

前言当Mysql数据库中的数据量达到一定量时,查询SQL的执行会变慢,常规手段除外比如索引、优化程序代码、SQL语句等等,另外使用经典的MHA数据库中间件来实现数据库读写分离也是一个不错的选择。但是读写分离架构有一个通病:SQL读延迟。读写实时场景,比如在微服务应用端添加一条业务数据,然后立即读取。这时候就会遇到无法读取的情况!为什么?来源网络是因为在读写分离架构中,master节点负责写入,同时mysql采用多线程技术同步数据到slave节点,slave节点负责读取从节点的请求应用端。Mysql主从数据同步数据存在同步时间差,带来从节点无法同步主节点(Master)数据,应用端无法从从节点(Slave)读取新增数据的问题。该解决方案使用官方HintManager分片键值管理器强制路由到主库查询。通过调用hintManager.setMasterRouteOnly()强制路由到主库查询,伪代码如下:id,wid);}通过强制路由查询主库存在风险。更新和实时查询的业务场景很多。会影响主库服务器的性能,也可能会影响主从数据的同步,所以这种方式带来的服务器性能问题要根据实际业务场景进行评估。另外,如果可以在业务层面做出妥协,尽量减少这种实时更新和查询。一种思路是实时更新库,使用线程异步查询(比如更新后休眠1-2秒再查询),伪代码如下:publicclassArticleCacheTaskimplementsRunnable{@Overridepublicvoidrun(){try{//控制读写分离和异步设置Thread.sleep(2000);}catch(InterruptedExceptione){e.printStackTrace();}ArticleEntityarticleEntity=articleService.getWithMasterDB(Long.valueOf(id),wid);}}