手机版

当前位置:数字货币交易所 > 业界 >

Huobi最近几次非正常价格成交单的技术缘由说明

时间:2021-07-19 06:11:23|浏览:


解决方法:

1、Huobi于6月2日凌晨00:40左右停止了“市价单”功能 ,并决定在未完全解决这个问题之前暂时不再开放市价单功能。

2、新版撮合引擎完成测试上线后再重新开启“市价单”功能,同时为了愈加安全和稳定,新版撮合引擎改用靠谱消息队列达成价格队列和撮合,在提升性能和稳定性的同时防止这种由数据库撮合带来的问题。现在新版撮合引擎已经进入测试阶段,本月内将与大伙见面。

3、新版撮合引擎上线后,大家会把旧版的撮合引擎在github上开源,懂技术的朋友一方面可以探讨交流,另外一方面做交易网站的同行们也可以参考(经过实测,此撮合系统虽然不支持市价单,但至少支持每秒500笔的买卖处置,可以满足大多数交易平台的性能需要)。

亲爱的朋友们:

第一请允许火币君说一声:“抱歉,让大伙担忧了”。大家都知道,在5月22日Huobi上线新功能“市价单”后,因为新功能市价单和主动单相撞,Huobi在5月26日至6月2日期间一共出现了5次非正常价格成交单的状况,虽然不影响用户正常价格买卖,但给大伙带来的困扰,大家深感抱歉。大家觉得有必要将整个过程通过技术的角度给大伙详细说明,以免大伙担忧和误解。

Huobi的撮合引擎是基于mysql数据库和golang撰写,使用了github.com/go-sql-driver/mysql的访问驱动,挂单撤单和撮合都使用最严格的表锁,使用了最守旧的串行化事务。这次遇见问题的市价单功能,是在4月中旬左右开始的一个项目,该项目从开发测试到上线前后经历了一个月,在上线前两周多内时间内经过了足够的测试,在测试期间内没发生过一块此类问题bug。

新上线的市价单撮合功能的逻辑也比较容易,它对于市价单的主要处置过程是在撮合中每遇见一张市价单即锁住订单表并以”id<{市价单id}”为条件查找之前未成交的被动限价单实行撮合过程,撮合产生的成交价格以被动单的价格为准。

根据该撮合逻辑,主动单在行情深度足够的状况下是不会有机会碰到市价单的,由于小于市价单id的主动单已经在之前的一般单撮合中成交全部完成。但依据实质跟踪剖析后发目前未知缘由的极端随机状况下,上述的查看结果中包含了明显应该在限价单撮合中已经完成撮合但没被撮合过的主动单,该主动单没经历过之前的一般单撮合过程,根据价格优先的撮合原则被优先成交,致使直接撞上了市价单成交由此形成了异常成交记录,譬如万元单就是市价卖单id=18829359的订单与价格万元的主动买单 id=18829357成交(其中不连续的订单id18829358是被用户取消的订单)。

这个问题在一周时间内分3天总共发生了5次,每次发生后工程师都加大了对于数据库事务一致性和撮合有关的代码的检查更改,但最后没完全解决到问题,火币运营部门于6月2日凌晨00:40左右停止了市价单功能,并决定在未完全解决这个问题之前暂时不再开放市价单功能.

随后,火币工程师通过历史数据,对已经在测试中的新版撮合引擎进行了很多的重压测试,到现在为止没发现存在类似的问题,现在暂时怀疑是go的mysql驱动本身或用方面存在问题,但因该项目缺少详细的文档和社区帮没办法进一步确认具体缘由,大家已经决定上报该bug到github社区,并放弃用go语言继续升级目前版本的功能。

最后感谢大伙的理解和支持!

Copyright © 2002-2021 数字货币交易所 (http://www.bjfdjx.com) 网站地图 TAG标签