京东、58同城核心交易为什么还是用分库分表模式?

玩科技的勇哥鸭 2024-03-15 00:09:41

笔者也曾经有类似的疑问,因此请教过京东的架构师和58同城的 DBA 负责人 ,结论如下:

京东的核心交易是分库分表的策略 ;58 同城的核心交易是分库分表的策略,非核心业务场景大量使用 Tidb ,积累了丰富的运维经验。

笔者认为之所以在这两家电商公司核心业务依然是以分库分表,有一个非常重要的原因:分库分表的原理和运维相对简单。

我们以当前最流程的分库分表中间件 shardingsphere 为例,它包含两大产品:

ShardingSphere-ProxyShardingSphere-JDBC

▍一、ShardingSphere-Proxy

ShardingSphere-Proxy 被定位为透明化的数据库代理端,提供封装了数据库二进制协议的服务端版本,用于完成对异构语言的支持。

代理层介于应用程序与数据库间,每次请求都需要做一次转发,请求会存在额外的时延。

这种方式对于应用非常友好,应用基本零改动,和语言无关,可以通过连接共享减少连接数消耗。

▍二、ShardingSphere-JDBC

ShardingSphere-JDBC 是 ShardingSphere 的第一个产品,也是 ShardingSphere 的前身, 我们经常简称之为:sharding-jdbc 。

它定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。

当我们在 Proxy 和 JDBC 两种模式选择时,可以参考下表对照:

JDBC

Proxy

数据库

任意

MySQL/PostgreSQL

连接消耗数

异构语言

仅Java

任意

性能

损耗低

损耗略高

无中心化

静态入口

下图展示了 Prxoy 和 JDBC 两种模式的核心流程。

1.SQL 解析

分为词法解析和语法解析。 先通过词法解析器将 SQL 拆分为一个个不可再分的单词。再使用语法解析器对 SQL 进行理解,并最终提炼出解析上下文。

解析上下文包括表、选择项、排序项、分组项、聚合函数、分页信息、查询条件以及可能需要修改的占位符的标记。

2.执行器优化

合并和优化分片条件,如 OR 等。

3.SQL 路由

根据解析上下文匹配用户配置的分片策略,并生成路由路径。目前支持分片路由和广播路由。

4.SQL 改写

将 SQL 改写为在真实数据库中可以正确执行的语句。SQL 改写分为正确性改写和优化改写。

5.SQL 执行

通过多线程执行器异步执行。

6.结果归并

将多个执行结果集归并以便于通过统一的 JDBC 接口输出。结果归并包括流式归并、内存归并和使用装饰者模式的追加归并这几种方式。

从上面的解析,我们可以发现分库分表中间件原理非常相对简单。

很多同学认为分库分表复杂,是因为在生产环境实战偏少,没有足够的技术储备,很多互联网公司在使用分库分表的过程中,积累了大量的工程经验和技术储备,比如和分库分表密切相关的 DTS 数据传输服务,因此互联网公司使用分库分表起来比较有信心。

最后,谈谈笔者对于技术选型的看法。

Databases are specializing – the “one size fits all” approach no longer applies ----- MongoDB设计哲学

第一点:先有场景,然后再有适配这种场景的技术。什么样的场景选择什么样的技术。

第二点:现实往往很复杂,当我们真正做技术选型,并需要落地的时候,技术储备和成本是两个我们需要重点考量的因素。

▍ 技术储备

技术团队有无使用这门技术的经验,是否踩过生产环境的坑,以及针对这些坑有没有完备的解决方案;架构团队是否有成熟的SDK,工具链,甚至是技术产品。

▍ 成本

研发,测试,运维投入人力成本;服务器资源成本;招聘成本等。

最后一点是人的因素,特别是管理者的因素。每一次大的技术选型考验技术管理者的视野,格局,以及管理智慧。

0 阅读:0

玩科技的勇哥鸭

简介:感谢大家的关注