直连别人的数据库,靠谱吗

简介: 直连别人的数据库,靠谱吗

640.jpg

话题来源于和某同学的交流,他说自己的系统A需要调用B系统中的数据,然后开发给的方案是直接连接B系统的数据库。我也不知道是哪位高人想出的方案,以为只是临时的方案。结果他和我说,他们线上也是这么做的。


640.png


01


随着业务复杂性的增加和微服务的流行,越来越多的应用系统开始进行分布式的设计和部署。系统由原来单一的技术架构变成面向服务的多系统架构。原来在一个系统之间可以完成的业务流程,通过多系统之间多次交互来实现。如果是上下游依赖的数据,直连其他业务的数据库,会有什么不妥的地方呢?笔者认为会有以下4点缺陷:

 

表结构变更带来的问题:由于是对方的业务系统,当因为业务需要,对方变更表结构时,不太可能及时通知到己方,那么自己的系统就有可能在没有升级的情况下,出现错误,导致业务上的失败。如果通知了,己方还要被动升级,也是很麻烦的,造成了强依赖。

 

数据库的性能问题:原则上,自己的数据库只有本方应用可以调用。这样可以很方清晰地控制调用频率,但是现在数据库有第三方在调用,而我们又无法从系统上控制别人的使用频率,如果对方调用的频率太高,引发数据库连接数不够用,会影响到自身的业务。同时,还可能造成数据库锁表的问题,当你发现有锁表现象出现,然后根据SQL的ID在己方的系统中又查不到相关记录,是不是会很崩溃?

 

留痕问题:在系统中的操作,我们都应该做到有据可查(可以设置日志级别,但不能没有),以便在发现问题时,可以及时定位。但是对方是直连数据库的,如果对数据做了修改,自己都不知道,也无从查证(自己的日志里没有,但数据又被改了,你崩溃不)。虽然我们可能只会提供只读的权限,但也是存在风险的。

 

安全问题:安全性应该是第一位被考虑到的,但是现在数据库一般都是在内网,配置基本上也做了分离,所以危害性也没那么重要了。但也不能不考虑。

 

基于上以原因,笔者认为,一个成熟的开发,就不应该采用这类方式来获取上下游的数据。


02


那么,在实际的应用场景中,服务或者系统之间,应该采用什么方式来解决数据交互的问题呢?常见的一般有三类:接口、文件和消息队列。

 

接口交互:这是最常见的交互方式,现在的微服务,基本上都是基于RPC协议和Rest协议,双方定义好数据交互的格式,就可以了相互通信了。从业务层面来讲,通过接口,可以更好地描述业务诉求是什么,为了解决什么问题。同时,接口也屏蔽了系统内部的实现细节,调用方只关系自己需要的内容,只要出入参数不变,内部如何重构,都是可以的。

 

文件共享:在传输大量的数据内容时,接口就会有问题,比如连接超时、网络占用过高等。这种情况下,我们就需要用到文件共享。A系统把数据处理好,按照规定的格式生成文件,然后放到中间的文件服务器上,B系统在另一个时间段根据规则从文件服务器上获取这份数据,并解析处理。笔者在之前处理医院系统的数据时,就是这么做的。医院在晚上11点把当天的数据处理好,并上传的文件服务器上,我们的系统12点再从服务器上获取文件,并做数据的处理(大约是2G左右的数量,如果走接口,不合适)。

 

消息队列:这个也是现在被大量使用的交互方式。对于可异步处理的业务,通过MQ来理最合适不过了。即可以做到业务的解耦,也可以在高峰期起到削峰填谷的作用。现在常用的MQ中间件有Kafka、RabbitMQ等。


03


不同的数据交互都有自己的优缺点和适应场景,直连数据库当然也是一种处理方式,但是在明显有其他更好的选择下,直连的缺点就会被放大,现在基本上也不建议这么做了。从测试的角度来看,直连可能是最简单的测试方式了,直接改数据库多直接。其他的几种方式,需要有额外的手段去保障,同时,对于测试数据的构造,也提出了更多的要求。对于这种依赖数据,如何处理,之前也讨论过,可参考:模拟数据在实际场景中的应用


往期推荐:

微服务的测试策略

微服务间的测试策略

单体微服务的测试策略

你还记得测试策略么

敏捷测试系列文章合集

相关文章
|
SQL Java 数据库连接
Jmeter之直连数据库框架搭建简介
Jmeter之直连数据库框架搭建简介:通过直连数据库让程序代替接口访问数据库,如果二者预期结果不一致,就找到了程序的缺陷。本文通过一个案例分析讲解如何实现:获取某个字段值,放在百度上搜索的效果。。。
180 0
Jmeter之直连数据库框架搭建简介
|
监控 关系型数据库 MySQL
配置grafana直连zabbix数据库(十二)
配置grafana直连zabbix数据库 由于grafana都是通过zabbix取值最终展示在图形中,但是由于zabbix某些监控项可能获取值的时间较长,因此我们可以让grafana直连数据库进行直接取值,从而让展示的图形更加准确
865 0
配置grafana直连zabbix数据库(十二)
|
存储 安全 关系型数据库
Gitlab从删库到恢复 - 数据库备份\恢复\容灾\HA的靠谱姿势
标签 PostgreSQL , 节假日巡检 , 监控 , 闪回 , flash back query , trigger , event trigger , 回收站 , recycle bin , pgtranshcan , hook , _PG_init , 事件触发器 , 审计 , 跟踪 , 逻辑复制 , DDL逻辑复制 , UDR , BDR , 数据库安全 背景 如果你是身处数据库行业的朋友,最近可能被朋友圈的各种关于 "炉石数据被删" 、 "mongoDB遭黑客勒索" 的事件刷屏。
16654 0
|
Oracle 关系型数据库 数据库
在ArcGIS中如何使用直连方式连接Oracle数据库
1.      背景 直连方式比使用SDE方式更加稳定,特别是在大数据量处理的应用中,不易出场由SDE连接进程造成的gsvr错误。
1457 0
|
6天前
|
存储 关系型数据库 MySQL
MySQL——数据库备份上传到阿里云OSS存储
MySQL——数据库备份上传到阿里云OSS存储
23 0
|
1天前
|
SQL 存储 关系型数据库
数据库-MySQL-01(一)
数据库-MySQL-01(一)
13 4
|
6天前
|
缓存 NoSQL Redis
一天五道Java面试题----第九天(简述MySQL中索引类型对数据库的性能的影响--------->缓存雪崩、缓存穿透、缓存击穿)
这篇文章是关于Java面试中可能会遇到的五个问题,包括MySQL索引类型及其对数据库性能的影响、Redis的RDB和AOF持久化机制、Redis的过期键删除策略、Redis的单线程模型为何高效,以及缓存雪崩、缓存穿透和缓存击穿的概念及其解决方案。
|
8天前
|
Oracle 关系型数据库 MySQL
Mysql和Oracle数据库死锁查看以及解决
【8月更文挑战第11天】本文介绍了解决MySQL与Oracle数据库死锁的方法。MySQL可通过`SHOW ENGINE INNODB STATUS`查看死锁详情,并自动回滚一个事务解除死锁;也可手动KILL事务。Oracle则通过查询V$LOCK与V$SESSION视图定位死锁,并用`ALTER SYSTEM KILL SESSION`命令终止相关会话。预防措施包括遵循ACID原则、优化索引及拆分大型事务。
|
1天前
|
SQL 存储 关系型数据库
数据库-MySQL-03
数据库-MySQL-03
7 0
|
1天前
|
SQL 数据库
数据库-MySQL-02(二)
数据库-MySQL-02(二)
4 0