欢迎关注「Keegan小钢」公众号获取更多文章
撮合引擎开发:开篇
撮合引擎开发:MVP版本
撮合引擎开发:数据结构设计
撮合引擎开发:对接黑箱
撮合引擎开发:解密黑箱流程
撮合引擎开发:流程的代码实现
撮合引擎开发:缓存和MQ
撮合引擎开发:日志输出
撮合引擎开发:完结篇
本小节是该系列文章的最后一篇了,将讲解剩下的一些东西,包括交易委托账本中订单队列的实现逻辑、更多订单类型的实现逻辑。另外,不少朋友在问,完结后所有代码是否会开源放上 Github?我只能说,长期大概率会开源,但短期内还没打算开源。
订单队列
交易委托账本其实就是由两个订单队列组成的,一个买单队列,一个卖单队列。任何对交易委托账本的查询和操作,实际上都是查询和操作这两个队列。订单队列的设计也直接影响了撮合的性能,前面文章讲数据结构设计时也有简单聊了订单队列的设计,我们主要是用二维链接结合 Map 来保存所有订单的,依赖的是 container/list 包。
订单队列的结构体如下:
type orderQueue struct {
sortBy enum.SortDirection
parentList *list.List
elementMap map[string]*list.Element
}
sortBy 指定价格排序的方向,买单队列是降序的,而卖单队列则是升序的。parentList 保存整个二维链表的所有订单,第一维以价格排序,第二维以时间排序。elementMap 则是 Key 为价格、Value 为第二维订单链表的键值对。
初始化函数就比较简单了,对几个字段赋值而已,代码如下:
func (q *orderQueue) init(sortBy enum.SortDirection) {
q.sortBy = sortBy
q.parentList = list.New()
q.elementMap = make(map[string]*list.Element)
}
<