交易所核心模块
数字钱包:业务流程通常是充值->提现->归集,不一样的主链,实现方式不同(上链规则与接口)。前端
撮合服务web
交易所撮合引擎工做原理及代码redis
一、订单服务
订单服务(Order Service)包含了负责匹配委托单并生成市场数据的撮合引擎(matching engine)。 在加密货币交易所中,委托单按交易对进行撮合匹配,所以一个ETH/BTC的买单永远不会匹配到一个 ETH/USDT的卖单。一般认为每个交易对的订单匹配是依次进行的,例如,撮合进程必须是 单线程的(每一个交易对一个线程)。不过实际上仍是有办法让这个流程中的某些环节实现 并行化以便提升系统的吞吐量。订单处理过程包括如下步骤:
区块链交易所开发-交易所开发-交易所软件-交易所应用-交易所安全
订单验证。这包括确认交易对处于可交易状态、校验订单的价格与数量等符合最低要求等等。
资金检查。目的是确保用户的帐户中有足额资金用于下单。
风险检查,以免异常的交易行为
肯定该委托单的挂单(Maker)费率和吃单(Taker)费率,所依据的规则可能设计交易对、订单数量、用户等级等等。
建立用于撮合处理的订单对象,冻结下单用户帐户中可能会用到的最大数量的资金。
在交易委托帐本中匹配该新订单,匹配的结果多是:无匹配、部分红交或所有成交。当 部分红交或所有成交时,可能在交易委托帐本中存在一个或多个匹配的订单。
更新并持久化成交订单用户的帐户余额,更新交易委托帐本。
持久化由订单撮合成功而触发的其余数据,例如:订单执行记录、资金交易日志等等。算法
二、作市服务
作市(Market making)对于加密货币交易所 —— 尤为是对于一个新创办的 加密交易所 —— 的成功相当重要。若是交易所没有足够的交易人,那么买卖价差(bid-ask spread) 一般要大于那些具备较好流动性的加密货币交易所。作市商(Market maker)为交易所增长了流动性, 缩小了买卖价差,同时也为交易委托帐本增长了深度,这些因素同时也会更加吸引交易人的加入。spring
三、用户服务
用户服务是一个用Akka和spring框架开发的独立应用,它为前台服务器提供用户相关的服务,例如 用户注册、用户身份验证、KYC提交、密码管理、API密钥管理、充值地址管理等等。数据库
当用户服务实例启动时,它会加入Akka集群,前台服务节点将会自动发现用户服务。咱们能够在集群中 启动多个用户服务节点。在这种状况下,前台服务器以轮询调度方式(round robin)将消息发送给全部 的存活用户服务节点,从而保证了用户服务模块的可扩展性及高可用性。缓存
四、钱包服务
与逻辑架构图中的其余模块不一样,钱包服务不是一个单一的独立应用,而是由多个应用组成。这主要 是基于安全方面的考虑。做为一个整理,钱包服务:安全
为用户帐户生成新的区块链地址以用于接收充值
管理交易所持有的热钱包地址私钥
建立提币交易,签名并提交到区块链网络
链接到多个区块链网络,搜索处理充值交易,跟踪提币交易的执行状态
在某些状况下,归集散落在众多用户地址中的加密货币到交易所的中心热/冷钱包。服务器
五、Maria DB及ETL
在核心站点中包含一个Maria DB Galera集群。集群中的主(Master)数据库实例由应用直接使用,同时在集群中 建立了两级从(Slave)数据库:网络
一个从集群中直接复制的数据库是复制中转库(replication staging database)。它做为边缘站点中的主库 提供服务。当从核心数据库集群中复制时,它会过滤掉前台服务和web服务不使用的数据表,这能够避免泄漏 敏感数据,同时减小了须要复制到边缘站点的数据量。
另外一个直接从集群中复制的数据库是报表库实例。在这个MariaDB从库实例上建立有两个库,一个用于从核心 集群中复制,另外一个服务于管理服务器的报表功能。咱们使用多维数据模型,而且在报表数据库中实现分析报表 的生成。新的数据每一个几秒钟就从复制库中抽取、转换并载入,以便保证管理服务器的数据时效。
六、REdis
核心站点中的Redis用于保存订单服务生成的市场数据,并经过复制机制推送到前端站点。咱们以前在Part 2 中已经详细介绍了redis的复制机制。
七、管理服务器和ETL
管理服务器是一个J2EE web应用,使用spring框架和spring mvc开发。Tomcat做为管理服务模块的应用服务器。 Nginx置于Tomcat以前以启用HTTPS以及内容缓存。
管理服务器为交易所内部员工提供后台管理系统。采用基于角色的权限分配机制,用户能够分配不一样的角色, 而不一样的角色则能够访问系统中的不一样功能。管理服务器能够对每一个用户的每一个操做都生成审计日志。【.本文由qkljys123整理发布.】