从一次数据交换中转实现开始的漫谈(一)

244 阅读2分钟

一、业务背景

      在一个大型集团性质的公司,因为历史原因,各个分公司与第三方公司有各自的数据交换平台,并且已经运行较为稳定。现在因为总部对于数据集中管理的需要,上线了一个统一的数据交换系统。因为分公司 A 的数据交换平台的报文格式与总公司最新的数据交换系统的报文格式不一致,在时间及时、安全稳定和成本合适的要求下,分公司 A 决定做一个数据中转转换平台。有点像一个适配器。

二、业务描述

      需要与第三方交换的数据量较大,对数据交换的实时性没有要求,可以重复传送;但是存在定时传送的需要。要求架构简单,方便后期维护。

三、业务分析

      针对业务的情况,抽象出涉及到的技术要点:

  • 定时传送 -- 》 定时任务 --》定时任务实现方式的选择
  • 数据量大 -- 》 多线程解决 --》多线程怎么解决数据分组 --》引入消息中间件 --》要求架构简单,后期方便维护 --》redis --》 生产者消费者模式

四、系统架构

image.png

五、简单介绍实现方案

      基于上面的分析,大概实现方案是:

  • 引入redis 作为消息服务器使用,根据生产者消费者模式,生产者将业务主键作为value 值传入消息队列;消费者从队列中获取 业务主键进行消费;redis 是单线程、高可用的,这就保证了 在消费者启动多线程的情况下,很小概率下出现死锁现象(在实现中也出现了)。
  • 因为不同的业务类型对于定时周期要求不一样,所以设计根据数据库表中的配置来动态执行定时任务,这一块使用了 Spring 3.0之后自带的 TaskScheduler

数据的etl 我没有参与,对这块不太了解。因为数据库是 oracle,大概使用的 ogg 方式。 后期会根据上述的实现方案,展开说下具体的情况和个人想法。