还让业务操作记录影响接口性能?

一、前言

话说操作记录是每个业务系统必备组件!相信同在互联网打工的小伙伴肯定都在业务开发中记过操作记录吧!其实操作记录是一个比较简单的东西,涉及到修改的接口都要有,虽然简单,但也重要呀,平时感觉没什么用处,但是关键时候可能是一个重要的信息来源!

所以小伙伴们在开发中要重视记操作记录哦!

咱作为一名有工匠精神的攻城狮,细节这块那必须拿捏呀😎

虽说操作记录是必须的,耦合在我们的业务逻辑里面,但我们绝对不允许因操作记录而影响我们的接口性能。 都耦合在业务逻辑里面了,怎么不影响接口响应时间呢? 异步记录呀!!!

所以本文的重点就是带大家实现异步记操作记录,如果对操作记录不熟悉的小伙伴可以私信我。

二、思路

说到异步大家肯定就有思路了。接下来,先给大家上个图,大家第一反应可能是——这不就是MQ嘛。没错,这个思路跟MQ的实现有异曲同工之妙,可以说是基础版的MQ了。

虽说这个图一看的就懂思路了,但是看我画图这么辛苦的份上,听我掰扯掰扯文字版的思路哈哈,顺便给大家上一波实战代码😎

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
csharp复制代码/**
* 执行操作记录线程
*/
@Slf4j
public class OperationLogHandler implements Runnable{

// 操作存放队列++++++
private static ConcurrentLinkedQueue<OperationRecord> holderList = new ConcurrentLinkedQueue();

private OperationRecordService recordService = SpringBeanUtil.getBeanByClass(OperationRecordService.class);

@Override
public void run() {
for (;;){
Iterator<OperationRecord> iterator = holderList.iterator();
// 为空时 休眠
while (iterator.hasNext()){
OperationRecord record = iterator.next();
if (record == null) {
iterator.remove();
continue;
}
// 执行落库操作
boolean saveRet = recordService.save(record);
log.info("异步保存用户操作日志结果为:{}",saveRet);
iterator.remove();
}
}
}

/**
* 添加记录到队列(具体业务逻辑调用)
* @param operationRecords
*/
public static void addOpLogs(List<OperationRecord> operationRecords){
if (CollectionUtil.isEmpty(operationRecords)){
return;
}
boolean addRet = holderList.addAll(operationRecords);
log.info("添加操作日志到链表,结果:{}",addRet);
}
}

使用ConcurrentLinkedQueue这个线程安全的队列的原因是防止业务并发操作引发的线程安全问题,消费端因同时只有一个线程工作,所以没有线程安全问题。

接下去就是在服务启动的时候把线程启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
typescript复制代码@Component
public class SyncOperationLogListener implements ApplicationListener<ContextRefreshedEvent> {

@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
run();
}

public void run(){
// 使用线程池方式启动
ThreadPoolUtil.getThreadPoolExecutor()
.execute(new OperationLogHandler());
System.out.println("=== operationLog handler start success ===");
}
}

到这我们就把设计思路和实现说完啦,希望可以大家有所帮助。

三、总结

还是不得不强调操作记录的重要性,还有打日志,可帮助我们再关键的时候查问题,可以快速定位问题的位置。 虽说咱们写的代码,近看密密麻麻一片,站远了看,满屏幕只有两个字,自信!所以作为一名有工匠精神的攻城狮,细节这块那必须拿捏呀😎

加油打工人!奥利给😎

我是rose,感谢各位的观看,各位的点赞就是rose输出的最大动力,我们下篇文章见!

注:如果本篇博客有任何错误和建议,欢迎小伙伴们留言,如果对操作记录不熟悉的小伙伴欢迎私信我哦!

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%