证券交易系统是金融市场上能够提供的最有流动性,效率最高的交易场所。和传统的商品交易不同的是,证券交易系统提供的买卖标的物是标准的数字化资产,如USD、股票、BTC等,它们的特点是数字计价,可分割买卖。
证券交易系统通过买卖双方各自的报价,按照价格优先、时间优先的顺序,对买卖双方进行撮合,实现每秒成千上万的交易量,可以为市场提供高度的流动性和价格发现机制。
一个完整的数字货币交易系统是由用户系统(sso)、账户系统(account)、订单系统(order)、撮合系统(match)、以及清算系统( clearing )、行情系统(market)和钱包系统(wallet)构成的。各个子系统相互配合,完成数字货币报价交易。
当然如果是自己的做的钱包,那么你可能还需要节点扫描上账系统,和离线签名系统(冷钱包),之前也看见过一些朋友说定序系统,我提供的方案是用mq队列的放手,先进先出。
说说核心代码,disruptor高性能环形队列无锁特性,使它成为交易所撮合引擎的核心技术,再加上分布式热备份内存技术,就基本上可以实现一个不错的撮合引擎了先看看disruptor:
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);
}
}
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:
/**
* 事件生成工厂(用来初始化预分配事件对象)
* 创建者 kinbug
*/
public class OrderEventFactory implements EventFactory<OrderEvent>{
@Override
public OrderEvent newInstance() {
// TODO Auto-generated method stub
return new OrderEvent();
}
}
/**
* 撮合处理器
* @author kinbug
*/
public class MatchHandler implements WorkHandler<OrderEvent> {
@Override
public void onEvent(OrderEvent event) throws Exception {
// TODO Auto-generated method stub
//处理你的撮合细节
}
}
DepthInputHandler入订单的深度,和出订单的深度和MatchHandler类似;
除了高效队列之外,先还说了分布式热备份内存,这个方案就很多了,不过最好满足一下要求
我在这推荐一些基于RAFT实现的内存框架,仅供参考,有好的意见请留言。推荐如下: