Decorative image frame

我的阿里巴巴编程之夏

参与的起因

其实早在4月底五月初我就参与到了nacos这个开源项目中,阿里巴巴编程之夏是我在管理nacos issue时偶然根据issue label筛选发现的,而此时我已经是nacos的准commiter以及nacos-spring-project以及nacos-springboot-project`的维护者了

Read More...

Jraft中节点提交一个任务源码浅析

JRaft 中的事务提交

Apply Task
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
@Override
public void apply(final Task task) {
if (this.shutdownLatch != null) {
Utils.runClosureInThread(task.getDone(), new Status(RaftError.ENODESHUTDOWN, "Node is shutting down."));
throw new IllegalStateException("Node is shutting down");
}
Requires.requireNonNull(task, "Null task");

// 创建一个 LogEntry 对象用于承载日志数据
final LogEntry entry = new LogEntry();
entry.setData(task.getData());
int retryTimes = 0;
try {
final EventTranslator<LogEntryAndClosure> translator = (event, sequence) -> {
event.reset();
event.done = task.getDone();
event.entry = entry;
event.expectedTerm = task.getExpectedTerm();
};
while (true) {
// 异步化发送日志
if (this.applyQueue.tryPublishEvent(translator)) {
break;
} else {
retryTimes++;
if (retryTimes > MAX_APPLY_RETRY_TIMES) {
Utils.runClosureInThread(task.getDone(), new Status(RaftError.EBUSY, "Node is busy, has too many tasks."));
LOG.warn("Node {} applyQueue is overload.", getNodeId());
this.metrics.recordTimes("apply-task-overload-times", 1);
return;
}
ThreadHelper.onSpinWait();
}
}

} catch (final Exception e) {
Utils.runClosureInThread(task.getDone(), new Status(RaftError.EPERM, "Node is down."));
}
}
Read More...

JRaft中的轻量级的对象池实现原理浅析

对象池

对象池存在的意义,就是为了避免频繁的创建对象而将对象进行池化操作——创建出来的对象具有可回收的特性,当对象不使用时,直接返回一个对象池容器中,清楚对象的所有属性信息,然后在池中等待复用

而对于对象池,也不是所有场景都使用的,对象池的意义在于减低创建需要高昂成本的对象带来的开销,比如数据库连接、Http连接、字节数组等等

在基于Jraft实现的RheaKV的分布式KV中,由于在Raft的日志应用中存在大量的字节数组操作,因此rheakv基于nettyRecyclers实现了一个对象池

Read More...

leetcode-求x的开平方

题目

实现 int sqrt(int x) 函数。

计算并返回 x 的平方根,其中 x 是非负整数。

由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。

示例 1:

1
2
3
> 输入: 4
> 输出: 2
>

示例 2:

1
2
3
4
5
> 输入: 8
> 输出: 2
> 说明: 8 的平方根是 2.82842...,
> 由于返回类型是整数,小数部分将被舍去。
>
Read More...

ScheduledThreadPoolExecutor 源码浅析

ScheduledThreadPoolExecutor

该线层池其实使用的非常多了,基本遇到定时任务时,都会使用到此线程池来实现该需求,那么,这个线程池的实现是怎么样的呢?

继承关系

ScheduledThreadPoolExecutor继承了ThreadPoolExecutor类以及实现了ScheduledExecutorService接口

初始化
Read More...