viabtc / viabtc_exchange_server

A trading engine with high-speed performance and real-time notification
MIT License
2.68k stars 1.49k forks source link

HttpApi部分接口返回空数据 #103

Closed yin273642232 closed 6 years ago

yin273642232 commented 6 years ago

已将整个服务都搭建运行起来了,并通过httpApi设置账户并撮合成功了,账户余额、订单类的数据都正常;

  1. 但是发现有几个httpApi接口返回数据是 0; 请求: {"method":"market.last","params":["EOSUSDT"],"id":8172334705666} 响应: { "error": null, "result": "0", "id": 8172334705666 }

请求: {"method":"market.deals","params":["EOSUSDT",100,1],"id":8172334705667} 响应: { "error": null, "result": [], "id": 8172334705667 }

请求: {"method":"market.kline","params":["EOSUSDT",1530097200,1530122400,60],"id":8172334705668} 响应: { "error": null, "result": [], "id": 8172334705668 }

请求: {"method":"market.status","params":["EOSUSDT",86400],"id":8172334705669} 响应: { "error": null, "result": { "period": 86400, "last": "0", "open": "0", "close": "0", "high": "0", "low": "0", "volume": "0", "deal": "0" }, "id": 8172334705669 }

请求: {"method":"market.status_today","params":["EOSUSDT"],"id":8172334705670} 响应: { "error": null, "result": { "open": "0", "last": "0", "high": "0", "low": "0", "volume": "0", "deal": "0" }, "id": 8172334705670 }

  1. 新增币种和交易对需要修改配置文件重启服务? 2.1 请问需要重启哪些服务(以此顺序有要求吗)。 2.2 有办法平滑重启 或 不用重启就能加载新配置的办法或思路吗?
rqzrqh commented 6 years ago

1.这几个都是行情接口,kafka是不是还没搭建起来? 2.这个程序设计初还是比较简单的,市场写死在配置里,按原代码的设计只能重启服务。 2.1.要重启matchengine和marketprice,先重启marketprice,再重启matchengine,不过这两个哪个先后重启影响都不大,有kafka的消息机制保证了成交一定会收到。 2.2.有两种方法,一种是增加控制接口,在该接口中增加或者删除市场,还有一种方法是每个交易对一个撮合,前提是报盘功能要分离出去,并使用zookeeper或其他来实现服务注册和发现。如果所有的交易对都在一个撮合中,当订单簿增大,交易对增多时,深度的计算会很耗时。

yin273642232 commented 6 years ago

非常感谢, 我的问题确实是kafka有问题导致的。 重载新的币种和新的交易对 计划采用HttpApi方式来平滑载入(初步是已实现,但是载入账户发现是从数据库读取的,存在账户被重置);

从数据库读取账户可用和冻结余额,然后加载存储在内存中,只有到指定的dump时间间隔(默认配置的是1个小时)写入到数据库;

问题是: 发现重启matchengine进程, 内存中的账户数据并没有dump到数据库,这样导致重启后加载到的是上一次dump的旧数据,这样导致账户数据不正确, 不知道有没有什么好的办法尽量的保障账户能dump到数据库?

另外 重启matchengine进程 的shell脚本好像是直接killall进程的,这样的方式太粗暴了,有平滑的重启方式吗?防止交易撮合的数据正在进行中出问题,同时也避免账户数据不正确。

rqzrqh commented 6 years ago

一小时dump一次的是撮合的快照,重启时会通过日志进行恢复到上一次的状态。撮合是100毫秒记录一次日志,所以基本上来讲如果不是严重故障一般都能恢复的。 方案一:对报盘和撮合分离,撮合只负责内存不撮合,并且不记录资金。由报盘结算系统处理资金。 方案二:任意一次输入和产生的结果使用事务的形式提交,大约是700个操作每秒。 以上两种方式粗暴杀死撮合不会影响数据。

haipome commented 6 years ago

没有错报杀死,程序收到 SIGQUIT 后会柔性退出。 https://github.com/viabtc/viabtc_exchange_server/blob/master/matchengine/me_main.c#L26 https://github.com/viabtc/viabtc_exchange_server/blob/master/utils/ut_signal.c#L81

Bringer-of-Light commented 6 years ago

"有两种方法,一种是增加控制接口,在该接口中增加或者删除市场,还有一种方法是每个交易对一个撮合,前提是报盘功能要分离出去,并使用zookeeper或其他来实现服务注册和发现。如果所有的交易对都在一个撮合中,当订单簿增大,交易对增多时,深度的计算会很耗时"

请问这里面说的报盘功能是什么意思呢?报盘功能要包括哪些功能呢

方案一:对报盘和撮合分离,撮合只负责内存不撮合,并且不记录资金。由报盘结算系统处理资金。

这个是什么意思呢?是用户余额、订单薄、成交记录等,都要放到viabtc server之外吗?

Bringer-of-Light commented 6 years ago

如果想实现每个交易对一个撮合服务,并且重启所有服务不影响数据,应该使用哪种方案呢?

rqzrqh commented 6 years ago

报盘指的是订单提交给内存撮合前的处理,包括资金冻结,其他一些参数检查。结算是处理撮合返回的应答,包括订单入库,日志入库,资产变更,成交入库。

rqzrqh 邮箱:rqzrqh@163.com

Signature is customized by Netease Mail Master

在2018年06月29日 20:26,Bringer-of-Light 写道:

如果想实现每个交易对一个撮合服务,并且重启所有服务不影响数据,应该使用哪种方案呢?

— You are receiving this because you commented. Reply to this email directly, view it on GitHub, or mute the thread.

LinkChain commented 6 years ago

curl http://localhost:8080 -d '{"method": "market.last", "params": ["LTCBCH"], "id": 1516681174}' { "result": "2.00000000", "error": null, "id": 1516681174 } curl http://localhost:8080 -d '{"method": "market.deals", "params": ["LTCBCH",10,1], "id": 1516681174}' { "result": [ { "id": 51899, "time": 1534258410.3872011, "type": "buy", "price": "2", "amount": "2" }, { "id": 51883, "time": 1534257769.7312109, "type": "buy", "price": "2", "amount": "76" }, { "id": 51882, "time": 1534257769.7295561, "type": "buy", "price": "2", "amount": "73" }, { "id": 51881, "time": 1534257769.7284541, "type": "buy", "price": "2", "amount": "51" }, { "id": 45038, "time": 1533787241.1614201, "type": "sell", "price": "2.94982977", "amount": "0.01402789" }, { "id": 45037, "time": 1533787241.1610589, "type": "sell", "price": "3.01283256", "amount": "62.36668622" } ], "error": null, "id": 1516681174 } curl http://localhost:8080 -d '{"method": "market.user_deals", "params": [1,"BTCCH",3,1], "id": 1516681174}' { "error": null, "result": { "offset": 3, "limit": 1, "records": [ { "amount": "12.12431706", "time": 1533780069.7721951, "id": 9538, "price": "6.78635118", "user": 1, "market": "BTCBCH", "role": 1, "side": 2, "deal": "82.2798733868251308", "fee": "9.699453648", "deal_order_id": 12450 } ] }, "id": 1516681174 } curl http://localhost:8080 -d '{"method": "market.kline", "params": ["BTCBCH",1044440,3600], "id": 1516681174}' { "result": [], "error": null, "id": 1516681174 } curl http://localhost:8080 -d '{"method": "market.status", "params": ["BTCBCH",86400], "id": 1516681174}' { "result": { "period": 86400, "last": "2", "open": "2", "close": "2", "high": "2", "low": "2", "deal": "600", "volume": "300" }, "error": null, "id": 1516681174 } Why KLine no data?

klpeng commented 5 years ago

非常感谢, 我的问题确实是kafka有问题导致的。 重载新的币种和新的交易对 计划采用HttpApi方式来平滑载入(初步是已实现,但是载入账户发现是从数据库读取的,存在账户被重置);

从数据库读取账户可用和冻结余额,然后加载存储在内存中,只有到指定的dump时间间隔(默认配置的是1个小时)写入到数据库;

问题是: 发现重启matchengine进程, 内存中的账户数据并没有dump到数据库,这样导致重启后加载到的是上一次dump的旧数据,这样导致账户数据不正确, 不知道有没有什么好的办法尽量的保障账户能dump到数据库?

另外 重启matchengine进程 的shell脚本好像是直接killall进程的,这样的方式太粗暴了,有平滑的重启方式吗?防止交易撮合的数据正在进行中出问题,同时也避免账户数据不正确。

你好,我也遇到你描述的问题1,请教一下,你是如何解决的