前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >撮合交易系统服务边界与设计

撮合交易系统服务边界与设计

作者头像
kinbug [进阶者]
发布2020-06-15 16:20:12
2.2K0
发布2020-06-15 16:20:12
举报
文章被收录于专栏:IT进修之路IT进修之路

如何设计并实现一个数字货币交易系统     

        证券交易系统是金融市场上能够提供的最有流动性,效率最高的交易场所。和传统的商品交易不同的是,证券交易系统提供的买卖标的物是标准的数字化资产,如USD、股票、BTC等,它们的特点是数字计价,可分割买卖。

        证券交易系统通过买卖双方各自的报价,按照价格优先、时间优先的顺序,对买卖双方进行撮合,实现每秒成千上万的交易量,可以为市场提供高度的流动性和价格发现机制。

        一个完整的数字货币交易系统是由用户系统(sso)、账户系统(account)、订单系统(order)、撮合系统(match)、以及清算系统( clearing )、行情系统(market)和钱包系统(wallet)构成的。各个子系统相互配合,完成数字货币报价交易。

  • SSO:用户全局登录,身份验证,权限现在;
  • account:用户用户数字货币相关操作,查看账户、划转、冻结等操作;
  • order:提供给下单,撤单,委托列表,历史交易记录;
  • match: 撮合引擎是交易系统的核心。撮合引擎本质上就是维护一个买卖盘列表,然后按价格优先原则对订单进行撮合,能够成交的就输出成交结果,不能成交的放入买卖盘。这里注意没有时间优先原则,因为经过定序的订单队列已经是一个时间优先的队列了。
  • clearing: 清算的工作就是把买单冻结的USD扣掉,并加上买入所得的BTC,同时,把卖单冻结的BTC扣掉,并加上卖出所得的USD。根据taker/maker的费率,向买卖双方收取手续费。
  • market: 情系统保存市场的成交价、成交量等信息,并输出实时价格、K线图等技术数据,以便公开市场查询。
  • wallet:钱包系统就是提供给用户充值、提币等操作。

当然如果是自己的做的钱包,那么你可能还需要节点扫描上账系统,和离线签名系统(冷钱包),之前也看见过一些朋友说定序系统,我提供的方案是用mq队列的放手,先进先出。

说说核心代码,disruptor高性能环形队列无锁特性,使它成为交易所撮合引擎的核心技术,再加上分布式热备份内存技术,就基本上可以实现一个不错的撮合引擎了先看看disruptor:

DisruptorConfig:

代码语言:javascript
复制
public class DisruptorConfig {
	
	static Disruptor<OrderEvent> disruptor;
	static{
		OrderEventFactory factory = new OrderEventFactory();
		int ringBufferSize = 1024*1024;
		ThreadFactory threadFactory = runnable -> new Thread(runnable);
		disruptor = new Disruptor<>(factory, ringBufferSize, threadFactory,ProducerType.MULTI, new YieldingWaitStrategy());
		disruptor.handleEventsWithWorkerPool(new MatchHandler(),new MatchHandler()).then(new DepthInputHandler(),new DepthOutHandler());
		disruptor.start();
	}
	
	public static void producer(OrderEvent input){
		RingBuffer<OrderEvent> ringBuffer = disruptor.getRingBuffer();
		OrderProducer producer = new OrderProducer(ringBuffer);
		producer.onData(input);
	}
}

OrderProducer:

代码语言:javascript
复制
public class OrderProducer {

	private final RingBuffer<OrderEvent> ringBuffer;

	public OrderProducer(RingBuffer<OrderEvent> ringBuffer) {
		this.ringBuffer = ringBuffer;
	}

	private static final EventTranslatorOneArg<OrderEvent, OrderEvent> TRANSLATOR = new EventTranslatorOneArg<OrderEvent, OrderEvent>() {
		public void translateTo(OrderEvent event, long sequence, OrderEvent input) {
			BeanUtils.copyProperties(input,event);
		}
	};
 
	public void onData(OrderEvent input) {
		ringBuffer.publishEvent(TRANSLATOR, input);
	}
}

OrderEventFactory:

代码语言:javascript
复制
/**
 * 事件生成工厂(用来初始化预分配事件对象)
 * 创建者 kinbug
 */
public class OrderEventFactory implements EventFactory<OrderEvent>{

	@Override
	public OrderEvent newInstance() {
		// TODO Auto-generated method stub
		return new OrderEvent();
	}

}

MatchHandler :

代码语言:javascript
复制
/**
 * 撮合处理器
 * @author kinbug
 */
public class MatchHandler implements WorkHandler<OrderEvent> {
	
	@Override
	public void onEvent(OrderEvent event) throws Exception {
		// TODO Auto-generated method stub
		//处理你的撮合细节
	}

}

DepthInputHandler入订单的深度,和出订单的深度和MatchHandler类似;

除了高效队列之外,先还说了分布式热备份内存,这个方案就很多了,不过最好满足一下要求

  • 首先是能保证原子性操作数据
  • 其次在服务宕机是最好不要有master选举过程,不要有服务暂停的过程,用户体验很重要。
  • 保证数据的一致性,不能有数据的脏读、幻读,等数据库基本特效

我在这推荐一些基于RAFT实现的内存框架,仅供参考,有好的意见请留言。推荐如下:

  • Hazelcast    (JAVA)    
  • ETCD           (GO)
  • sofa-jraft     (JAVA)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 如何设计并实现一个数字货币交易系统     
    • DisruptorConfig:
      • OrderProducer:
        • MatchHandler :
        相关产品与服务
        区块链
        云链聚未来,协同无边界。腾讯云区块链作为中国领先的区块链服务平台和技术提供商,致力于构建技术、数据、价值、产业互联互通的区块链基础设施,引领区块链底层技术及行业应用创新,助力传统产业转型升级,推动实体经济与数字经济深度融合。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档