Java互联网架构-微服务架构如何解决跨库问题的思路与方案?

疯癫冬瓜

我们公司使用的就是微服务加分库分表,一般来说如果应用系统出现性能瓶颈或者业务代码耦合过重,可考虑使用微服务架构,而后端的数据库通常使用读写分离,双主互备或者是分库分表来实现性能的提升和数据服务的高可用。



在数据分布在不同的数据库服务器的带来良好性能的同时,新的问题也随之而来,比如说数据一致性的保证,性能监控,数据存取复杂等,而较为突出的就是数据跨库问题!数据分布在不同的节点上,导致原来的连接查询需要跨库,字段的主键难以保证唯一,跨库的事务处理复杂,下面逐一解决:

1,连接查询(join)问题:因为库表分布在不同的机器上,连接查询失效。

解决办法:

①,代码解决:根据某个字段进行hash的方式进行分库分表,保证落在一个库中的类似表中(比如aa_00.t_user_0000和aa_00.t_member_0000),然后基于这样的规则在代码中进行连接查询语句书写!

②,同步:将常用的,需要的字段同步到一个库中进行联合查询!

③,冗余:在一个库中冗余更多的连接查询需要的字段,保证全部数据都能查询到!


2,唯一主键:如果使用传统的自增等方式,多库中的主键id势必重复,所以需要对唯一性加以控制!

解决方法:UUID(根据机器ID,时间等),redis(单线程保证不重复),snowflake算法!

3,分布式事务:

1,TCC:try控制业务代码流程,Confirm确认事务的正确性,cancel取消失败的事务!

2,基于消息系统的一致性方案:单节点事务完成后,通过发送消息保证事务提交,如果失败可通过重试,任务补偿等方式保证数据一致性!

总的来说,分布式系统有着很多以往不存在的问题,还需要具体问题具体分析,可一起交流,更多的技术分享,敬请关注。。。


分享到:


相關文章: