區塊鏈應用開發方案|數字貨幣交易所繫統開發(架構設計與原始碼演示)
數字貨幣是基於區塊鏈技術的最典型的應用。它可以作為一種 “資產”,實現貨幣屬性、證券屬性和投資屬性的組合。因此,必須有一套交易和升值 平臺 ——交易所就是這樣的 平臺 。
交易所平臺 技術架構主要考慮安全、分散式、易擴充套件、容錯、低延遲、高併發等特點,以及 熔斷 機制、服務註冊和發現、訊息服務、服務閘道器、安全認證、記憶體資料庫、關聯式資料庫等多種選擇,並最終形成以下技術選擇:
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 lpList 限價對手單佇列
* @param focusedOrder 交易訂單
*/
public void matchLimitPriceWithLPList(TreeMap<BigDecimal,MergeOrder> lpList, ExchangeOrder focusedOrder,boolean canEnterList){
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();
// 買入單需要匹配的價格不大於委託價,否則退出
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<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);
}
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70028290/viewspace-2944319/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 深圳數字區塊鏈交易所繫統軟體開發,數字貨幣交易所開發區塊鏈
- 數字貨幣交易所開發方案丨數字貨幣交易所繫統開發(正式版)丨數字貨幣交易所開發原始碼原始碼
- 數字貨幣交易所繫統開發技術原始碼丨區塊鏈去中心化交易所繫統開發(成熟技術)原始碼區塊鏈中心化
- 數字貨幣交易所開發(案例)丨數字貨幣交易所繫統開發(JAVA/PHP開發)及原始碼JavaPHP原始碼
- 數字貨幣交易所開發,區塊鏈底層應用平臺搭建方案區塊鏈
- 數字貨幣交易所繫統開發(海外版)丨數字貨幣交易所開發(原始碼版)原始碼
- 深圳數字貨幣交易系統原始碼開發,區塊鏈虛擬幣交易所搭建原始碼區塊鏈
- 區塊鏈交易所繫統開發方案區塊鏈
- 區塊鏈交易所繫統開發(海外版)丨區塊鏈交易所繫統開發(開發案例及原始碼)區塊鏈原始碼
- 區塊鏈數字貨幣交易所開發方案,OTC平臺搭建,支付系統開發區塊鏈
- 數字貨幣交易所繫統技術開發方案
- 數字貨幣交易所開發,區塊鏈軟體開發公司區塊鏈
- 數字貨幣交易所開發正式版丨數字貨幣交易所繫統開發(開發詳情)及案例原始碼原始碼
- 促進區塊鏈交易所繫統開發技術概念丨區塊鏈交易所原始碼系統開發部署方案區塊鏈原始碼
- 數字貨幣交易所開發詳情丨數字貨幣交易所繫統開發(詳細及邏輯)丨數字貨幣交易所原始碼原始碼
- 區塊鏈數字貨幣交易所開發原始碼,永續合約系統搭建app區塊鏈原始碼APP
- 數字貨幣交易所錢包系統開發(開發說明)丨數字貨幣錢包交易所繫統開發(原始碼詳細)原始碼
- 區塊鏈應用技術開發 區塊鏈數字資產交易所開發區塊鏈
- 上海區塊鏈系統開發/區塊鏈交易所繫統開發區塊鏈
- 數字貨幣交易系統開發、數字貨幣交易平臺開發、 虛擬數字貨幣交易平臺開發、區塊鏈數字貨幣交易系統開發區塊鏈
- 數字貨幣交易所開發(海外版)丨數字貨幣交易所繫統開發(swap交易所開發案例)
- 數字資產貨幣交易所繫統組成 | 數字資產貨幣交易所繫統開發解決方案
- 虛擬貨幣的交易系統開發解決方案 | 區塊鏈數字資產交易所繫統dapp搭建區塊鏈APP
- 區塊鏈幣幣撮合交易所開發數字資產法幣交易所開發區塊鏈
- 區塊鏈落地應用開發,區塊鏈幣幣撮合交易系統開發區塊鏈
- 區塊鏈交易所開發運營版丨區塊鏈交易所繫統開發(詳細案例)及邏輯方案丨原始碼區塊鏈原始碼
- 多幣種錢包系統開發,數字貨幣交易所繫統開發
- 區塊鏈(多鏈多幣種)錢包系統搭建開發應用(原始碼檢視演示)區塊鏈原始碼
- 現貨期權期貨數字貨幣秒合約交易所繫統開發(開發案例及原始碼)原始碼
- 數字資產交易所繫統開發_區塊鏈技術多幣種錢包定製開發區塊鏈
- 區塊鏈交易所開發方案整理(原始碼示例)區塊鏈原始碼
- 區塊鏈數字貨幣去中化交易所開發方案,合約平臺搭建區塊鏈
- 數字貨幣交易所繫統開發,去中化交易系統開發
- 區塊鏈投票系統開發方案,區塊鏈投票系統開發原始碼區塊鏈原始碼
- 數字貨幣swap去中心化博餅交易所繫統開發/(成熟原始碼)中心化原始碼
- 區塊鏈支付系統開發,數字貨幣支付多幣種錢包系統開發區塊鏈
- 數字貨幣交易所開發方案,場外幣幣交易平臺搭建原始碼原始碼
- 區塊鏈資產交易所開發區塊鏈應用系統研發區塊鏈