clickhouse在MES中的应用-跟踪扫描

news2024/11/14 13:45:57

        开发的MES,往往都要做生产执行跟踪扫描,这样会产生大量的扫描数据,用关系型数据库,很容易造成查询冲突的问题。

        生产跟踪扫描就发生的密度是非常高的,每个零部件的加工过程,都要被记录下来,特别是在大型工厂。写入密度高,但是每次写入的记录都很少,如果程序设计是实时往数据库写入记录,那基本是每次一条记录,且写入的频率很高,导致表锁时常发生,对查询扫描日志会带来很大的压力。

        解决跟踪扫描的问题,最好的办法还是用缓存(Redis),而且要共享缓存,就是不同用户使用同一个缓存空间,防止相同的零部件扫描时候,不会出现相互冲突。实际生产过程中,扫描冲突是不应该发生的,但是偏偏就是会发生,例如操作员后补扫描。程序发起扫描请求时候,先去查询缓存是否存在扫描记录,如果有,则根据缓存中的数据进行扫描校验,例如是否存在扫描的编号、重复扫描、扫描次数限制等;如果缓存中没有数据,则表明零部件从来没有被扫描过,则从数据库中加载基础信息,例如零部件的信息、工序的信息、工作中心的信息等,然后这些信息也放到缓存中,基础信息不能存放太久,一般扫描也就毫秒级完成,算1秒吧,可以设置缓存超时清除,我这里是设置10分钟的绝对超时,10分钟后重新从数据库加载基础数据。

        扫描数据一直保存在缓存中,根据生产周期,也可以设定一个延期超时,例如90天,每访问一次,就重置超时时间。扫描记录,可以全部存放到内存缓存中(MemoryCache),用一个定时器往数据库中写入扫描记录,不管扫描是否成功,日志都要写入数据库保存。如果出现数据库事务冲突或者超时,则后续继续往数据库中写入,直到写入成功后,才从内存缓存中移除扫描数据。

        一般来说,程序设计查询扫描记录,从缓存中查询即可,数据结构采用Hash保存:

        Key:                Scan_零部件编号,注意,部件编号这里是全局唯一

        HashKey        工序编号

        Value                扫描数据json        [ {'scanTime':'2024-01-01','operator':'001'}]

        因为同一个工序,可能需要扫描2次或者以上的,所以value的设计是个集合

当查询的时候,只需要把key的所有数据一次性读取出来丢去前端即可,完全不需要查询数据库。不管是写入还是读取,都比数据库快很多,代码也很简洁。当然,之类最好把操作缓存的功能封装成一个工具类,毕竟设计到内存缓存和Redis。

        在常规的需求中,以上功能已经完全满足日常生产需求,但是,如果超过了90天后,扫描缓存被清除了呢?那么,就需要在数据库中查询组织数据,并重新写入到缓存中。那么,使用clickhouse查询,那是完全优于使用关系数据库,例如oracle、sqlserver、mysql、postgresql。不仅仅是构造扫描缓存,可能还要做一些分析,这里只是用最简单的一个查询来说明clickhouse和关系数据库之间的一些差异。

        第一,要把数据同步到clickhouse。前边也已经踩坑了,系统使用的mssql,开发语言是C#,研究了很久,没有现成的方案同步,或者说,还没弄明白。本来打算flink-cdc同步数据,结果弄出一堆问题来,还是没搞通,所以,这个事暂时耽搁下来,自己写了一个cdc的同步工具,也就2天时间,够用就好了,凑合着,后续再研究flink。flink官方没有现成的clickhouse-sink,哪位大神指点一二!

        第二,涉及到的查询关键字。用到的关键字做一个简单的说明:

        limit n by exp       

        根据字段取第n条记录,这个关键字不能和distinct同时使用,只取其一。例如扫描记录出现重复的扫描日志,要取最后一次,这样需要配合order by才能实现。limit在clickhouse中,不仅仅用于分页,例如记录中出现(key,value)= {a,1},{a,2},order by value limit 1 by key,则会得到{a,1},第二条记录会被过滤掉。

        first_value(exp1) over(partition by exp2 order by exp3)

        根据字段exp2分组,exp3的顺序,取第一条记录exp1的值。例如扫描记录有5个步骤,取第一个步骤的工序编号 first_value(processid) over(partition by partId order by scanTime)

        groupArray(exp1) over(partition by exp2 order by exp3 Rows BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)

        加载分组中字段后的exp1字段的所有值,例如部件扫描了5个工序,这个查询构造出一个列表字段,返回扫描的所有工序编号 {001,002,003,004,005},同理,用相同的方法把扫描时间也查出来,放到另外一个字段,顺序是一样的

        上述关键字,会对查询条件有限制的,出现在where中的字段,必须在select中出现,类似group by的要求,这个好办,最一个子查询就可以解决了:

        with tb as (select ... from ... where ...)

        select * from tb

这样就完全规避了查询限制

上个例子,一般的关系数据库是很难实现这样的分组查询,当然,用后端代码也能构造出这样的结构,就另说了。

在mes中,有很多复杂的查询,生产库使用mssql,查询库使用clickhouse,实现了读写分离。mssql通过cdc与clickhouse同步,开发的cdc同步组件,同时支持rabbitmq,可以把变更数据通过rabbitmq分发出去,让其他应用做实时数据统计和分析。

clickhouse驱动在开发语言中还是很丰富的,我使用的是clickhouse.client,在nuget中直接安装即可,使用起来和ado差不多,git中有比较完整的文档。这里报告一个bug,执行executeNonQuery返回整数时候,无论是否成功,都返回0,这个就很蛋疼了!

        一开始的时候,读写分离用的是ssis同步到另外一台mssql,虽然这样很方便,但是也有不方便的时候,例如要修改目标数据库的内容,会导致ssis同步报错,关键是,当数据量上亿的时候,再怎么优化也很慢,占用的磁盘空间也大,clickhouse经过压缩后,压缩比例普遍在15~25%左右,可以节约大量的磁盘空间。只要设置好表的分区分片,性能那是杠杠的。

    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1431579.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

老师没收学生东西违法吗怎么处理

身为一名老师,面对没收学生东西这个话题,确实让人感到有些尴尬和无奈。毕竟,我们教育的初衷是为了引导学生健康成长,而不是与他们产生矛盾和冲突。 老师在未经允许的情况下没收学生的物品,是违法的。学生的个人财物&a…

python+flask人口普查数据的应用研究及实现django

作为一款人口普查数据的应用研究及实现,面向的是大多数学者,软件的界面设计简洁清晰,用户可轻松掌握使用技巧。在调查之后,获得用户以下需求: (1)用户注册登录后,可进入系统解锁更多…

微服务的幂等性

微服务架构设计的中心思想是将服务进行拆分,但是在这个过程中,如果被依赖的服务发生奔溃,就会引起一系列问题。为了解决这个问题,就会引入重试的机制,重试又会引入幂等性的问题,下面我们就分析这个过程&…

面试150 颠倒二进制位 位运算分治 逻辑右移

Problem: 190. 颠倒二进制位 文章目录 思路复杂度位运算分治法 思路 👨‍🏫 参考题解 >>>:逻辑右移(符号位一起移动,高位补零) 复杂度 时间复杂度: O ( log ⁡ n ) O(\log{n}) O(logn) 空间…

Quartus IP学习之ISSP(In-System Sources Probes)

一、ISSP IP概要: ISSP:In-System Sources & Probes Intel FPGA IP 作用: 分为In-System Sources与In-System Probesn-System Sources,输入端,等价于拨码开关,通过输入板载FPGA上的拨码开关状态改变…

如何结合ChatGPT生成个人魔法咒语词库

3.6.1 ChatGPT辅助力AI绘画 3.6.1.1 给定主题让ChatGPT直接描述 上面给了一个简易主题演示一下,这是完全我没有细化的提问,然后把直接把这些关键词组合在一起。 关键词: 黄山的美景,生机勃勃,湛蓝天空,青…

鲜花销售|鲜花销售小程序|基于微信小程序的鲜花销售系统设计与实现(源码+数据库+文档)

鲜花销售小程序目录 目录 基于微信小程序的鲜花销售系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、前台功能模块 2、后台功能模块 (1) 后台登录 (2) 管理员功能模块 用户管理 商家管理 鲜花信息管理 鲜花分类管理 管理员管理 系统管理 (3) 商家功…

SerDes PoC 电感网络工作原理详解

如下图所示,PoC的工作原理可以描述如下: 1. 直流状态时,电感处于短路状态,电容处于开路状态,因此,接收端的电源能够通过电感注入到信号传输系统中,并在另一端通过电感为本地电路供电,而不会透过电容影响到两端的高速收发器; 2. 交流状态时,即高频信号注入时,电容器是…

华为机考入门python3--(5)牛客5-进制转换

分类:数字 知识点: 十六进制转int num int(hex_num, 16) int转十六进制 hex_num hex(num) 题目来自【牛客】 hex_num input().strip() dec_num int(hex_num, 16) print(dec_num) by 软件工程小施同学

【OpenCV学习笔记28】- OpenCV 中的直方图 - 直方图 - 2:直方图均衡

这是对于 OpenCV 官方文档中 图像处理 的学习笔记。学习笔记中会记录官方给出的例子,也会给出自己根据官方的例子完成的更改代码,同样彩蛋的实现也会结合多个知识点一起实现一些小功能,来帮助我们对学会的知识点进行结合应用。 如果有喜欢我笔…

【Java并发】聊聊Disruptor背后高性能的原理

为什么需要Disruptor 对于单机生产者消费者来说,JUC本身提供了阻塞队列,ArrayBlockingQueue、LinkedBlockingQueue 等,但是为了保证数据安全,使用了reentrantLock进行加锁操作会影响性能,另一方面,本身如果…

Kafka相关内容复习

为什么要用消息队列 解耦 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。 可恢复性 系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队…

XCTF:3-1[WriteUP]

从题目中获取文件 使用file命令查看文件类型 修改后缀为.rar后进行解压缩 再次使用file命令查询该文件的类型 再次修改后缀为.pcap或者.pcapng 使用wireshark打开,直接搜索flag字样 在多个数据包里发现了flag.rar、flag.txt等文件 尝试使用http导出文件 有一个fl…

小程序<scroll-view/>组件详解及使用指南

目录 引言小程序的流行和重要性scroll-view 组件在小程序中的作用和优势什么是 scroll-view 组件scroll-view 组件的基本概念scroll-view 组件的基本功能scroll-view 组件的属性与用法scroll-view 组件的常用属性参考代码scroll-view 组件的滚动事件scrolltoupper

【开源】SpringBoot框架开发大学计算机课程管理平台

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 实验课程档案模块2.2 实验资源模块2.3 学生实验模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 实验课程档案表3.2.2 实验资源表3.2.3 学生实验表 四、系统展示五、核心代码5.1 一键生成实验5.2 提交实验5.3 批阅实…

ESU毅速丨为什么增材制造广受关注?

随着科技的飞速发展,增材制造3D打印技术逐渐成为制造业的新宠。包括航空航天、汽车、家电、电子等各行业都在积极拥抱3D打印,为什么3D打印能引起制造业广泛关注与应用?它的主要优势有哪些? 首先,3D打印减少浪费。3D打印…

私有化部署的局域网即时通讯工具

在当今快节奏的企业环境中,高效的内部通信成为提高团队协作和工作效率的关键。而企业内部通信软件作为实现实时协作和快速沟通的利器,WorkPlus以其领先的功能和卓越的性能,助力企业打造高效团队沟通协作的新时代。 为何选择WorkPlus作为企业内…

简单说说-docker网络类型

概述 容器网络是指容器之间或非 Docker 工作负载之间连接和通信的能力。容器默认启用网络,并且可以建立传出连接。容器不知道它所连接的网络类型,容器只能看到带有 IP 地址、网关、路由表、DNS 服务和其他网络详细信息的网络接口。也就是说,…

【Docker与微服务】基础篇

1 Docker简介 1.1 docker是什么 1.1.1 问题:为什么会有docker出现? 假定您在开发一个项目,您使用的是一台笔记本电脑而且您的开发环境具有特定的配置。其他开发人员身处的环境配置也各有不同。您正在开发的应用依赖于您当前的配置且还要依…

ElementUI Data:Table 表格

ElementUI安装与使用指南 Table 表格 点击下载learnelementuispringboot项目源码 效果图 el-table.vue&#xff08;Table表格&#xff09;页面效果图 项目里el-table.vue代码 <script> export default {name: el_table,data() {return {tableData: …