/images/logo.jpg

[Cluster] 1. 浅谈RAFT算法:从单节点到分布式共识的完整演进

引言

  • RAFT(Raft Consensus Algorithm)是一种分布式共识算法,旨在解决分布式系统中多个节点对数据状态达成一致的问题。
  • 相比于著名的Paxos算法,RAFT的设计理念是"可理解性"(understandability),通过清晰的角色划分和简洁的状态转换,让开发者更容易理解和实现。
  • 本文将通过11个详细的图例,展示RAFT算法从单节点到多节点集群的完整演进过程,包括正常运行、故障处理、网络分区和冲突解决等关键场景。

RAFT核心概念

  • 在深入分析之前,让我们先了解RAFT的几个核心概念:

节点状态(Node States)

[Java] 2. Unit Test 基本用法

Mocikto基本用法

在单元测试里,很多测试(除Util类)都需要mock掉一些服务来保证只测试当前想测的内容.

具体使用时,需要先mock一个对象,然后再mock此对象的方法,然后就可以使用mock的方法去测想测的逻辑了.

[Spring] 1. spring web CompletionStage 浅谈

介绍

  • spring-web里对异步的支持做的很好,可以通过异步返回的形式,做许多优化
    • 提高吞吐量
    • 精细调控各业务执行线程池

样例说明

 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
43
44
45
46
47
48
49
/**
 * async interface controller
 *
 * @author Goody
 * @version 1.0, 2024/9/19
 */
@RestController
@RequestMapping("/goody")
@RequiredArgsConstructor
@Slf4j
public class GoodyAsyncController {

    private static final AtomicInteger COUNT = new AtomicInteger(0);
    private static final Executor EXECUTOR = new ThreadPoolExecutor(
        10,
        10,
        10,
        TimeUnit.SECONDS,
        new ArrayBlockingQueue<>(10),
        r -> new Thread(r, String.format("customer-t-%s", COUNT.addAndGet(1)))
    );

    @GetMapping("async/query1")
    public CompletionStage<String> asyncQuery1() {
        log.info("async query start");
        return CompletableFuture.supplyAsync(() -> {
            log.info("async query sleep start");
            ThreadUtils.sleep(1000);
            log.info("async query sleep done");
            log.info("async query done");
            return "done";
        }, EXECUTOR);
    }

    @GetMapping("sync/query1")
    public String syncQuery1() throws InterruptedException {
        log.info("sync query start");
        final CountDownLatch latch = new CountDownLatch(1);
        EXECUTOR.execute(() -> {
            log.info("sync query sleep start");
            ThreadUtils.sleep(1000);
            log.info("sync query sleep done");
            latch.countDown();
        });
        latch.await();
        log.info("sync query done");
        return "done";
    }
}
  • 定义了一个自定义的线程池,用于异步状态下使用
  • 这里一个同步,一个异步,可以看下具体的请求情况

单次请求

请求异步接口

curl –location ‘127.0.0.1:50012/goody/async/query1’