数字货币交易所平台架构解析 | 系统开发源码示例

357 阅读3分钟

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

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, 具有超高性能体现。

public void matchLimitPriceWithLPList(TreeMap<BigDecimal,MergeOrder> lpList, ExchangeOrder focusedOrder,boolean canEnterList){

List exchangeTrades = new ArrayList<>();

List 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 orderIterator = mergeOrder.iterator();

//

买入单需要匹配的价格不大于委托价,否则退出

if (focusedOrder.getDirection() == ExchangeOrderDirection.BUY && mergeOrder.getPrice().compareTo(focusedOrder.getPrice()) > 0) {

break;

}

//

卖出单需要匹配的价格不小于委托价,否则退出

if (focusedOrder.getDirection() == ExchangeOrderDirection.SELL && mergeOrder.getPrice().compareTo(focusedOrder.getPrice()) < 0) {

break;

}

while (orderIterator.hasNext()) {

ExchangeOrder matchOrder = orderIterator.next();

//

处理匹配

ExchangeTrade trade = processMatch(focusedOrder, matchOrder);

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.getTradedAmount().compareTo(focusedOrder.getAmount()) < 0 && canEnterList) {

addLimitPriceOrder(focusedOrder);

}

//

每个订单的匹配批量推送

handleExchangeTrade(exchangeTrades);

if(completedOrders.size() > 0){

orderCompleted(completedOrders);

TradePlate plate = focusedOrder.getDirection() == ExchangeOrderDirection.BUY ? sellTradePlate : buyTradePlate;

sendTradePlateMessage(plate);

}

}

/**

*

限价委托单与市价队列匹配

* @param mpList

市价对手单队列

* @param focusedOrder

交易订单

*/

public void matchLimitPriceWithMPList(LinkedList mpList,ExchangeOrder focusedOrder){

List exchangeTrades = new ArrayList<>();

List completedOrders = new ArrayList<>();

synchronized (mpList) {

Iterator 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 exchangeTrades = new ArrayList<>();

List 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 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);

}

}