coinex // 撮合引擎 逻辑流程 (两种数据源 初始化源和前端源)
目录
1 生产者 数据源
1.1. match-server 一启动 初始化数据 自动查询数据库 查询level2要展示的数据
1.2 match-server接收 前端发给Exchange-server的数据
2. 将查询/接受的数据EntrustOrder 转成 Order 解耦 过滤掉不要的属性
3.Order转成 OrderEvent
4. 分配序号发布数据到ringbuffer,管理序号和栅栏(前提是ringbuffer构建好了)
5 分配序号 发布数据到ringbuffer
5.1. 初始化数据源实现的代码 循环每一条数据转换 分配序号 发布数据到ringbuffer
5.2 前端数据源
1 生产者 数据源
1.1 match-server 一启动 初始化数据 自动查询数据库 查询level2要展示的数据
List<EntrustOrder> entrustOrders = entrustOrderMapper.selectList(new LambdaQueryWrapper<EntrustOrder>().eq(EntrustOrder::getStatus, 0).orderByAsc(EntrustOrder::getCreated)
1.2 match-server接收 前端发给Exchange-server的数据
@StreamListener("order_in") // "order_in" 在 Sink中public void handleMessage(EntrustOrder entrustOrder) { // 消息监听}
2. 将查询/接受的数据EntrustOrder 转成 Order 解耦 过滤掉不要的属性
public static Order entrustOrder2Order(EntrustOrder entrustOrder) {Order order = new Order();order.setOrderId(entrustOrder.getId().toString());order.setPrice(entrustOrder.getPrice());order.setAmount(entrustOrder.getVolume().subtract(entrustOrder.getDeal())); // 交易的数量= 总数量- 已经成交的数量order.setSymbol(entrustOrder.getSymbol());order.setOrderDirection(OrderDirection.getOrderDirection(entrustOrder.getType().intValue())); // 交易sideorder.setTime(entrustOrder.getCreated().getTime());return order ;}
3.Order转成 OrderEvent
// 使用事件转换器的好处,1环形队列获取序号, 2拿到事件填充数据, 3再发布序号 省了从2给 事件填充数据 private static final EventTranslatorOneArg<OrderEvent, Order> TRANSLATOR = new EventTranslatorOneArg<OrderEvent, Order>() { // Order 转化成 OrderEvent// 现在上面实例化 然后 在下面 实现/*** Translate a data representation into fields set in given event 将数据表示转换为给定事件中设置的字段* Params:参数* event* into which the data should be translated. 要转成什么data* sequence 序列* that is assigned to event. 分配给事件的序列。* arg0* The first user specified argument to the translator 转换器的第一个用户指定参数*/public void translateTo(OrderEvent event, long sequence, Order input) {event.setSource(input);} // setSource 是 source的 set方法};
4. 分配序号发布数据到ringbuffer,管理序号和栅栏(前提是ringbuffer构建好了)
/*** 我们使用DisruptorTemplate 时,就使用它的onData方法* @param input** public <A> void publishEvent(EventTranslatorOneArg<E, A> translator, A arg0)* {* final long sequence = sequencer.next();* translateAndPublish(translator, sequence, arg0);* }* private <A> void translateAndPublish(EventTranslatorOneArg<E, A> translator, long sequence, A arg0)* {* try* {* translator.translateTo(get(sequence), sequence, arg0);* }* finally* {* sequencer.publish(sequence);* }* }** void publish(long sequence);**/public void onData(Order input) {ringBuffer.publishEvent(TRANSLATOR, input); // 这个就是分配序号 然后发布数据到ringbuffer}
5 分配序号 发布数据到ringbuffer
5.1. 初始化数据源 从数据查询数据 循环每一条数据转换 分配序号 发布数据到ringbuffer
for (EntrustOrder entrustOrder : entrustOrders) {disruptorTemplate.onData(BeanUtils.entrustOrder2Order(entrustOrder)); // 往ringbuffer 中放 // BeanUtils.entrustOrder2Order 数据转换} // BeanUtils.entrustOrder2Order(entrustOrder) 是数据转换 就是从entrustOrder 筛选出 Order 需要的属性数据

5.2 前端数据源 高频多生产者 每次一条数据
exchange-service 发送消息到match
disruptorTemplate.onData(BeanUtils.entrustOrder2Order(entrustOrder));
6 disruptorTemplate.onData 源码
onData
public void onData(Order input) {ringBuffer.publishEvent(TRANSLATOR, input); // 这个就是分配序号 然后发布数据到ringbuffer}
TRANSLATOR
// 先用 EventTranslatorOneArg方法做了个 TRANSLATOR 再调用publishEvent方法
private static final EventTranslatorOneArg<OrderEvent, Order> TRANSLATOR = new EventTranslatorOneArg<OrderEvent, Order>() { // Order 转化成 OrderEventpublic void translateTo(OrderEvent event, long sequence, Order input) {event.setSource(input);} // setSource 是 source的 set方法};
publishEvent
@Overridepublic <A> void publishEvent(EventTranslatorOneArg<E, A> translator, A arg0){final long sequence = sequencer.next(); // 单生成者就是 但生产者中得next算法 1:43:28 // https://www.bilibili.com/video/BV1zM4y1L7Q9/?spm_id_from=333.337.search-card.all.click&vd_source=ff8b7f852278821525f11666b36f180atranslateAndPublish(translator, sequence, arg0);}
translateAndPublish
private <A> void translateAndPublish(EventTranslatorOneArg<E, A> translator, long sequence, A arg0){try{translator.translateTo(get(sequence), sequence, arg0);}finally{sequencer.publish(sequence);}}
EventTranslatorOneArg
public interface EventTranslatorOneArg<T, A>
{/*** Translate a data representation into fields set in given event** @param event into which the data should be translated.* @param sequence that is assigned to event.* @param arg0 The first user specified argument to the translator*/void translateTo(T event, long sequence, A arg0);
}
translateTo 自定义 还是调用?
private static final EventTranslatorOneArg<OrderEvent, Order> TRANSLATOR = new EventTranslatorOneArg<OrderEvent, Order>() { // Order 转化成 OrderEventpublic void translateTo(OrderEvent event, long sequence, Order input) {event.setSource(input);} // setSource 是 source的 set方法};
Sequencer
public interface Sequencer extends Cursored, Sequenced
{
}
Sequenced ->publish
public interface Sequenced
{/*** Publishes a sequence. Call when the event has been filled.** @param sequence the sequence to be published.*/void publish(long sequence); // 操作: publish 序号
}
相关文章:
coinex // 撮合引擎 逻辑流程 (两种数据源 初始化源和前端源)
目录 1 生产者 数据源 1.1. match-server 一启动 初始化数据 自动查询数据库 查询level2要展示的数据 1.2 match-server接收 前端发给Exchange-server的数据 2. 将查询/接受的数据EntrustOrder 转成 Order 解耦 过滤掉不要的属性 3.Order转成 OrderEvent 4. 分配序号发布…...
CentOS7---部署LNMP数据存储到redis
一、部署LNMP及redis 1、部署LNMP,需要将 tengine-2.2.0.tar.gz 拷贝到虚拟机的 /root 目录下 步骤一:安装nginx 源码安装相关软件包 # pcre-devel做正则匹配,zlib-devel做数据压缩 [roottemplate ~]# yum -y install gcc pcre-devel zlib-de…...
Linux中的git命令行
Linux中的git命令行 目录 Linux中的git命令行引入1、Linux下的git工具起源2、gitee的使用.gitignore.git 3、git三板斧3.1 git add3.2 git commit3.3 git push 4、git操作4.1 查看提交日志4.2 查看状态4.3 远端同步4.4 删除文件4.5 修改文件名 引入 当多个开发者同时参与同一个…...
【C++】哈希表:开散列和闭散列
📝 个人主页 :超人不会飞)📑 本文收录专栏:《C的修行之路》💭 如果本文对您有帮助,不妨点赞、收藏、关注支持博主,我们一起进步,共同成长! 目录 前言一、基于哈希表的两个…...
C技能树:Hello World
Hello World 输出 "Hello, World!" 字符串,请选出错误答案。 小知识:Hello World究竟从何而来? Hello, World最早是由 Brian Kernighan 创建的。1978年,Brian Kernighan写了一本名叫《C程序设计语言》的编程书,在程…...
TryHackMe-Set(Windows渗透测试 | WinDefender免杀)
Set 您再次发现自己在Windcorp公司的内部网络上。上次你去那里的味道真好,你回来了 了解更多。 但是,这次他们设法保护了域控制器,因此您需要找到另一台服务器,并在第一次扫描时发现“Set”。 Set被用作开发人员的平台…...
信安大佬真的用kali吗?
Kali只是现在网络安全和kali比较火的一个操作系统 下面我为大家讲讲kali系统都有那些优点 Kali介绍Kali Linux是基于Debian的Linux发行版, 设计用于数字取证操作系统。面向专业的渗透测试和安全审计。 集成化:预装超过300个渗透测试工具兼容好&#x…...
禁用表单元素:Layui框架下的实践与技巧
引言 在日常的网页开发过程中,有时我们需要禁用表单元素,以防止用户在某些情况下进行输入或更改。在本文中,我们将介绍如何在Layui框架下使用JavaScript禁用表单元素,例如单选按钮(radio)、下拉列表&#…...
spring boot 访问HTML
HTML整合spring boot 简介默认文件路径访问自定义文件路径访问 或通过Controller控制器层跳转访问 简介 SpringBoot默认的页面映射路径(即模板文件存放的位置)为“classpath:/templates/*.html”。静态文件路径为“classpath:/static/”,其中…...
WPF教程(四)--Dispatcher
一、Dispatcher介绍 微软在WPF引入了Dispatcher,那么这个Dispatcher的主要作用是什么呢? 不管是WinForm应用程序还是WPF应用程序,实际上都是一个进程,一个进程可以包含多个线程,其中有一个是主线程,其余的是…...
ijkplayer 编译增加支持更多的音视频格式
ijkplayer是B站开源的一款基于ffmpeg的移动端播放器。但为了减少播放器的体积,很多音视频的格式播放默认都是不支持的,需要自己下载ijkplayer源码进行编译。这里以mac环境下android为例,简述ijkplayer的编译过程,以及为了支持更多…...
TOP命令显示完整命令行信息
TOP 在Linux系统中,可以使用top命令来查看系统的实时性能数据,包括CPU使用率、内存使用率、进程信息等。以下是top命令的常用选项: -d seconds:指定top命令的刷新时间,单位为秒。 -u username:只显示指定…...
Spring6从入门到精通 第一章 带你玩转Spring
这里写目录标题 一 Spring框架产生的原因二 Spring6配置的关键环节 一 Spring框架产生的原因 传统的JavaWeb存在着耦合度较高的问题,而且实现完整的的MVC三层架构,开发成本过大,因此出现了Spring这个轻量级的开发框架,相当于建筑里…...
Apache POI 实现用Java操作Excel完成读写操作
简介 Apache POI是一个用于操作Microsoft Office格式文件(包括xls、docx、xlsx、pptx等)的Java API库。POI全称为Poor Obfuscation Implementation,是Apache Software Foundation的一个开源项目。它提供了一组Java API,使得Java程…...
改善供应商关系的八种方法
与供应商保持良好关系的重要性有很多原因。最重要的是,它使每个人的日常工作更加愉快。它还可以为你获得更好的交易,有助于协作并增强商誉。 但是,每个供应商都是不同的,建立牢固的关系可能很棘手。本文将解释企业如何建立并操持…...
网络安全-CDN绕过寻找真实IP
网络安全-CDN绕过寻找真实IP CDN就是CDN加速,就是根据你的目标让你访问的更快 CDN CDN,即内容分发网络,主要解决因传输距离和不同运营商节点造成的网络速度性能低下的问题。说得简单点,就是一组在不同运营商之间的对接节点上的…...
牛客网 HJ28 素数伴侣【二分图匹配,匈牙利算法】困难
描述 若两个正整数的和为素数,则这两个正整数称之为“素数伴侣”,如2和5、6和13,它们能应用于通信加密。现在密码学会请你设计一个程序,从已有的 N ( N 为偶数)个正整数中挑选出若干对组成“素数伴侣”&am…...
带你畅玩ChatGPT
ChatGPT出来很久了,最近不少朋友还是不太会使用ChatGPT体验与机器人进行聊天,我正好发现有种非常简单的方式帮助大家体验ChatGPT,且响应速度非常快,写代码能力也不错,现在推荐给大家,希望对大家有所帮助。 目录 一、下载专用浏览器 1.1 下载链接 1.2 安装浏览器 二、…...
ChatGPT探索系列之六:思考ChatGPT的未来发展趋势和挑战
文章目录 前言一、未来发展趋势1. ChatGPT重塑数据分析之道2. ChatGPT颠覆企业运用人工智能和机器学习的途径3. ChatGPT颠覆自动化商业流程4. ChatGPT引领企业决策迈向新纪元 二、ChatGPT掀开未来充满机遇和挑战的新篇章总结 前言 ChatGPT发展到目前,其实网上已经有…...
TryHackMe-Year of the Fox(Linux渗透测试)
Year of the Fox 你能熬过狡猾的狐狸吗? 端口扫描 循例nmap 有个域名,加入hosts SMB枚举 smbmap enum4linux -a,枚举到两个账户 Web枚举 进80发现需要登录 上hydra RCE to Getshell 进来可以查看一些文件 bp发现这里存在过滤 burpfuzz一…...
终极Windows Defender移除指南:13项核心服务的完整卸载方案
终极Windows Defender移除指南:13项核心服务的完整卸载方案 【免费下载链接】windows-defender-remover A tool which is uses to remove Windows Defender in Windows 8.x, Windows 10 (every version) and Windows 11. 项目地址: https://gitcode.com/gh_mirror…...
城通网盘高速解析终极指南:如何免费实现40倍下载提速
城通网盘高速解析终极指南:如何免费实现40倍下载提速 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet 你是否厌倦了城通网盘那令人抓狂的蜗牛下载速度?每次下载大文件都要面对漫长…...
Google Labs Jules Awesome List:构建与维护高质量开发者资源清单指南
1. 项目概述:一份面向开发者的“Awesome List”清单在开源社区和开发者圈子里,有一个约定俗成的传统:当某个技术领域或工具生态变得足够庞大和复杂时,总会有热心的贡献者站出来,整理一份名为“Awesome List”的清单。这…...
Rulebook-AI:用规则引擎为AI智能体构建可控决策框架
1. 项目概述:一个基于规则的AI智能体框架最近在探索如何让AI智能体(Agent)的行为更可控、更符合业务逻辑时,我遇到了一个挺有意思的开源项目:botingw/rulebook-ai。乍一看这个名字,可能会觉得它又是一个试图…...
VT.ai:开发者AI工具集实战指南,提升编码效率与调试体验
1. 项目概述:一个面向开发者的AI工具集最近在GitHub上看到一个挺有意思的项目,叫“vinhnx/VT.ai”。乍一看这个标题,可能有点摸不着头脑,但点进去研究一番,你会发现这其实是一个开发者为自己、也为社区打造的一个AI工具…...
【最新v2.7.1 版本安装包】OpenClaw 小白入门必看,零基础无需命令零代码保姆级教学
OpenClaw v2.7.1 一键安装部署教程|可视化傻瓜式搭建 ✨适配系统:Windows10/11 64 位 ✨当前版本:v2.7.1 版本(虾壳云版) ✨安装包大小:58.7MB 【点击下载最新安装包】https://xiake.yun/api/download/…...
CircuitPython REPL与库管理:嵌入式开发的效率利器
1. CircuitPython REPL:你的嵌入式开发“瑞士军刀” 如果你玩过Arduino,肯定对“上传-编译-看结果”这个循环不陌生。每次改一行代码,都得重新编译、上传,然后盯着串口看输出,效率低得让人抓狂。CircuitPython带来的R…...
AI Agent无障碍审查:自动化集成WCAG标准与axe-core实践
1. 项目概述:一个为AI助手打造的“无障碍”审查官最近在折腾AI应用开发,特别是那些能自动处理任务的智能体(AI Agent),发现一个挺有意思但容易被忽略的问题:我们费尽心思让AI能写代码、分析数据、生成报告&…...
VS Code Live Server完全指南:告别手动刷新,拥抱实时开发新时代
VS Code Live Server完全指南:告别手动刷新,拥抱实时开发新时代 【免费下载链接】vscode-live-server Launch a development local Server with live reload feature for static & dynamic pages. 项目地址: https://gitcode.com/gh_mirrors/vs/vs…...
ubantu安装vscode
在火狐浏览器中搜索vscode官网,找到.deb文件下载,下载完成后文件所在的位置为 主文件夹/下载 文件夹内。...
