数据的远近
其实,是没有“数据的原近”这个概念的,只是最近反复提到这个词,便想记录一下关于这个的一些想法。
数据的远近
在web开发中,常会用到数据库等工具。而那些web服务呢,其实就是调底层数据库的资源,来达到存储、计算或统计的需求。按照一般的web开发而言,关于数据在哪处理,可以有很多种方式,但总得来说,也就这几种,底层的数据库计算,后端服务的计算,前端的计算(当然,前端计算也分好多种情况)。按数据计算的难易程度,恰好跟距离数据源的远近有关系,越近越好计算。比如,简单得统计,一般sql能完成的,都会直接用sql来完成,没有人会傻到在后端服务里面去实现。而这也正好是数据库的拿手好戏,非常的easy,一段sql即可完成,甚至非常复杂的统计计算。如果将这统计的活放到后端服务,那么,后端服务,需要先拿到需要的部分数据,然后呢,在各种过程化的编程代码中,完成了统计。如果,将这些数据,放到前端计算,那就更麻烦呢。不是不能做,是做起来费力不讨好。前端来计算,大概的流程是,发送请求给后端,后端呢,再从数据库中取到数据
数据库
随着工作的深入,我才慢慢转变了数据库只是存储数据的工具的思维,它不但能储存数据,还能加工数据,完成各种复杂的统计、计算任务。所以,数据库不仅仅只有存储能力,还有强大的计算能力。
前端时间,进行了一次取数任务,慢慢的了解了一下复杂的sql如何写的,然后我非常惊讶的发现,用数据库能完成,数据按各种复杂的条件进行去重,在order by,join on,case when字段都能做。然后按着两种策略取数据。完全颠覆了,我对sql能做哪些事的认知。
其实,退一步讲,如果这么庞大的数据交给后端语言来处理,那任务量非常的巨大,扫描大量的数据,再将这些数据交给后端。
后端
一般来说,能直接连上数据库,基本上等同于与数据库0距离。让数据库完成的一些计算,也是有这些直连的后端发号施令的。有的时候,可能数据库直接计算不方便,故,直接从数据库中将原始或稍微加工的数据拿过来,然后由后端来进行处理,这个时候,就不能称为0距离的。
前端
前端也有很强大的计算能力,主要是,它能利用上客户端的计算资源,不耗费服务器的资源。对于一些,既要原始数据,又要对数据进行一些简单的处理,这个时候,用前端来处理就很恰当,但是,如果涉及到多个数据源的关联等,那这个时候,因为距离比较远,又要拿到各种数据后,再加工,实际上加工后,用到的数据,又只是很少一部分。
吐槽
其实,其实这个才是写本文的初衷。有这样的一种数据同步任务,我们有一个完整的web管理后台,但是呢,领导,非要先提供所有数据表的api,然后呢,用open的yaml文件,生成客户端,再写shell来调用这些客户端,最后,对数据进行对比检查之后,再通过shell生成另外一个shell,生成的shell再调用客户端,再通过接口,将数据同步过去。
上面的方法,不是说不做,能做,但是,不是最好的方案。如果是我在做类似的需求,我可能直接让后端直接完成对比、更新操作,整体暴露出一个接口。
调用的链路越多,越容易出错。而且,既然是调接口,肯定会出现,接口调用失败的情况,但是呢,又没有生成日志,更没有对日志进行处理,尝试再次导入,整体来说,链路太长,容易出错,出错,又不好对失败的数据重复导入。如果想100%完美,编写代码的难度又很大。
从上面的场景,我便想吐槽它。