/bank_transfer_test

test mysql like database transaction at bank transfer scene

Primary LanguageGo

设计概要

  • 每隔固定的时间会进行stw, controller负责像每个worker发送stw信号,然后等待所有worker进入safe point,之后再对每张表的账户状态进行检查,检查完毕后恢复worker(检查不通过则程序退出)
  • 在内存中维护了一组正确的状态,用于和db中的进行比对
  • 利用转帐事务次序不影响最终结果的特性, 内存状态的更新完全使用atomic进行无锁更新, 以保证对吞吐量的影响最小
  • 在数据库无法提供服务的情况也能持续运行, 等到数据库启动成功则转帐和检查将继续正常执行

使用

./bank 127.0.0.1:3306 -U root  -P xxx -D 5s -I 1s

注:要预先在mysql中新建test库

  • 127.0.0.1:3306 为测试db所在的ip地址和端口号
  • root为使用的数据库用户名
  • xxx为数据库密码
  • 5s表示持续转帐5s, 当校验发生错误时,程序就会立即停止,不会等到这个时间
  • 1s表示STW之间的间隔为1s

在程序运行过程中可以对数据库进行任意的关闭和重启,不会影响程序的验证。

如果校验失败,程序就会退出并且dump出预期的一致状态(程序运行目录下生成dump.log) ,然后退出。