博主目前在金融项目开发与维护的路上深耕了快两个年头了。刚入这个行业的时候非常惶恐。一是因为自己以前只在游戏与电商公司工作没有金融类的经验;二是因为公司的用户规模目前在中国算中等规模。资金体量在百亿级别,用户规模在百万以上。如今,两年过去了。自己也掌握了一些开发技巧。今天就跟大家一起分享这些经验。受限于本人眼界,文中肯定有不足之处,请大家指正!
我还记得两年前入职现在的公司,人事总监问我了一个问题:金融项目与电商项目开发有什么区别?
主下之意就是我没有金融类的开发经验,是否能胜任当前的开发工作。当时从主观上回答了人事总监的问题。但是,真正涉及到技术层面的东西我也没说,毕竟说了人事总监也不懂。其次,我自己当时也并不能道出其中的关键。
一、金额精度问题
在金融行业,每个算法以及金额与收益的小数点到多少位都必须是明确且恒定的。因为,金融办对这一块的管控还是比较严厉的。所以,我们在写项目的时候一定确定好精度的问题。
做过支付宝的朋友应该知道,它们在支持的时候是将金额的最小值 1 分以 1 传递的。即 0.01 元不以浮点型传递,而是以整型传递。这样有一个好处,在 MySQL 等数据库存储的时候,就不需要使用浮点类型。取出来展示的时候,除以 100 即可还原。这样在不同语言之间转换起来方便,也避免了不同系统在处理精度问题上出现 BUG,导致精度异常。
因为,我们的系统采用的是 PHP & Java 来编写业务。所以,这里我给出 PHP 在处理精度时会用到的函数。
PHP 处理精度相关的函数是由 BCMath 扩展提供。
bcadd — 2个任意精度数字的加法计算
bccomp — 比较两个任意精度的数字
bcdiv — 2个任意精度的数字除法计算
bcmod — 对一个任意精度数字取模
bcmul — 2个任意精度数字乘法计算
bcpow — 任意精度数字的乘方
bcpowmod — Raise an arbitrary precision number to another, reduced by a specified modulus
bcscale — 设置所有bc数学函数的默认小数点保留位数
bcsqrt — 任意精度数字的二次方根
bcsub — 2个任意精度数字的减法
BCMath 扩展也就提供这么几个函数。但是,功能极其强大且实用。大家在金融类项目开发的时候,一定要使用它们。
二、时差与收益计算问题
时差指的是每天凌晨整点左右的时间段问题。
大家试想一下这样的场景:用户在当天 23:59:59 分投资了一笔定期。但是,由于系统处理的时候导致变成了第二天的 00:00:01。因为,我们的收益是第二天凌晨三十分开始计算前一天投资的资产收益。这就导致用户很生气。于是,在我们的系统当中就很暴力地直接设置成 23:30:00 到第二天 00:30:00 之间的时段不允许投资了。
当然,这种做法实在过于暴力。也许有更好的方式。但是,为了承上启下,不对旧项目有过大的重构,于是一直保留了这样的做法。反正这个点投资的用户很少。我们能做的就是尽量压缩这个让用户等待的时间。比如,现在是让用户一个小时不能投资,我们可以调整为 1 分钟。
三、日志记录要细致
金融项目最怕的就是出了问题找不到根源。所以,任何日志都要记录下来,并且要存储很长一段时间。比如:API 接口请求日志、各种业务错误日志、数据库等第三方接口调用错误日志等。当一个系统出现故障,我们能第一时间根据错误的信息排查问题。避免更大的问题出现。所以,在开发金融项目的时候,不要觉得日志太多让系统变慢还让自己编写业务代码成本上升。
开源日志系统比较出名的是 ELK(Elasticsearch , Logstash, Kibana)。阿里云也有相应的日志服务。结合报警系统,就能主动监控系统的健康状况。
四、定期更新服务器软件
定期更新服务器软件并不是说只要软件有更新就更新。而是指软件有漏洞要及时修复更新。比如:nginx、php 等。
五、数据库权限划分要严谨
通常金融项目是由多个子项目构成。每个子项目可以由不同的语言实现。所以,我们最好的办法是给每个项目一个数据库账号。并且,根据需要对不同的账号读取权限进行严格限制。避免出现越权的情况。
这样的好处除了越权的问题。还有一个问题就是当一个项目的 SQL 编写不够高效时,我们可以通过账号确定是哪个子项目当中出现的问题。从而帮助我们完善整个业务系统。
目前这五点是博主寒冰在从事金融项目开发两年中的总结。受限于个人知识面,难免会有不正之处。若你发生了请告诉我。谢谢!
网友评论