目录
这个proto设计的特点:
- 简单的计数器服务
- 支持增加和查询操作
- 包含重定向机制
- 支持快照功能
- 使用可选字段提供灵活性
主要用途:
- 演示RAFT一致性协议
- 提供基本的分布式计数器功能
- 展示Leader-Follower模式
- 实现状态机复制
classDiagram
class Snapshot {
+int64 value
}
class FetchAddRequest {
+int64 value
}
class CounterResponse {
+bool success
+int64 value*
+string redirect*
}
class GetRequest {
}
class CounterService {
+fetch_add(FetchAddRequest) CounterResponse
+get(GetRequest) CounterResponse
}
CounterService --> FetchAddRequest
CounterService --> GetRequest
CounterService --> CounterResponse服务调用流程
状态转换图
stateDiagram-v2
[*] --> Counter: 初始化
Counter --> Counter: fetch_add
Counter --> Counter: get
Counter --> Snapshot: 保存快照
Snapshot --> Counter: 加载快照graph TD
A[Client] --> B{CounterService}
B --> C[fetch_add]
B --> D[get]
C --> E{处理结果}
D --> E
E -->|成功| F[返回value]
E -->|失败| G[返回redirect]
H[Snapshot] -->|加载| B
B -->|保存| H错误处理流程
client处理流程
主程序流程
graph TD
A[开始] --> B[解析命令行参数]
B --> C[注册配置到RouteTable]
C --> D{使用bthread?}
D -->|是| E[创建bthread]
D -->|否| F[创建pthread]
E --> G[等待退出信号]
F --> G
G --> H[等待所有线程结束]
H --> I[结束]
G -->|每秒| J[打印QPS和延迟统计]
J --> Gsender线程处理流程
graph TD
A[开始] --> B{选择Leader}
B -->|失败| C[刷新Leader]
C --> B
B -->|成功| D[初始化Channel]
D -->|失败| E[休眠后重试]
E --> B
D -->|成功| F{随机选择请求类型}
F -->|add_percentage| G[发送fetch_add请求]
F -->|其他| H[发送get请求]
G --> I{请求是否成功?}
H --> I
I -->|RPC失败| J[清除Leader信息]
J --> K[休眠后重试]
K --> B
I -->|业务失败| L[更新Leader信息]
L --> B
I -->|成功| M[记录延迟]
M --> N{是否打印日志?}
N -->|是| O[打印请求信息]
O --> P[休眠1秒]
N -->|否| Q[继续下一次请求]
P --> Q
Q --> B请求处理时序图
sequenceDiagram
participant Client
participant RouteTable
participant Leader
Client->>RouteTable: 获取Leader
alt Leader未知
Client->>RouteTable: 刷新Leader信息
RouteTable-->>Client: 更新结果
end
Client->>Leader: 发送请求
alt 请求成功
Leader-->>Client: 返回结果
Client->>Client: 记录延迟
else 需要重定向
Leader-->>Client: 返回重定向信息
Client->>RouteTable: 更新Leader信息
else RPC失败
Client->>RouteTable: 清除Leader信息
Client->>Client: 休眠后重试
end错误处理流程
graph TD
A[错误发生] --> B{错误类型}
B -->|Leader未知| C[刷新Leader]
B -->|Channel初始化失败| D[重试连接]
B -->|RPC失败| E[清除Leader信息]
B -->|重定向| F[更新Leader信息]
C --> G[继续请求]
D --> G
E --> G
F --> G统计信息收集
graph LR
A[请求完成] --> B[记录延迟]
B --> C[更新QPS]
B --> D[更新延迟统计]
E[主线程] --> F[每秒输出统计]
F --> G[QPS统计]
F --> H[延迟统计]类设计
classDiagram
class StateMachine {
<<interface>>
+on_apply(Iterator&)
+on_shutdown()
+on_snapshot_save(SnapshotWriter*, Closure*)
+on_snapshot_load(SnapshotReader*)
+on_leader_start(int64_t)
+on_leader_stop(Status&)
+on_error(Error&)
+on_configuration_committed(Configuration&)
+on_stop_following(LeaderChangeContext&)
+on_start_following(LeaderChangeContext&)
}
class Counter {
-braft::Node* volatile _node
-butil::atomic<int64_t> _value
-butil::atomic<int64_t> _leader_term
+Counter()
+~Counter()
+int start()
+void fetch_add(FetchAddRequest*, CounterResponse*, Closure*)
+void get(CounterResponse*)
+bool is_leader()
+void shutdown()
+void join()
-void redirect(CounterResponse*)
#void on_apply(Iterator&)
#void on_snapshot_save(SnapshotWriter*, Closure*)
#int on_snapshot_load(SnapshotReader*)
#void on_leader_start(int64_t)
#void on_leader_stop(Status&)
}
class FetchAddClosure {
-Counter* _counter
-FetchAddRequest* _request
-CounterResponse* _response
-Closure* _done
+FetchAddClosure(Counter*, FetchAddRequest*, CounterResponse*, Closure*)
+~FetchAddClosure()
+FetchAddRequest* request()
+CounterResponse* response()
+void Run()
}
class CounterServiceImpl {
-Counter* _counter
+CounterServiceImpl(Counter*)
+void fetch_add(RpcController*, FetchAddRequest*, CounterResponse*, Closure*)
+void get(RpcController*, GetRequest*, CounterResponse*, Closure*)
}
class SnapshotArg {
+int64_t value
+SnapshotWriter* writer
+Closure* done
}
class CounterService {
<<interface>>
+fetch_add(RpcController*, FetchAddRequest*, CounterResponse*, Closure*)
+get(RpcController*, GetRequest*, CounterResponse*, Closure*)
}
class braft_Closure {
<<interface>>
+Run()*
}
Counter --|> StateMachine
CounterServiceImpl --|> CounterService
FetchAddClosure --|> braft_Closure
Counter *-- SnapshotArg
CounterServiceImpl o-- Counter
FetchAddClosure o-- Counter
类之间的关系说明:
- Counter继承自StateMachine,实现了RAFT状态机接口
- CounterServiceImpl继承自CounterService,实现了RPC服务接口
- FetchAddClosure继承自braft::Closure,实现了异步回调接口
- SnapshotArg是Counter的内部类,用于快照操作
- CounterServiceImpl和FetchAddClosure都持有Counter的引用
主要类的职责:
Counter:核心状态机实现,管理计数器值和RAFT节点
CounterServiceImpl:RPC服务实现,处理客户端请求
FetchAddClosure:异步操作回调处理
SnapshotArg:快照参数封装
graph TD
A[开始] --> B[解析命令行参数]
B --> C[创建Server和Counter]
C --> D[添加CounterService]
D --> E[添加RAFT Service]
E --> F[启动Server]
F --> G[启动Counter]
G --> H[等待退出信号]
H --> I[关闭Counter]
I --> J[关闭Server]
J --> K[等待服务完全停止]
K --> L[结束]Counter状态机处理流程
请求处理流程
graph TD
A[接收请求] --> B{是否是Leader?}
B -->|否| C[重定向到Leader]
B -->|是| D{请求类型}
D -->|fetch_add| E[创建Task]
D -->|get| F[直接返回当前值]
E --> G[应用到RAFT组]
G --> H{是否成功?}
H -->|是| I[更新计数器]
H -->|否| J[返回错误]sequenceDiagram
participant SM as StateMachine
participant Writer as SnapshotWriter
participant Storage as Storage
SM->>SM: on_snapshot_save
SM->>Writer: 创建新bthread
activate Writer
Writer->>Storage: 保存当前值
Writer->>Storage: 添加数据文件
Writer-->>SM: 完成快照
deactivate Writer
SM->>SM: on_snapshot_load
SM->>Storage: 读取快照文件
Storage-->>SM: 返回数据
SM->>SM: 更新当前值状态变更处理
FetchAddClosure处理流程
sequenceDiagram
participant Client
participant Closure as FetchAddClosure
participant Counter
participant RAFT
Client->>Counter: fetch_add请求
Counter->>Closure: 创建Closure
Counter->>RAFT: 提交Task
RAFT-->>Closure: 调用Run
alt 成功
Closure-->>Client: 返回结果
else 失败
Closure->>Counter: 重定向
Counter-->>Client: 返回Leader信息
endgraph LR
A[原子操作] --> B[fetch_add]
A --> C[get]
B --> D{内存序}
C --> D
D --> E[Relaxed]
D --> F[Release]
D --> G[Acquire]
Comments 0
Sign in to comment and like
← More postsThat’s all for now. Thanks for reading.
状态转换图
stateDiagram-v2
[*] --> Counter: 初始化
Counter --> Counter: fetch_add
Counter --> Counter: get
Counter --> Snapshot: 保存快照
Snapshot --> Counter: 加载快照
graph TD
A[Client] --> B{CounterService}
B --> C[fetch_add]
B --> D[get]
C --> E{处理结果}
D --> E
E -->|成功| F[返回value]
E -->|失败| G[返回redirect]
H[Snapshot] -->|加载| B
B -->|保存| H错误处理流程
client处理流程
主程序流程
graph TD
A[开始] --> B[解析命令行参数]
B --> C[注册配置到RouteTable]
C --> D{使用bthread?}
D -->|是| E[创建bthread]
D -->|否| F[创建pthread]
E --> G[等待退出信号]
F --> G
G --> H[等待所有线程结束]
H --> I[结束]
G -->|每秒| J[打印QPS和延迟统计]
J --> Gsender线程处理流程
graph TD
A[开始] --> B{选择Leader}
B -->|失败| C[刷新Leader]
C --> B
B -->|成功| D[初始化Channel]
D -->|失败| E[休眠后重试]
E --> B
D -->|成功| F{随机选择请求类型}
F -->|add_percentage| G[发送fetch_add请求]
F -->|其他| H[发送get请求]
G --> I{请求是否成功?}
H --> I
I -->|RPC失败| J[清除Leader信息]
J --> K[休眠后重试]
K --> B
I -->|业务失败| L[更新Leader信息]
L --> B
I -->|成功| M[记录延迟]
M --> N{是否打印日志?}
N -->|是| O[打印请求信息]
O --> P[休眠1秒]
N -->|否| Q[继续下一次请求]
P --> Q
Q --> B请求处理时序图
sequenceDiagram
participant Client
participant RouteTable
participant Leader
Client->>RouteTable: 获取Leader
alt Leader未知
Client->>RouteTable: 刷新Leader信息
RouteTable-->>Client: 更新结果
end
Client->>Leader: 发送请求
alt 请求成功
Leader-->>Client: 返回结果
Client->>Client: 记录延迟
else 需要重定向
Leader-->>Client: 返回重定向信息
Client->>RouteTable: 更新Leader信息
else RPC失败
Client->>RouteTable: 清除Leader信息
Client->>Client: 休眠后重试
end错误处理流程
graph TD
A[错误发生] --> B{错误类型}
B -->|Leader未知| C[刷新Leader]
B -->|Channel初始化失败| D[重试连接]
B -->|RPC失败| E[清除Leader信息]
B -->|重定向| F[更新Leader信息]
C --> G[继续请求]
D --> G
E --> G
F --> G统计信息收集
graph LR
A[请求完成] --> B[记录延迟]
B --> C[更新QPS]
B --> D[更新延迟统计]
E[主线程] --> F[每秒输出统计]
F --> G[QPS统计]
F --> H[延迟统计]类设计
classDiagram
class StateMachine {
<<interface>>
+on_apply(Iterator&)
+on_shutdown()
+on_snapshot_save(SnapshotWriter*, Closure*)
+on_snapshot_load(SnapshotReader*)
+on_leader_start(int64_t)
+on_leader_stop(Status&)
+on_error(Error&)
+on_configuration_committed(Configuration&)
+on_stop_following(LeaderChangeContext&)
+on_start_following(LeaderChangeContext&)
}
class Counter {
-braft::Node* volatile _node
-butil::atomic<int64_t> _value
-butil::atomic<int64_t> _leader_term
+Counter()
+~Counter()
+int start()
+void fetch_add(FetchAddRequest*, CounterResponse*, Closure*)
+void get(CounterResponse*)
+bool is_leader()
+void shutdown()
+void join()
-void redirect(CounterResponse*)
#void on_apply(Iterator&)
#void on_snapshot_save(SnapshotWriter*, Closure*)
#int on_snapshot_load(SnapshotReader*)
#void on_leader_start(int64_t)
#void on_leader_stop(Status&)
}
class FetchAddClosure {
-Counter* _counter
-FetchAddRequest* _request
-CounterResponse* _response
-Closure* _done
+FetchAddClosure(Counter*, FetchAddRequest*, CounterResponse*, Closure*)
+~FetchAddClosure()
+FetchAddRequest* request()
+CounterResponse* response()
+void Run()
}
class CounterServiceImpl {
-Counter* _counter
+CounterServiceImpl(Counter*)
+void fetch_add(RpcController*, FetchAddRequest*, CounterResponse*, Closure*)
+void get(RpcController*, GetRequest*, CounterResponse*, Closure*)
}
class SnapshotArg {
+int64_t value
+SnapshotWriter* writer
+Closure* done
}
class CounterService {
<<interface>>
+fetch_add(RpcController*, FetchAddRequest*, CounterResponse*, Closure*)
+get(RpcController*, GetRequest*, CounterResponse*, Closure*)
}
class braft_Closure {
<<interface>>
+Run()*
}
Counter --|> StateMachine
CounterServiceImpl --|> CounterService
FetchAddClosure --|> braft_Closure
Counter *-- SnapshotArg
CounterServiceImpl o-- Counter
FetchAddClosure o-- Counter
类之间的关系说明:
- Counter继承自StateMachine,实现了RAFT状态机接口
- CounterServiceImpl继承自CounterService,实现了RPC服务接口
- FetchAddClosure继承自braft::Closure,实现了异步回调接口
- SnapshotArg是Counter的内部类,用于快照操作
- CounterServiceImpl和FetchAddClosure都持有Counter的引用
主要类的职责:
Counter:核心状态机实现,管理计数器值和RAFT节点
CounterServiceImpl:RPC服务实现,处理客户端请求
FetchAddClosure:异步操作回调处理
SnapshotArg:快照参数封装
graph TD
A[开始] --> B[解析命令行参数]
B --> C[创建Server和Counter]
C --> D[添加CounterService]
D --> E[添加RAFT Service]
E --> F[启动Server]
F --> G[启动Counter]
G --> H[等待退出信号]
H --> I[关闭Counter]
I --> J[关闭Server]
J --> K[等待服务完全停止]
K --> L[结束]Counter状态机处理流程
请求处理流程
graph TD
A[接收请求] --> B{是否是Leader?}
B -->|否| C[重定向到Leader]
B -->|是| D{请求类型}
D -->|fetch_add| E[创建Task]
D -->|get| F[直接返回当前值]
E --> G[应用到RAFT组]
G --> H{是否成功?}
H -->|是| I[更新计数器]
H -->|否| J[返回错误]sequenceDiagram
participant SM as StateMachine
participant Writer as SnapshotWriter
participant Storage as Storage
SM->>SM: on_snapshot_save
SM->>Writer: 创建新bthread
activate Writer
Writer->>Storage: 保存当前值
Writer->>Storage: 添加数据文件
Writer-->>SM: 完成快照
deactivate Writer
SM->>SM: on_snapshot_load
SM->>Storage: 读取快照文件
Storage-->>SM: 返回数据
SM->>SM: 更新当前值状态变更处理
FetchAddClosure处理流程
sequenceDiagram
participant Client
participant Closure as FetchAddClosure
participant Counter
participant RAFT
Client->>Counter: fetch_add请求
Counter->>Closure: 创建Closure
Counter->>RAFT: 提交Task
RAFT-->>Closure: 调用Run
alt 成功
Closure-->>Client: 返回结果
else 失败
Closure->>Counter: 重定向
Counter-->>Client: 返回Leader信息
endgraph LR
A[原子操作] --> B[fetch_add]
A --> C[get]
B --> D{内存序}
C --> D
D --> E[Relaxed]
D --> F[Release]
D --> G[Acquire]
Comments 0
Sign in to comment and like
← More postsThat’s all for now. Thanks for reading.
client处理流程
主程序流程
graph TD
A[开始] --> B[解析命令行参数]
B --> C[注册配置到RouteTable]
C --> D{使用bthread?}
D -->|是| E[创建bthread]
D -->|否| F[创建pthread]
E --> G[等待退出信号]
F --> G
G --> H[等待所有线程结束]
H --> I[结束]
G -->|每秒| J[打印QPS和延迟统计]
J --> G
sender线程处理流程
graph TD
A[开始] --> B{选择Leader}
B -->|失败| C[刷新Leader]
C --> B
B -->|成功| D[初始化Channel]
D -->|失败| E[休眠后重试]
E --> B
D -->|成功| F{随机选择请求类型}
F -->|add_percentage| G[发送fetch_add请求]
F -->|其他| H[发送get请求]
G --> I{请求是否成功?}
H --> I
I -->|RPC失败| J[清除Leader信息]
J --> K[休眠后重试]
K --> B
I -->|业务失败| L[更新Leader信息]
L --> B
I -->|成功| M[记录延迟]
M --> N{是否打印日志?}
N -->|是| O[打印请求信息]
O --> P[休眠1秒]
N -->|否| Q[继续下一次请求]
P --> Q
Q --> B
请求处理时序图
sequenceDiagram
participant Client
participant RouteTable
participant Leader
Client->>RouteTable: 获取Leader
alt Leader未知
Client->>RouteTable: 刷新Leader信息
RouteTable-->>Client: 更新结果
end
Client->>Leader: 发送请求
alt 请求成功
Leader-->>Client: 返回结果
Client->>Client: 记录延迟
else 需要重定向
Leader-->>Client: 返回重定向信息
Client->>RouteTable: 更新Leader信息
else RPC失败
Client->>RouteTable: 清除Leader信息
Client->>Client: 休眠后重试
end
错误处理流程
graph TD
A[错误发生] --> B{错误类型}
B -->|Leader未知| C[刷新Leader]
B -->|Channel初始化失败| D[重试连接]
B -->|RPC失败| E[清除Leader信息]
B -->|重定向| F[更新Leader信息]
C --> G[继续请求]
D --> G
E --> G
F --> G
统计信息收集
graph LR
A[请求完成] --> B[记录延迟]
B --> C[更新QPS]
B --> D[更新延迟统计]
E[主线程] --> F[每秒输出统计]
F --> G[QPS统计]
F --> H[延迟统计]
类设计
classDiagram
class StateMachine {
<<interface>>
+on_apply(Iterator&)
+on_shutdown()
+on_snapshot_save(SnapshotWriter*, Closure*)
+on_snapshot_load(SnapshotReader*)
+on_leader_start(int64_t)
+on_leader_stop(Status&)
+on_error(Error&)
+on_configuration_committed(Configuration&)
+on_stop_following(LeaderChangeContext&)
+on_start_following(LeaderChangeContext&)
}
class Counter {
-braft::Node* volatile _node
-butil::atomic<int64_t> _value
-butil::atomic<int64_t> _leader_term
+Counter()
+~Counter()
+int start()
+void fetch_add(FetchAddRequest*, CounterResponse*, Closure*)
+void get(CounterResponse*)
+bool is_leader()
+void shutdown()
+void join()
-void redirect(CounterResponse*)
#void on_apply(Iterator&)
#void on_snapshot_save(SnapshotWriter*, Closure*)
#int on_snapshot_load(SnapshotReader*)
#void on_leader_start(int64_t)
#void on_leader_stop(Status&)
}
class FetchAddClosure {
-Counter* _counter
-FetchAddRequest* _request
-CounterResponse* _response
-Closure* _done
+FetchAddClosure(Counter*, FetchAddRequest*, CounterResponse*, Closure*)
+~FetchAddClosure()
+FetchAddRequest* request()
+CounterResponse* response()
+void Run()
}
class CounterServiceImpl {
-Counter* _counter
+CounterServiceImpl(Counter*)
+void fetch_add(RpcController*, FetchAddRequest*, CounterResponse*, Closure*)
+void get(RpcController*, GetRequest*, CounterResponse*, Closure*)
}
class SnapshotArg {
+int64_t value
+SnapshotWriter* writer
+Closure* done
}
class CounterService {
<<interface>>
+fetch_add(RpcController*, FetchAddRequest*, CounterResponse*, Closure*)
+get(RpcController*, GetRequest*, CounterResponse*, Closure*)
}
class braft_Closure {
<<interface>>
+Run()*
}
Counter --|> StateMachine
CounterServiceImpl --|> CounterService
FetchAddClosure --|> braft_Closure
Counter *-- SnapshotArg
CounterServiceImpl o-- Counter
FetchAddClosure o-- Counter
类之间的关系说明:
- Counter继承自StateMachine,实现了RAFT状态机接口
- CounterServiceImpl继承自CounterService,实现了RPC服务接口
- FetchAddClosure继承自braft::Closure,实现了异步回调接口
- SnapshotArg是Counter的内部类,用于快照操作
- CounterServiceImpl和FetchAddClosure都持有Counter的引用
主要类的职责:
Counter:核心状态机实现,管理计数器值和RAFT节点
CounterServiceImpl:RPC服务实现,处理客户端请求
FetchAddClosure:异步操作回调处理
SnapshotArg:快照参数封装
graph TD
A[开始] --> B[解析命令行参数]
B --> C[创建Server和Counter]
C --> D[添加CounterService]
D --> E[添加RAFT Service]
E --> F[启动Server]
F --> G[启动Counter]
G --> H[等待退出信号]
H --> I[关闭Counter]
I --> J[关闭Server]
J --> K[等待服务完全停止]
K --> L[结束]Counter状态机处理流程
请求处理流程
graph TD
A[接收请求] --> B{是否是Leader?}
B -->|否| C[重定向到Leader]
B -->|是| D{请求类型}
D -->|fetch_add| E[创建Task]
D -->|get| F[直接返回当前值]
E --> G[应用到RAFT组]
G --> H{是否成功?}
H -->|是| I[更新计数器]
H -->|否| J[返回错误]sequenceDiagram
participant SM as StateMachine
participant Writer as SnapshotWriter
participant Storage as Storage
SM->>SM: on_snapshot_save
SM->>Writer: 创建新bthread
activate Writer
Writer->>Storage: 保存当前值
Writer->>Storage: 添加数据文件
Writer-->>SM: 完成快照
deactivate Writer
SM->>SM: on_snapshot_load
SM->>Storage: 读取快照文件
Storage-->>SM: 返回数据
SM->>SM: 更新当前值状态变更处理
FetchAddClosure处理流程
sequenceDiagram
participant Client
participant Closure as FetchAddClosure
participant Counter
participant RAFT
Client->>Counter: fetch_add请求
Counter->>Closure: 创建Closure
Counter->>RAFT: 提交Task
RAFT-->>Closure: 调用Run
alt 成功
Closure-->>Client: 返回结果
else 失败
Closure->>Counter: 重定向
Counter-->>Client: 返回Leader信息
endgraph LR
A[原子操作] --> B[fetch_add]
A --> C[get]
B --> D{内存序}
C --> D
D --> E[Relaxed]
D --> F[Release]
D --> G[Acquire]
Comments 0
Sign in to comment and like
← More postsThat’s all for now. Thanks for reading.
请求处理流程
graph TD
A[接收请求] --> B{是否是Leader?}
B -->|否| C[重定向到Leader]
B -->|是| D{请求类型}
D -->|fetch_add| E[创建Task]
D -->|get| F[直接返回当前值]
E --> G[应用到RAFT组]
G --> H{是否成功?}
H -->|是| I[更新计数器]
H -->|否| J[返回错误]
sequenceDiagram
participant SM as StateMachine
participant Writer as SnapshotWriter
participant Storage as Storage
SM->>SM: on_snapshot_save
SM->>Writer: 创建新bthread
activate Writer
Writer->>Storage: 保存当前值
Writer->>Storage: 添加数据文件
Writer-->>SM: 完成快照
deactivate Writer
SM->>SM: on_snapshot_load
SM->>Storage: 读取快照文件
Storage-->>SM: 返回数据
SM->>SM: 更新当前值状态变更处理
FetchAddClosure处理流程
sequenceDiagram
participant Client
participant Closure as FetchAddClosure
participant Counter
participant RAFT
Client->>Counter: fetch_add请求
Counter->>Closure: 创建Closure
Counter->>RAFT: 提交Task
RAFT-->>Closure: 调用Run
alt 成功
Closure-->>Client: 返回结果
else 失败
Closure->>Counter: 重定向
Counter-->>Client: 返回Leader信息
endgraph LR
A[原子操作] --> B[fetch_add]
A --> C[get]
B --> D{内存序}
C --> D
D --> E[Relaxed]
D --> F[Release]
D --> G[Acquire]
FetchAddClosure处理流程
sequenceDiagram
participant Client
participant Closure as FetchAddClosure
participant Counter
participant RAFT
Client->>Counter: fetch_add请求
Counter->>Closure: 创建Closure
Counter->>RAFT: 提交Task
RAFT-->>Closure: 调用Run
alt 成功
Closure-->>Client: 返回结果
else 失败
Closure->>Counter: 重定向
Counter-->>Client: 返回Leader信息
end
graph LR
A[原子操作] --> B[fetch_add]
A --> C[get]
B --> D{内存序}
C --> D
D --> E[Relaxed]
D --> F[Release]
D --> G[Acquire]
Comments 0
Sign in to comment and like
No comments yet.