Credit故事之CAFIS改造 ^^^^^^^^^^^^^^^^^^^^^ - 作者:臭豆腐[trydofor.com] - 日期:2009-05-12 - 授权:署名-非商业-保持一致 1.0 协议 - 声明:拷贝、分发、呈现和表演本作品,请保留以上全部信息。 0. 文档目录 ^^^^^^^^^^ [[<=$INDEX]] 1. CAFIS为何物 ^^^^^^^^^^^^^^ CAFIS -- Card And Finance Information System http://www.cafis.jp NTTデータのCAFISは、カード取引をスポーディーに処理する、 日本で最大のカード決済総合サービスです。 Cafis是Credit的一个子系统,相关代码量30000行,20多人月的样子. 2005-03-14 设计开发,2005-10-11 在线测试,2005-10-18 正式运营. Livedoor事件之前,有3家合作银行,最高年交易次数为103943次. IVR(Interactive Voice Response),即互动式语音应答,是Cafis的衍生子系统. 同一套业务逻辑,相似的接口,提供和ATM提款机一致电话服务. 此外,Cafis还有一些辅助子系统,比如制作卡和卡密码及卡管理功能. Cafis子系统,基于Socket,解析byte电文,使用Thread. 提供7*24不间断在线服务,是Credit项目中最早,最完整,最稳定的Socket的服务程序. 为后续的项目,提供了坚实的框架和丰富经验. 2. 彪悍的程序 ^^^^^^^^^^^^^ "彪悍的程序不需要测试",是Cafis开发中扯蛋时,篡改老罗而广为流传的一句话. 沾Cafis的光,当年年会,老徐用这句话介绍我.三年后某日,同事用这句话想起我. 2005年初,正是livedoor蒸蒸日上,大家生龙活虎加班都不知道累的时候. 这个大的背景下,Cafis受到了极高的关注和投入,各个环节都非常到位. Cafis之所谓强悍,主要是, 1. 程序层次结构清晰明确. 2. 异常检查和处理丰富,前置后置校验多. 3. 测试程序完备,自成一体. ========================== txt Cafis工作示意图 ========================== .__CAFIS__ _____________Cafis-System_____________ __DB-Server__ | | | | | | | | | Session-Manager | Business-Manager | | | |Non-Stop | | --------------- | ----------------- | | DB2 | | Server | | Thread-Request | Thread-Processor | | | | | | Thread-Response | Thread-Monitor | | | |_________| |______________________________________| |_____________| ========================================================================= 首先CAFIS网关,提供了一个NonStop-Server(NSS),提供7*24的服务器. Cafis程序,主动连接NSS的指定端口,并保持链接. Thread-Request,把来至NSS的请求电文解析,并放入Thread-Processor队列. Thread-Processor,处理业务,并把处理结构放入给Thread-Response队列. Thread-Response,组装结果电文,发送给NSS. Thread-Monitor,监控Cafis-System的内部状态和发送警报. 然后,Cafis-System所在的服务器,有另外一套监控脚本,以防止Thread-Monitor失效. 2006年以来,除了增加IVR功能,Cafis一直没有进行过修改,就这样7*24的跑了3年多. 3. 夜幕下的黑手 ^^^^^^^^^^^^^^^ 世事多变幻,Credit业务在经济危机的背景下,迅速吞掉了其他竞争对手. 包括之前Livedoor事件时,以以和Livedoor为荣的几家合作公司. 业务发展导致的开发压力,就行放了酵母的面团一样,膨胀了数倍. Cafis这片净土亦难逃一改. 2009-05-04,阿水提出,Cafis以版本所在服务器进行分流. ========================== txt Cafis改造方案 ================================= 1. 修改Cafis-System,使之可以链接多个DB2,需要修改现有框架和底层公共代码. .__CAFIS__ _____________Cafis-System_____________ __DB-Server__ | | | | | | | | | Session-Manager | Business-Manager | | DB2-1 | |Non-Stop | | --------------- | ----------------- | |_____________| | Server | | Thread-Request | Thread-Processor | | | | | | Thread-Response | Thread-Monitor | | DB2-n | |_________| |______________________________________| |_____________| 2. 在Non-Stop-Server和Cafis-System间增加包转发代理,不修改现有代码. .__CAFIS__ __Agent__ _____________Cafis-System-1___________ _DB-Server_ | | | | | | | | | | | Thread | | Session-Manager | Business-Manager | | | | | | -Req | | --------------- | ----------------- | | DB2 | | | | | | Thread-Request | Thread-Processor | | | | | | Thread | | Thread-Response | Thread-Monitor | | | |Non-Stop | | -Dst | |______________________________________| |___________| | Server | | | _____________Cafis-System-2___________ _DB-Server_ | | | Thread | | | | | | | | -Res | | Session-Manager | Business-Manager | | | | | | | | --------------- | ----------------- | | DB2 | | | | Thread | | Thread-Request | Thread-Processor | | | | | | -Mnn | | Thread-Response | Thread-Monitor | | | |_________| |_________| |______________________________________| |___________| ============================================================================== 选择了方案2,原因是安全. 于是构造了这样一个代理,把NSS的包解析后分发到正确的版本. 待各版本有返回结果时,把结果以原Session返回给NSS. 透明代理,NSS和Cafis-System完全不知道有这么一层存在而已. 2009-05-27是发布日,必然通宵,但却没有压力,也没心思干活. 原因可能老头比较清楚吧,O(∩_∩)O 哈哈~. 18:00到21:00,耗时3个小时,写了15个类,1129行代码,完成了这个Agent. 可以基于Rule自定义分发规则,测试了几遍,和预期的一样. 完全不知该如何对这3小时的行为做结论和评价. 视乎很牛B,但却有说不出的失落. Agent的创造,就是一只通过我伸向Cafis的的黑手.