我怎么感觉在StackExchange, StackOverflow发帖比国内社区要好一些…
分析一波股票交易所等实时交易系统的撮合与数据持久化方案。
1. 由于要求极致的最小延迟(ns纳秒级),所以只能在内存里存储订单来处理,达到CPU最快处理大规模数据的效果。
数据结构:红黑树,维护最小值。两颗,一个买(取负数),一个卖。这时撮合取第一个即可,因为类似最小堆(同优先队列),O(1)遍历,而插入删除操作由于特性O(logn)复杂度,在大数据量下也不慌。
2. 对于数据持久化,首先订单来了以后异步发给消息队列慢慢插入redis或数据库留作全量备份。撮合完毕后再发给消息队列继续慢慢更新之前插入的数,或者只是插入撮合后的结果订单数
( 这个是实际用得着的数据,故障恢复时优先从redis里这个Order Book订单簿恢复实时状态)
举例子:优先队列,kafka异步插入撮合结果。而内存中撮合完立刻就有数据了,可以通过本机api直接低延迟更新行情状态。保证价格以最快速度更新出来。
// 内存中的订单处理和撮合示例
public class OrderMatchingEngine {
private final ConcurrentMap<String, Order> orders = new ConcurrentHashMap<>();
private final PriorityQueue<Order> buyOrders = new PriorityQueue<>(Comparator.comparingDouble(Order::getPrice).reversed());
private final PriorityQueue<Order> sellOrders = new PriorityQueue<>(Comparator.comparingDouble(Order::getPrice));
public void receiveOrder(Order order) {
orders.put(order.getId(), order);
if (order.isBuy()) {
buyOrders.offer(order);
} else {
sellOrders.offer(order);
}
matchOrders();
}
private void matchOrders() {
while (!buyOrders.isEmpty() && !sellOrders.isEmpty()) {
Order buyOrder = buyOrders.peek();
Order sellOrder = sellOrders.peek();
if (buyOrder.getPrice() >= sellOrder.getPrice()) {
// 撮合成功,更新订单状态
orders.remove(buyOrder.getId());
orders.remove(sellOrder.getId());
buyOrders.poll();
sellOrders.poll();
// 更新撮合结果到异步队列
asyncPersistMatchResult(buyOrder, sellOrder);
} else {
break;
}
}
}
private void asyncPersistMatchResult(Order buyOrder, Order sellOrder) {
// 将撮合结果异步写入Redis和数据库
// 例如,使用Kafka将撮合结果发送到持久化服务
kafkaProducer.send(new ProducerRecord<>("matchResults", new MatchResult(buyOrder, sellOrder)));
}
}
不知道有没有哪里写的不对的。可能也不是这个方案
是的,交易所和拍卖会确实有一些相似之处,主要在于它们都是买卖双方进行交易的场所。不过,交易所的交易通常是通过标准化的合约和规则进行的,而拍卖会则更多依赖于现场竞价的形式。
在IT化以前,历史上的交易所主要通过以下方式撮合成交:
-
公开喊价(Open Outcry):这是最早期也是最经典的交易方式,交易员们聚集在交易大厅中,通过大声喊价和手势来进行买卖。这种方式在股票、期货和商品交易所中都很常见。交易员们会站在指定的区域(通常称为“交易池”或“交易圈”),根据市场情况喊出买价和卖价,直到找到匹配的交易对手。
-
经纪人撮合:在一些交易所,买卖双方会通过经纪人进行交易。经纪人会接受客户的买卖指令,然后在交易大厅中寻找合适的交易对手。经纪人之间会进行沟通和协商,以达成交易。
-
电话交易:在某些情况下,特别是对于大宗商品交易,交易员会通过电话与其他交易员或经纪人联系,达成交易。这种方式在交易所的开放时间之外特别常见。
-
纸质订单:在交易所的早期,交易指令通常是以纸质形式提交的。买卖双方或其经纪人会填写订单单,然后将其交给交易所的工作人员,后者会在交易大厅中寻找匹配的交易对手。
-
交易板和黑板:在一些交易所,特别是商品交易所,价格和交易信息会被写在黑板上,交易员们会通过观察黑板上的信息来进行交易。这种方式在信息传递速度较慢的时代非常重要。
这些传统的交易方式虽然效率较低,但在当时的技术条件下已经是最有效的方式。随着计算机技术和网络技术的发展,现代交易所逐渐实现了电子化和自动化,大大提高了交易效率和透明度。