JAVA接口机结构解析

什么是接口机

 在Java项目中,接口机通常指用于与外部系统进行数据交互的中间层,负责处理请求和响应的转换、协议适配、数据格式转换等任务。


接口机的结构

我们的接口机的结构分为两个大部分,外部接口机和内部接口机,在业务的调度上也是通过mq来实现的,只要的目的就是为了解耦合和做差异化。在接口机中主要的方法就是定时任务,消息的发送和消费,其他平台调用接口机只能提供外部接口机的方法进行调用,外部接口机可以提供消息的消费来调用内部接口机,内部接口机可以直接调用外部接口机。

JAVA接口机结构解析_第1张图片 接口机的作用

接口机的主要作用:

解耦合:对培训平台和管理系统做解耦合操作, 在旧的实现方案上,培训平台会直接调用管理系统的接口,需要等待管理系统返回数据后进行后续操作,并且还需要在培训平台处设置出现发送消息的定时任务,这就会导致耗时增加、耦合度高。在使用接口机后,培训平台只需要发送消息即可,我们关系是否完成推送操作,专注业务上的实现即可,接口机负责推送的业务,代码的耦合度就比较低。

统一错误日志和重新推送:在外部接口机中,调用实现统一的调用父类,在改父类中包含 参数合法性判断、参数转化、执行方法、返回结果处理等方法,在父类中执行这些方法都会被try/catch包裹,在出现错误日志时就会将这些数据存储到mongo的异常日志中,运行日志的记录。

网络异常和第三方异常可能会导致推送失败,此时我们会统一在接口中做重新推送,接口机中会有个定时任务会到主表中扫描同步状态为为推送和推送异常并且合格状态为合格的所有数据进行重新推送。

 作为网关:在培训平台调用通信模块时,会通过请求信息构造对应的需求参数并通过处理器装到管理系统当中。 


谈谈学分推送的流程,在这个流程中遇到了什么问题,你是怎么解决的? 

1.课程数据及年度数据的存储

在培训平台上,会对应一个一个的培训方案也就是班级,在班级中会包含多门课程,课程又分为公需课和专业课,在当前班级完成总合格后就会调用外部接口机的方法,将这些课程信息和年度信息存储到接口机中的班级度表和课程明细表。

当时在实现这个业务的时候遇到了一个问题,旧的外部接口机没有传课程属性的数据,我们传入课程信息的集合,在外部接口机做一个拍平的操作并循环调用旧的方法,并在外部接口机中判断学分是否合格修改合格状态。当时我是实现思路是这样的主要还是想要保持开闭原则。

难点

但是来发现行不通,这样实现会导致学分不足仍然推送的情况,我们的调用顺序是这样的,外部接口机会向内部接口机发送消息(消息中的数据就是课程数据及年度的数据),内部接口为了做差异化(会计项目学分推送有的是按年度整体推送有的是分批推送)会再发送消息到内部接口机,此课程都是也消息消费的形式,所以在外部接口机我们只能判断消息是否发出却不知道是否被成功消费,消费失败外部接口机还是会修改合格状态,最终就导致异常的发生。最终我们就将课程数据提供消息传入到最底层的方法中,在方法中做统一的合格判断及合格状态的修改。

2.学分的推送

在内部接口中,会有个定时任务,每隔五分钟到年度表中查询同步状态为未同步及同步失败且合格状态为合格的所有数据进行重新推送,遍历这些数据,因为会有不同的会计平台,每一个平台会对应一个ppc_id来做差异化,通过ppc_id分配到不同的差异化方法中,执行参数合法性判断、参数转化、执行方法、返回结果处理等方法,最终完成学分推送。

难点
有一次排查到公司框架的bug,我在做现网排查,运营反馈有一个学员在完成学习后在管理系统中查询不到自己改班级的学分。刚开始到mysql中查询学员的推送数据的同步状态为异常,异常信息为dubbo调用第三方失败,到华为云日志中发现接口机中的定时任务执行到该方法确实卡住了,重新推送还是一样卡住。到mongo查看日志发现没有执行日志,之前没有这种问题,当时还是比较疑惑的,然后就尝试手动使用数据调用管理系统的接口,发现返回很长的异常数据,问题定位到了,就是异常栈信息太大了,插入mongo超过了最大限度,最终导致报错。(直接卡住了,异常数据插入卡住了),解决方案也是比较简单的,在框架方法中获取到异常栈前,截取前250的字符做插入。(这也算是我的一个排查流程)

还学习到架构的设计。

你可能感兴趣的:(SpringBoot,八股文,Java,java,学习)