详谈为什么互联网公司禁止使用存储过程
!!! 本文已参与「新人创作礼」活动,一起开启掘金创作之路。更多干货文章,可以访问 菜鸟厚非
【强制】禁止使用存储过程,存储过程难以调试和扩展,更没有移值性。
其实这一句话足以说明问题,有小伙伴肯定会疑惑,在银行或者证券等公司工作为什么会大量使用存储过程呢?这就是我们今天讲解的内容,首先两个问题
1 . 为什么银行都在用存储过程 2 . 存储过程为什么成为互联网弃子
像银行这类系统,通常会采用商用的数据库 Oracle、DB2 等,应为这些供应商有着完整的解决方案,可以帮助银行规避大量的风险。银行的一些外围业务会使用一些国产的分布式数据库或者 MySQL 这样开源的数据库。
银行是以数据为核心,且早期银行在建设业务的时候,没有好的国产数据库,所以采采购了 Oracle、DB2 这样有成功经验的的数据库。且每套数据库都有着自己的一套存储过程开发方式,只要掌握了存储过程的开发技巧,对数据的交互过程是没有问题的,对于前端使用 go、java、c++ 才是第二关心得问题。
但是近些年,互联网企业,都在禁用存储过程呢。
1 . 闭源
首先其实去 IOE (进行国产化),应为有些数据库并不开源,你不知道会不窃取你的核心数据,会不会外泄。 2 . 数据迁移 如果说切数据库可以,数据迁移是比较好迁移的一方,但是大量的存储过程要全部重写,一旦重写谁能确保新的存储过程在新的平台执行没有问题,一旦影响的核心业务谁能谁敢带来的风险。
尽管一直在喊去 IOE ,在一些外围业务上会用 Mysql 这样的开源数据库进行一些尝试,但在核心业务上仍然是 Oracle、DB2 等数据库。
3 . 分布式场景的问题 在水平分表的情况下,用存储过程处理所有数据的分析结果,存储过程是做不到的。应为存储过程只能作用于局部分片的数据库。
4 . 数据库压力激增 大家也都知道分布式缓存架构,这样的目的是从上到下,逐级的进行筛选,尽可能的使少量的请求到数据库,减少数据库压力。应为百分之八九十处理慢,都是在数据库 SQL 层面。
应为存储过程本身都是在数据库层面,之前多的很多缓存方面都是徒劳的,最后处理数据的时候还是要到存储过程进行处理。
5 . 无法保证分布式全局事务 假如我们在一个水平分片情况下,处理数据导入,数据要均匀的分布在每个表。假如分片1、分片2成功了,分片3应为某个字段没有效验通过失败了数据进行了回滚,那可不可以通过分片3存储过程回滚分片1、分片2的数据到导入前的状态数据呢。
显然是不可能的,在数据库层面也没有提供跨进程的数据库交互方面的 API ,所以在分布式场景下存储过程是不是就不好用了。
6 . 难以调试,没有内置的版本管理方案
这个很多同学都身有体会,我们在处理百万数据库的时候,很可能应为某一行的某个字段,而导致存储过程执行异常,这个你怎么可以快速从百万数据库从快速找到那一条呢,这个是相当费劲的。
7 . 业务执行碎片化 在银行应为场景下,对于核心的业务,银行会让自己的员工写存储过程处理流水、账单等业务数据,外围外包系统开发人员对于核心的业务不是会那么了解,他们只需要调用银行员工写的存储过程即可,当然这也是职责分明。
但是有个特别恶心的事情,如果某一天执行存储过程失败了,对于外围系统收到的异常信息是特别少的,可能只提示、存储过程的某一行、异常时间,不知道当时的数据场景。作为外包人员只能去猜,是哪一块执行异常,然后根据本地日志定位到调用的哪个存储过程发生了错误,然后又到数据库根据数据库执行异常,结合去分析。想想都头发麻,是不是这么回事,懂得都懂。
一个有趣去的帖子