目录

这个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 --> 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

类之间的关系说明:

  1. Counter继承自StateMachine,实现了RAFT状态机接口
  2. CounterServiceImpl继承自CounterService,实现了RPC服务接口
  3. FetchAddClosure继承自braft::Closure,实现了异步回调接口
  4. SnapshotArg是Counter的内部类,用于快照操作
  5. 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信息 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

No comments yet.

← More postsThat’s all for now. Thanks for reading.