1,介绍:
我叫xxx,广州花都区,现居花都区,本科学历,应聘的岗位是java开发岗,我的一年经验是在大三暑假的时候就开始在上家公司实习,然后大四上学期课程结束后继续实习至今年的4月底(离职原因:因为公司的营收原因,无法给我一个良好的发展平台,并且,带我入门的老大也离职了;为了寻求更好的发展,我选择找一个更好的平台)那么在上家公司我参与过的项目有两个,一个是有关企业销售数据的管理系统,一个是叫iweekly的移动端新闻资讯类的app;
我就说说我印象比较新的那个吧,就是那个叫iweekly的资讯类app。这个app是一个集国际新闻,时尚及各种有关生活方方面面为一体的资讯应用;该项目的主要框架用到了springcloud这样的一个分布式架构。这个项目的结构主要分为了面向用户(读者)的客户端,面向作者,媒体的创作中心以及面向甲方的后台管理端;我主要参与的业务在客户端和创作中心这两块,其中有一个需求我的印象很深刻,就是文章自动审核的功能,在这个需求之前呢,项目的文章发布前都是靠人力进行审核,速度慢,经过一些客户的反馈就打算变成人工加自动审核的这种模式;最终呢,自动审核的技术选型就选择了阿里云提供的内容安全审核服务。那下面就讲讲如何实现,首先呢,利用公司的账号去阿里云官网开通该服务,我根据阿里云的技术文档了解到, 导入依赖后,再参考阿里云提供的两个工具类分别对图片和文字的上传和审核处理就能获取审核结果。在此之前呢,我需要做的是,要将需要审核的文章的内容和封面抽取出来才能进行下一步。那么在获取内容之前呢,先要从ThreadLocal中获取当前登录用户的id,因为在文章表中要设置文章对应的用户id信息,进行用户信息的绑定。因为获取与上传图片会占用较多的带宽,所以为了保证审核速度的问题,我们将审核分为3个步骤,首先对文本进行一个抽取进行上传审核,只有在审核通过以后再抽取图片进行上传审核,在所有内容完全通过审核后修改状态发布到首页,不通过则退回让作者重新修改,那么如何告诉作者要去修改呢? 在审核不通过的时候会利用消息队列kafka来发送一条消息,这条消息内容包括用户的id和文章的id,然后创建一个监听类接收消息调用对应的消费逻辑将通知信息放到消息表中,并且要设置消息状态为0,也就是未读,这样子在前端那里有个显示消息的消息栏,就能提醒作者要对哪篇文章进行修改;审核通过也是同理,告诉作者哪一篇文章审核成功已发布之类的话。这里有个注意点就是,有很多文章会出现多张一样的图片,如果说,多次下载并上传相同的图片,就导致了无谓的带宽被占用,会多少对性能有一定的影响;而我们用于图片的存储服务是阿里云的OSS,获取图片只需要获取对应的url即可,所以同样的图片,url也是不变的,那将获取的url封装到一个List集合中,使用distinct()方法就能对集合的元素进行去重;完成以上那些操作就基本能实现自动审核。在后续,我们发现阿里云提供的自动审核并不能对文本的某些敏感词进行过滤。因此呢,我们需要维护属于自己的一套敏感词;那么这里我们选用了DFA穷自动机算法来封装所需要的敏感词,然后将抽取出来的文本与我们生成的词库进行检索,如果不通过则直接退回修改,通过后再调用阿里云审核服务进行二次审核;DFA算法的结构其实就是多层map封装了多个字,比如说:毒品是敏感词的话,那第一层map封装了毒字,与状态0,这个状态是表示该个词是否为最后一个,如果是则表示该词为敏感词,那第二层map就封装了品字与状态1,因为获取到了1,则证明该词是敏感词。
上述的功能做完后,又发现一个问题,在测试的时候,测试那边和我说,如果用户进行审核的提交,没有开启异步任务的话,会导致客户会在那个界面一直等待直到审核完成,因此,在后续我又在审核模块的方法上面开启了SpringBoot自带的异步任务的功能,就是在启动类上加上@EnableAsync注解,再创建一个配置类来设置线程池的参数并添加@Configuration注解加入到Spring容器,最后在审核模块方法上加上@Async注解就行了;这样就能在客户提交审核后无需等待也能正常访问其他页面;
其次呢,还有一些需求就是对用户行为相关的一些管理,比如,点赞,收藏,关注等行为,这些无非就是在ThreadLocal中获取用户的id找到对应的数据表,将点赞,收藏的文章以及关注的作者的id存进去;
其他的亮点:静态页面的生成与存储;与非静态页面的数据动态显示,如:点赞等用户行为的统计,利用Kafka的流处理;
线程池是用到了Spring官方对ThreadPoolExecutor二次封装的ThreadPoolTaskExecutor; 用到的拒绝策略是CallerRunsPolicy
拒绝策略:ACDD
- AbortPolicy:默认拒绝策略,拒绝任务并抛出异常。
- CallerRunsPolicy:当任务添加到线程池中被拒绝时,会在线程池当前正在运行的Thread线程池中处理被拒绝的任务。(运行多余的任务)常用
- DiscardPolicy:拒绝任务,会抛弃被拒绝的任务,不会抛出错误。
- DiscardOldestPolicy:当任务添加到线程池中被拒绝时,线程池会放弃等待队列中最旧的未处理任务,然后将被拒绝的任务添加到等待队列中。
