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