java高并发解决方案面试,Spring Boot (1),javasql优化面试题

  • 延迟队列,为Redis延迟队列。实现消息传递

  • Job pool 任务池保存job元信息。根据文章描述使用K/V的数据结构,key为ID,value为job

  • Delay Bucket 用来保存业务的延迟任务。文章中描述使用轮询方式放入某一个Bucket可以知道其并没有使用topic来区分,个人这里默认使用顺序插入

  • Timer 时间组件,负责扫描各个Bucket。根据文章描述存在多个Timer,但是同一个Timer同一时间只能扫描一个Bucket

  • Ready Queue 负责存放需要被完成的任务,但是根据描述根据Topic的不同存在多个Ready Queue。

其中Timer负责轮询,Job pool、Delay Bucket、Ready Queue都是不同职责的集合。

任务状态


  • ready:可执行状态,

  • delay:不可执行状态,等待时钟周期。

  • reserved:已被消费者读取,但没有完成消费。

  • deleted:已被消费完成或者已被删除。

对外提供的接口


额外的内容


  1. 首先根据状态状态描述,finish和delete操作都是将任务设置成deleted状态。

  2. 根据文章描述的操作,在执行finish或者delete的操作的时候任务已经从元数据中移除,此时deleted状态可能只存在极短时间,所以实际实现中就直接删除了。

  3. 文章中并没有说明响应超时后如何处理,所以个人现在将其重新投入了待处理队列。

  4. 文章中因为使用了集群,所以使用redis的setnx锁来保证多个时间循环处理多个桶的时候不会出现重复循环。这里因为是简单的实现,所以就很简单的每个桶设置一个时间队列处理。也是为了方便简单处理。关于分布式锁可以看我之前的文章里面有描述。

实现

现在我们根据设计内容完成设计。这一块设计我们分四步完成

任务及相关对象

目前需要两个对象,一个是任务对象(job)一个负责保存任务引用的对象(delay job),Spring Boot 基础就不介绍了,推荐下这个实战教程: https://github.com/javastacks/spring-boot-best-practice

任务对象

@Data

@AllArgsConstructor

@NoArgsConstructor

public class Job implements Serializable {

/**

  • 延迟任务的唯一标识,用于检索任务

*/

@JsonSerialize(using = ToStringSerializer.class)

private Long id;

/**

  • 任务类型(具体业务类型)

*/

private String topic;

/**

  • 任务的延迟时间

*/

private long delayTime;

/**

  • 任务的执行超时时间

*/

private long ttrTime;

/**

  • 任务具体的消息内容,用于处理具体业务逻辑用

*/

private String message;

/**

  • 重试次数

*/

private int retryCount;

/**

  • 任务状态

*/

private JobStatus status;

}

任务引用对象

@Data

@AllArgsConstructor

public class DelayJob implements Serializable {

/**

  • 延迟任务的唯一标识

*/

private long jodId;

/**

  • 任务的执行时间

*/

private long delayDate;

/**

  • 任务类型(具体业务类型)

*/

private String topic;

public DelayJob(Job job) {

this.jodId = job.getId();

this.delayDate = System.currentTimeMillis() + job.getDelayTime();

this.topic = job.getTopic();

}

public DelayJob(Object value, Double score) {

this.jodId = Long.parseLong(String.valueOf(value));

this.delayDate = System.currentTimeMillis() + score.longValue();

}

}

容器

目前我们需要完成三个容器的创建,Job任务池、延迟任务容器、待完成任务容器

job任务池,为普通的K/V结构,提供基础的操作

@Component

@Slf4j

public class JobPool {

@Autowired

private RedisTemplate redisTemplate;

private String NAME = “job.pool”;

private BoundHashOperations getPool () {

BoundHashOperations ops = redisTemplate.boundHashOps(NAME);

return ops;

}

/**

  • 添加任务

  • @param job

*/

public void addJob (Job job) {

log.info(“任务池添加任务:{}”, JSON.toJSONString(job));

getPool().put(job.getId(),job);

return ;

}

/**

  • 获得任务

  • @param jobId

  • @return

*/

public Job getJob(Long jobId) {

Object o = getPool().get(jobId);

if (o instanceof Job) {

return (Job) o;

}

return null;

}

/**

  • 移除任务

  • @param jobId

*/

public void removeDelayJob (Long jobId) {

log.info(“任务池移除任务:{}”,jobId);

// 移除任务

getPool().delete(jobId);

}

}

延迟任务,使用可排序的ZSet保存数据,提供取出最小值等操作

@Slf4j

@Component

public class DelayBucket {

@Autowired

private RedisTemplate redisTemplate;

private static AtomicInteger index = new AtomicInteger(0);

@Value(“${thread.size}”)

private int bucketsSize;

private List bucketNames = new ArrayList <>();

@Bean

public List createBuckets() {

for (int i = 0; i < bucketsSize; i++) {

bucketNames.add(“bucket” + i);

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

最后,强调几点:

  • 1. 一定要谨慎对待写在简历上的东西,一定要对简历上的东西非常熟悉。因为一般情况下,面试官都是会根据你的简历来问的; 能有一个上得了台面的项目也非常重要,这很可能是面试官会大量发问的地方,所以在面试之前好好回顾一下自己所做的项目;
  • 2. 和面试官聊基础知识比如设计模式的使用、多线程的使用等等,可以结合具体的项目场景或者是自己在平时是如何使用的;
  • 3. 注意自己开源的Github项目,面试官可能会挖你的Github项目提问;

我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!

以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目。

面试答案

三面头条+四面阿里+五面腾讯拿offer分享面经总结,最终入职阿里

三面头条+四面阿里+五面腾讯拿offer分享面经总结,最终入职阿里

三面头条+四面阿里+五面腾讯拿offer分享面经总结,最终入职阿里

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

g-sh0w21yJ-1712444066486)]

[外链图片转存中…(img-AWKJQcj6-1712444066487)]

[外链图片转存中…(img-YlhZfTRW-1712444066487)]

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值