公司数据同步程序的设计思路

先讲一下背景:

我最近一直负责部门间的一些数据同步,这些数据是从同公司的其他部门同步来的。对接部门是内网系统,我的部门是云上系统。

目的就是要给内网的系统做一些上云的系统,要使其联动起来。

 

我们平台是一个互联网系统服务器。对接部门是一个内网服务器。

如果我们之间想同步数据的话,需要在内网的一个网关后的可访问外网的机器上来部署一个同步程序。

这个同步程序的工作就是从对接部门的内网数据库拉取数据,然后调用我们互联网服务器的插入数据的接口。

 

由对接部门的人负责在内网数据库提供配置好的视图,然后我的同步程序来拉取数据。

这里我最先的想法是尽量保持同步程序的单纯,因为同步程序的配置和部署都比较麻烦,毕竟服务器是放在内网网关后的,每次远程都要申请,要费不少时间。

 

对于我们互联网上不同的 SaaS 租户来讲,一个租户即为一个公司用户。

内网一个系统是全部的数据,但云上的是对应 N 个租户,那么这就要求我同步的数据在云上要是多份。

按照一个租户编号来区分。然后是需要对应不同的环境有不同的调用域名。

 

所以第一版的配置文件是如下几项:

 

推送数据一地址

推送数据二地址

对外开放接口认证地址

获取对外开放接口认证密钥  ID

获取对外开放接口认证密钥  密钥

租户Code,英文逗号分割支持多个

查询的数据一视图名

查询的数据二视图名

使用的数据库链接配置键名称

 

基本满足最初需求,但是对应的有一些问题,很多的东西还是硬编码在代码里了。

以下是目前无法满足的问题:

  1. 对视图数据的二次过滤。不同的租户需要不同过滤条件的数据。
  2. 对不同环境域名的调用,不同环境的租户编号也不一样。

 

现在打算设计出较通用的配置,来解决掉这些问题。

最初的想法针对每一个租户编号有一组相应的配置。

所以是针对每一个租户编号 ,有一套相对应的配置,对于其中一些基本相同的属性,做成基本的默认配置。

 

问题1的解决方案是使不同的租户编号使用可配置的SQL语句,则可以进行不同的过滤和不同的查询。

这一步其实也可以放在云服务器上过滤做,但部署在同步程序上 性能来说更好一些,多余的数据不必经过网络传输。坏处是数据需求变更时需要远程修改配置。

问题2则是将不同环境的地址写死在代码中,然后使用不同的环境标识配置项。

 

修改后的配置文件如下:

 

这打码的功力我都佩服我自己。

关于读取的代码:

建完 json 的配置文件之后要记得将文件属性的 复制到输出目录 设置为 复制。不然在编译目录是找不到该文件的。

这里使用 Newtonsoft.Json 的 JObject 来读取和解析,非常的方便。

将配置项读入之后,每一个配置使用一个同步类实例来运行。

某个同步如果因为请求/数据/配置出现了异常,不会影响到下一个同步类实例的运行。异常信息会被输出到控制台和日志。

 

其实还有进一步可配置的空间,这个框架无法解决要求增加同步数据表的需求

现在只是同步两个 SQL 查询的数据,以后或许会增加到三个四个,那么就应支持可以配置多个SQL的任务,即一次查询对应一次推送。

想要实现这个可以在每个租户编号下面再做一个数组来配置。

代码中可以使用 Npoco 的 Fetch<dynamic> 或自己实现一个动态类型的构建来进行动态查询数据,无需建出对应实体类。

然后将数据转换为 Json 字符串,以二进制写进请求流直接发送请求即可。

posted @ 2019-12-13 14:21  Aaxuan  阅读(794)  评论(0)    收藏  举报