数字货币是基于区块链技术的最典型的应用。它可以作为一种“资产”,实现货币属性、证券属性和投资属性的组合。因此,必须有一套交易和升值平台——交易所就是这样的平台。交易所平台技术架构主要考虑安全、分布式、易扩展、容错、低延迟、高并发等特点,以及熔断机制、服务注册和发现、消息服务、服务网关、安全认证、内
数字货币是基于区块链技术的最典型的应用。它可以作为一种“资产”,实现货币属性、证券属性和投资属性的组合。因此,必须有一套交易和升值平台——交易所就是这样的平台。
交易所平台技术架构主要考虑安全、分布式、易扩展、容错、低延迟、高并发等特点,以及熔断机制、服务注册和发现、消息服务、服务网关、安全认证、内存数据库、关系数据库等多种选择,并最终形成以下技术选择:
1、分布式基础进行架构SpringCloud与Dubbo之间二选一,由于SpringCloud更加知名,SpringCloud的程序员更好招聘,有利于系统的长期运维升级,而且SpringCloud是基于SpringBoot开发,比较有亲切感,所以选择了SpringCloud, 其实由于阿里系的强大影响,国内Dubbo使用更加广泛,不同的团队可以根据自己的情况选择。
2、引入Hystrix断路器作为容错保护模块,防止单个服务的故障,耗尽整个撮合系统容器的线程资源,避免分布式环境里大量级联失败。对通过第三方客户端访问依赖服务出现失败、拒绝、超时或短路时执行回退逻辑。
3、采用Eureka作为服务注册与发现中心,实现中间层服务,以达到负载均衡和中间层服务故障转移的目的。
4、服务网关Spring Cloud Gateway 与 Zuul 的选型,选择了Zuul,因为名字短一些。
5、引入SpringCloud Security安全认证模块用于构建安全的应用程序和服务,SpringCloud Security在Spring Boot和Spring Security OAuth2的基础上,可以快速创建和实现常见的安全认证方式,如单点登录,令牌中继和令牌交换等。
6、引入Redis作为内存数据库,兼做系统数据缓存和内存计算。
7、使用MySQL作为关系数据库,性能测试非常过关,而且对熟悉MYSQL的程序员非常友好。
8、消息队列中间件MQ采用了Kafka, 具有超高性能体现。
无论是股票交易系统,还是数字货币交易系统,都离不开撮合交易引擎,这是交易平台的心脏。同时,一个优秀的架构设计也会让交易平台的运维和持续开发更加容易。
关于撮合交易引擎 采用内存撮合的方式进行,以Kafka做撮合订单信息传输,MongoDB持久化订单成交明细,MySQL记录订单总体成交。其中行情模块主要负责订单成交持久化、行情生成、行情推送等服务,包括: K线数据,间隔分别为:1分钟、5分钟、15分钟、30分钟、1小时、1天、1周、1月 所有交易对的市场深度(market depth)数据 所有交易对的最新价格 最近成交的交易对 内存撮合交易支持的模式 限价订单与限价订单撮合 市价订单与限价订单撮合 限价订单与市价订单撮合 市价订单与市价订单撮合
数字货币交易所系统开发示例代码如下:
/**
* 限价委托单与市价队列匹配
* @param mpList 市价对手单队列
* @param focusedOrder 交易订单
*/
public void matchLimitPriceWithMPList(LinkedList<ExchangeOrder> mpList,ExchangeOrder focusedOrder){
List<ExchangeTrade> exchangeTrades = new ArrayList<>();
List<ExchangeOrder> completedOrders = new ArrayList<>();
synchronized (mpList) {
Iterator<ExchangeOrder> iterator = mpList.iterator();
while (iterator.hasNext()) {
ExchangeOrder matchOrder = iterator.next();
ExchangeTrade trade = processMatch(focusedOrder, matchOrder);
logger.info(">>>>>"+trade);
if(trade != null){
exchangeTrades.add(trade);
}
//判断匹配单是否完成,市价单amount为成交量
if(matchOrder.isCompleted()){
iterator.remove();
completedOrders.add(matchOrder);
}
//判断吃单是否完成,判断成交量是否完成
if (focusedOrder.isCompleted()) {
//交易完成
completedOrders.add(focusedOrder);
//退出循环
break;
}
}
}
//如果还没有交易完,订单压入列表中
if (focusedOrder.getTradedAmount().compareTo(focusedOrder.getAmount()) < 0) {
addLimitPriceOrder(focusedOrder);
}
//每个订单的匹配批量推送
handleExchangeTrade(exchangeTrades);
orderCompleted(completedOrders);
}
/**
* 市价委托单与限价对手单列表交易
* @param lpList 限价对手单列表
* @param focusedOrder 待交易订单
*/
public void matchMarketPriceWithLPList(TreeMap<BigDecimal,MergeOrder> lpList, ExchangeOrder focusedOrder){
List<ExchangeTrade> exchangeTrades = new ArrayList<>();
List<ExchangeOrder> completedOrders = new ArrayList<>();
synchronized (lpList) {
Iterator<Map.Entry<BigDecimal,MergeOrder>> mergeOrderIterator = lpList.entrySet().iterator();
boolean exitLoop = false;
while (!exitLoop && mergeOrderIterator.hasNext()) {
Map.Entry<BigDecimal,MergeOrder> entry = mergeOrderIterator.next();
MergeOrder mergeOrder = entry.getValue();
Iterator<ExchangeOrder> orderIterator = mergeOrder.iterator();
while (orderIterator.hasNext()) {
ExchangeOrder matchOrder = orderIterator.next();
//处理匹配
ExchangeTrade trade = processMatch(focusedOrder, matchOrder);
if (trade != null) {
exchangeTrades.add(trade);
}
//判断匹配单是否完成
if (matchOrder.isCompleted()) {
//当前匹配的订单完成交易,删除该订单
orderIterator.remove();
completedOrders.add(matchOrder);
}
//判断焦点订单是否完成
if (focusedOrder.isCompleted()) {
completedOrders.add(focusedOrder);
//退出循环
exitLoop = true;
break;
}
}
if(mergeOrder.size() == 0){
mergeOrderIterator.remove();
}
}
}
//如果还没有交易完,订单压入列表中,市价买单按成交量算
if (focusedOrder.getDirection() == ExchangeOrderDirection.SELL&&focusedOrder.getTradedAmount().compareTo(focusedOrder.getAmount()) < 0
|| focusedOrder.getDirection() == ExchangeOrderDirection.BUY&& focusedOrder.getTurnover().compareTo(focusedOrder.getAmount()) < 0) {
addMarketPriceOrder(focusedOrder);
}
//每个订单的匹配批量推送
handleExchangeTrade(exchangeTrades);
if(completedOrders.size() > 0){
orderCompleted(completedOrders);
TradePlate plate = focusedOrder.getDirection() == ExchangeOrderDirection.BUY ? sellTradePlate : buyTradePlate;
sendTradePlateMessage(plate);
}
}
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!