MySQL 数据库的 CRUD 是通过各语言的 MySQL Connector 完成的。

这是每个程序员梦开始的地方,但也是错误开始的地方。

请问下面的代码有什么问题?

打开网易新闻 查看精彩图片

代码逻辑很简单,往一张表插入一条数据。

在真实的业务代码里,稍微会有变化的是不会每次创建一个短链接,而是使用线程池。另一方面,SQL语句会进行 PrepareStatement 格式化,避免 SQL 注入。

但这些都不是今天讨论的重点,重点是无论你是否使用线程池,PS 去格式化 SQL 语句,上述的代码都是不健壮的

因此,今天的重点是,如何进行健壮的数据库编程。

上述代码看似有了try、except这样的健壮逻辑,但是真实世界是非常复杂的。

try、except逻辑只能保证程序在单机运行是健壮的,因为单机运行每个指令都是原子的。

数据库真实的世界是怎样的?

真实的数据库世界是有高可用的,也就是说至少会是一主一从的架构,然后通过半同步复制保证主从数据的一致性。

在核心业务场景,通常会通过下面的设置确保主从数据的一致性:

plugin-load = "semisync_master.so;semisync_slave.so"rpl_semi_sync_master_enabled = 1rpl_semi_sync_slave_enabled = 1rpl_semi_sync_master_timeout = 999999999999

上述配置表示启动半同步插件,并将等待 ACK 时间设的无限大,这样能保证主从数据的严格一致。

若发生任何问题,通过外部 HA 组件进行 failover 的切换。

当然,用户也可以用 MGR(MySQL Group Replication) ,使用 Paxos 协议复制数据,从而保证数据一致性。切换通过 MGR 内置的 Paxos 协议进行选主。

什么?你的生产数据库环境没有类似半同步或Paxos复制机制?那请你尽快离开。

有了半同步复制,那么再看上面的代码,你会发现原子性被破坏了。

因为这时引入了网络,这是一个永远无法确定的环境。

在复杂多变的网络环境中,每次对于数据库的操作不一定是原子的。

也就是说,执行这条SQL,既不显示成功,也不报失败。

对外的表现形式就是数据库卡住了!

这时 DBA 任何操作都是徒劳的,除了进行 kill。但切记是 kill -9。

最简单的一种场景,一主一从,从机宕机,这时上述代码就会卡住,如:

打开网易新闻 查看精彩图片

不好意思,手抖了,应该是:

打开网易新闻 查看精彩图片

数据库卡住的表现是什么呢?通过命令 SHOW PROCESSLIST 你会看到类似如下的结果:

打开网易新闻 查看精彩图片

即大量的连接发生等待,无法继续执行。

而代码中的 except 异常处理逻辑,根本无法处理上述异常。

那上层服务的表现是什么呢?

雪崩

因为业务会不断接收新请求,尝试数据库访问,直至服务无法承受为止。

所以,任何健壮的数据库编程,应该都有一个超时时间,这也是 Fail-fast 的设计准则。

因此,对于上述代码,应该在创建连接时增加超时时间,如:

打开网易新闻 查看精彩图片

上述代码设置超时为2秒,任何数据库操作超过2秒,则会被 except 捕获,从而跳出永无止境的等待:

其实,不仅仅是数据库操作需要设置超时。任何网络之间的 RPC、HTTP 调用都需要设置超时时间,否则都不是健壮的代码

业务也可以通过超时的错误码进行限流,避免无限制的重试,从而导致业务最终发生雪崩。

最后的最后,若以后发生业务和 DBA 互相扯皮的事情,请这么怼他:你代码写得一点都不健壮,连数据库有异常都不会处理。我奶奶都知道要设置超时!来,我教你。

打开网易新闻 查看精彩图片

思考题

1. 文章只是给了 Python MySQL Connector 的超时设置,C++、Java、Go等语言该如何设置超时呢?

2. SHOW PROCESSLIST 中显示 waiting ACK 的线程能否被 kill,从而让其他等待的线程继续运行?为什么?

3. 半同步 AFTER_SYNC 和 AFTER_COMMIT 在上述例子中,SHOW PROCESSLIST 结果有何不同?为什么?

4. 今天封面的女郎是谁?

想要知道思考题答案的小伙伴,欢迎加入 IMG 官方社区高端群 。

入群请加姜老师个人微信82946772,并备注:码农入VIP群(网易)

IMG 官方社区高端群是订阅制的,不过也就99元/年,权当请姜老师喝杯咖啡。

在会员期间你可以享受到下面的福利:

  • 突破微信群人数500的限制,以后所有高端群小伙伴可以在一起吹水;
  • 提供 IMG 公众号每篇技术文章思考题的标准答案;
  • 技术圈的江湖八卦,比如某数据库出局某行的原委,某大V被新领导GZ;
  • IMG社区技术嘉年华大会门票5折优惠;
  • 姜老师夫妇的私密分享,包括技术、工作、投资、相亲、移民等热门话题;
  • 会员每邀请新会员入群,可以享受59元的返利(把年费赚回来);