数字货币交易所系统开发实现流程

数字货币是基于区块链技术的最典型的应用。它可以作为一种“资产”,实现货币属性、证券属性和投资属性的组合。因此,必须有一套交易和升值平台——交易所就是这样的平台。交易所平台技术架构主要考虑安全、分布式、易扩展、容错、低延迟、高并发等特点,以及熔断机制、服务注册和发现、消息服务、服务网关、安全认证、内

数字货币是基于区块链技术的最典型的应用。它可以作为一种“资产”,实现货币属性、证券属性和投资属性的组合。因此,必须有一套交易和升值平台——交易所就是这样的平台。

交易所平台技术架构主要考虑安全、分布式、易扩展、容错、低延迟、高并发等特点,以及熔断机制、服务注册和发现、消息服务、服务网关、安全认证、内存数据库、关系数据库等多种选择,并最终形成以下技术选择:

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);
    }
}
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
V/TG[CH3NGUANG]
V/TG[CH3NGUANG]
江湖只有他的大名,没有他的介绍。