唯一计数服务

服务说明

实现以下几种功能:

  • 自增计数, 每次调用自增计数

  • 指定范围循环自增计数, 每次调用自增计数, 当到最大值则从最小值开始重新计数

  • 唯一随机字符串, 可以设置字符串过期时间

基于 raft 实现的数据存储服务, 能实现 2n+1 台节点的数据一致性存储.

配置文件

服务的配置文件格式如下:

      <root>
        <raft>
            #选举超时时间(毫秒)
            electionTimeoutMilliseconds = 3000
            #leader和从机间心跳时间(毫秒)
            heartbeatPeriodMilliseconds = 300
            #数据制作快照的时间(毫秒)
            snapshotPeriodSeconds       = 6000
            #同步数据时, 每个请求最大的日志条数
            maxLogEntriesPerRequest     = 100
            #同步数据时, 内存队列最大的数据条数
            maxLogEntriesMemQueue       = 3000
            #同部数据时, 正在传输的数据最大条数
            maxLogEntriesTransfering    = 1000
        </raft>
        #起始计数
        start-count = 100000
        storage-path=/count-data
      </root>

部署说明

部署主要关注几点:

  • 需要至少部署(2n+1)台节点, 至少三台节点, 少于三台节点无法正常工作, 其中有一台是 leader, 其他是 follower 节点

  • 其中最多可以有 2n-1 台节点 down 机, 集群也不会影响, 仍然能正常工作

  • 当在 TARS 框架上增加节点时, 请注意一台一台增加, 不要同时增加多台, 观察日志节点正常后才能增加下一台

  • 增加新节点会自动同步数据, 原则上不需要做任何处理

  • 数据目录在配置文件中指定, 如果是 docker 部署注意映射宿主机目录

  • 如果使用 K8SFramework 机制部署时, 请注意要开启 LocalPV 支持, 且增加 mount 路径(mount 数据目录)

使用说明

  • 使用 c++, 底层数据存储用 rockesdb

  • 拿到 tars 协议文件, 通过 CountPrx 即可完成服务的调用

  • 计数接口count/circleCount数据接口最终都转发到 leader 来执行写处理

  • 查询数据接口可以指定是否在 leader 执行, 如果不指定 leader, 不保证写入的数据马上能查到, 因为数据同步有一定延时

  • 如果查询每次指定 leader 会影响效率, 但是如果不指定 leader 会有数据延迟(通常都是毫秒级别)

  • 可以在 tarsweb 上, 发送命令查看和修改表的数据, 方便调试

    • count.get sBusinessName sKey

    • count.set sBusinessName sKey value default

    • count.circle sBusinessName sKey value min max

服务说明

服务有两个 servant:

  • RaftObj: raft 端口接口

  • CountObj: 业务服务模块

使用者调用 CountObj 接口即可, RaftObj 是提供给 raft 协议协商使用.

读接口都带有 leader 参数, 表示是否一定要从 leader 读取数据, 对于实时性以及数据准确性要求不那么高的请求, 可以设置 leader 为 false, 这样能提高整体集群的通信效率.

Last updated