银行中间业务系统流水号的生成

银行中间业务系统流水号的生成

我最初接触银行系统是中间业务系统,其实关于中间业务系统感觉没有明确的定义,很多银行的叫法也不一样,有叫渠道系统的,有叫大前置的,也有统称为外围系统(相对于核心系统)。

系统介绍

早期的银行软件系统很多都是国外的系统,随着国产系统的崛起,国外系统慢慢的被替换掉。我进入这行开始接触的就属于早期的国产业务系统。使用C编写的框架,框架层封装了很多通用的东西,如数据库连接、socket通讯、全局流水号、流程调度等。因为银行这块对系统的稳定系要求很高,从业者水平参差不齐,或者编程无可避免的会出现bug,所以从事这行的除了研发人员,其他基本都是业务猿,使用公司封装好的系统架构,按约定编写业务代码,局限了编程的灵活性,保证了稳定性。其实这也是这行的悲哀之处,这行的绝大多数程序员技术能力很差,就像大家说的只会crud。说的有点多,今天我就要说下流水号的发展(可能仅仅是我所经历的)。

流水号对于一个系统来说至关重要,不仅仅是本系统业务交易的唯一性标志,也是其他系统交互的唯一性标志,其实很多老系统是当日日期+流水才能体现唯一性,因为流水每日重置。现在的新系统设计流水好像能确定唯一了,因为我也是业务猿,这个行业的新系统架构设计了解不是很多。

共享内存方式

我接触的第一个框架是从共享内存里面取的流水号,框架是通过c语言实现的,具体编程就不说了,感兴趣的 可以去了解下c的共享内存编程。这种取方式基本被淘汰了,c语言实现的框架基本也在慢慢被淘汰,毕竟一个框架用了至少十几年了,虽然还有很多行在使用,但已经不适应发展了。java实现的框架慢慢的开始占统治地位。并不是c语言不行,在同等代码质量的情况下,c语言肯定是比java快的。毕竟java还需要在c++实现的jvm上运行。c直接在操作系统上就能跑。随着业务的复杂性增加,就开发层面来说,用java比c更加高效,这是c比不过的。现在机器的发展进步,java的运行已经不是性能瓶颈。

数据库序列方式

银行数据库基本使用的db2和oracle。所以从数据库序列中取流水成为主流模式。在高并发场景下从数据库中取序列也有性能瓶颈。我所接触的银行都是城商行,业务量有限,使用这种方式基本都能满足使用。如果业务量大并发高,那么进一步的处理方式是建立多个序列,每个序列占用一个流水区间,比如第一个序列使用“1到1000000”的流水号,第二个序列使用“1000001到2000000”的流水号,高并发的业务单独使用一个序列,低并发的使用共同使用一个序列(银行中间业务系统包含大量业务系统,如代缴费、国库、非税等等)。

redis流水

在银行软件行业,有没有从redis里面取流水的我不确定,毕竟我经历的比较少。但是这个是可行的,在互联网行业是有的。我根据银行的流水特性也实现了一个取流水号的方法。原理就是redis的“INCR key”,INCR是原子的,每次访问都会将key的值加一,如果键 key 不存在, 那么它的值会先被初始化为 0 , 然后再执行 INCR 命令。那么我们就可以把日期当做key,如T日是20200710,那么命令“INCR 20200710”。使用redis流水方式有没有数据库序列方式快,我没有测试。感兴趣的可以试下。示例代码是我写的一个框架的代码片段,redis流水方式大致就这个原理。

    public Long getIncr(String key) {
        RedisAtomicLong entityIdCounter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
        Long increment = entityIdCounter.incrementAndGet();
        /*
        if ((null == increment || increment.longValue() == 1)) {// 初始设置过期时间
            System.out.println("设置过期时间为1天!");
            entityIdCounter.expire(1, TimeUnit.DAYS);// 单位天
        }*/
        return increment;
    }
    public void commHandler(){
        Date date = new Date();
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
        String dt = format.format(date);
        Long ls = redisCache.getIncr("ihbs-" + dt);
        log.debug("获取流水[{}]",ls);
        String value = String.format("%s%08d",dt,ls);
        BusUtil.setValue("ihbs_date",dt);
        BusUtil.setValue("ihbs_serial",value);
    }
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值