每天进步一点点!
前段时间一个项目需要做数据同步,考虑到数据同步功能在很多地方都会涉及到,所以将功能提炼出来,做成统一的组件,供公司所有的项目使用,在此将实现方案记录下来,希望对其他人有用。
背景:
背景是这样的,互联网公司,做社区O2O产品的,目前需要做一套停车收费系统以及道闸控制系统,我们的产品中心数据肯定放在云端,处理缴费充值等业务;但停车收费系统在部署到物业公司小区,这就涉及到需要将云端的数据同步到局域网的服务器,同时也会涉及到局域网产生的数据同步到云端;而且局域网有可能是联网的,也可能是未联网的。
术语:
生产者:通常只有一个,我这里指云端的系统
消费者:N个,我这里指局域网端系统
用到的技术:
Hangfire、Mongodb、Signalr。
Hangfire,处理生产者或者消费者同步数据任务调度,主要是保证同步任务队列处理、错误重试、同步任务持久化(先持久化任务,再执行任务,执行成功后再删除任务)
Mongodb,这里其他没有用到Mongodb的什么技术,只是做为Hangfire处理任务的存储介质
Signalr,负责建立生产者与消费者之前的连接管理,注意需要处理断开重连。
具体解决方案:
架构涉及图:
同步数据任务实体设计
方案核心地方说明:
同步数据可能是数据库数据或者图片等,用不同类型来区分,不同的类型处理方式不一致,如果是同步数据库数据,这里是一条完整的Sql命令,Key需要保证唯一,并携带同步需要的一些数据。
注意架构图中几个标有“组件Dll”的地方,这是独立于其他系统的Dll,生产者或者消费者只需要引用。
同步数据可能在线,也可能离线,同步数据的时候,默认两种方式都支持,但允许调用方自己做决定,离线同步时,需要用导入数据组件手动导入。
Hangfire处理同步任务调度,具体技术请参考官网,反正意思是能够保证同步任务被执行,并提供面板监控同步任务执行情况。Hangfire任务存储生产者端采用Mongodb(Redis更好,但要收费,只能用Mongodb了),消费者端一般就直接用Sql了。
通信服务生产者(组件Dll),主要用Signalr建立同步数据服务,当然,你也可以自己建立通信服务;同时,生产者同步数据错误或者消费者同步数据出错,都由此服务进行存储,出错的时候,调用短信或者邮件通知管理员。出错文件存储目录结构如下:生产者->分组->消费者Key->日期->小时,消费者->分组->消费者Key->日期->小时。
注意有个分组的概念,熟悉Signalr的应该都知道,这里一般配置一条数据同步给哪些具体的消费者,那把这些消费者都加入到你设定的一个组。
消费者很有可能需要接受多个生产者,那么,需要注册到多个生产者服务,这里的Signalr注册服务可能就是一有List。
同步数据任务到达消费都或者生产者后,需要通知接收方,一般公开一个事件,让接收方监听,监听到之后,处理业务数据(执行Sql语句,将数据写入数据库也可以封装为一个组件)
注意,Signalr和Hangfire都需要用到Owin,需要加到一个注册启动项中。
主要提供同步数据的解决方案思路,这里代码就不贴出来了,有问题欢迎咨询。