当前位置: 首页 > ai >正文

一个使用布隆过滤器来做幂等性校验的例子

1、问题来源

在工业物联网领域,采集点位多,采集频率高,数据的顺序要求也很高。

这样在处理采集过滤的消息时高效的保证数据的不重就非常必要了。

就拿我手上的项目来说,峰值时每秒钟需要清洗2000+条物联网设备采集过来的各种指标数据。平均下来就是需要每0.5毫秒处理完一条数据。

2、可选的方案

做幂等性校验有很多方案,但是要满足上面的0.5毫秒内处理幂等性和业务逻辑的就不多了。

局域网内部1个ping包的平均耗时就有0.1毫秒左右,再加上业务中有排重、比较大小、生产消息到kafka、写日志、读写redis中的数据进行校验等。所以需要尽可能的使用本地缓存。

1) jdk本身的ConcurrentHashMap来做校验,key为消息的hashcode,值为此hashcode的消息内容列表,因为hashcode有碰撞的概率,无法做到完全唯一,这种方法有个比较大的问题,就是内存的使用量会一直升高,导致GC频繁,而业务上其实仅需要保证近10分钟内不重就行,适合单节点方案

2) 使用工具包中的 Caffeine的缓存方案,可以设置缓存的过期时间,用法上与ConcurrentHashMap差不多,适合单节点方案

3) 使用redis或者memcached来存储处理过的消息,每来一条都进行校验,此种方案有网络开销,比较耗时,只能作为重启应用是本地缓存清空了的兜底方案,适合分布式部署的情况

4) 使用布隆过滤器+本地缓存,尽可能使用本地校验,不确定的情况下再使用中心缓存进行校验,适合单节点部署的情况

3、最终方案

选择方案4,由于大部分消息内容是不会重复的,先使用本地的布隆过滤器校验,不存在直接返回不重复,布隆过滤器返回存在再用消息内容去和本地缓存比较,如存在则返回重复,如不存在则不重复。针对任务重启时布隆过滤器和本地缓存失效的问题,在开始处理业务逻辑前判断缓存是否为空,为空的情况下将数据库表中近最近时间往前推10分钟的数据查询出来加载到布隆过滤器和缓存中去,然后再进行业务逻辑处理。

这个方案的好处是充分利用本地缓存,有几极致的性能表现, 使用arthas监控校验方法,每条数据校验仅耗时0.02毫秒,加上写入布隆过滤器和本地缓存耗时0.04毫秒,那么幂等性校验功能总共耗时0.06毫秒。

幂等性校验

写入布隆过滤器和缓存

处理业务逻辑耗时

4、检查是否达到了预期效果

从上面的结果来看是达到了预期的效果,通过arthas的monitor命令每5秒钟统计一次,包含幂等性校验在内,整个业务逻辑平均0.4毫秒左右可以处理完成,符合预期/

http://www.xdnf.cn/news/8432.html

相关文章:

  • 【IEEE会议推荐】第五届区块链技术与信息安全国际会议
  • 服务业的数字化转型:GEO赋能客户体验升级
  • 相同,对称,平衡,右视图(二叉树)
  • MySQL:备份还原数据库(mysqldump)
  • [250522] x-cmd 更新日志:v0.5.12 ~ v0.5.14
  • 互联网大厂Java求职面试:云原生架构与AI应用集成解决方案
  • 线程池详解
  • PyTorch中多项分布中随机采样(multinomial)和张量范数(norm)函数使用详解
  • 大腾智能 PDM 系统:全生命周期管理重塑制造企业数字化转型路径
  • 根据参数量,如何推断需要多少数据才能够使模型得到充分训练?
  • 【全解析】EN18031标准下的DLM删除机制
  • JVM监控工具
  • Vue-js
  • python3.7版本,如何安装pyppeteer
  • 对比Java、Python和C++的数据库操作生态
  • 数学建模MathAI智能体-2025电工杯A题实战
  • NV066NV074美光固态颗粒NV084NV085
  • PyQt学习系列09-应用程序打包与部署
  • 关系数据库基础入门
  • 1538. 【中山市第十一届信息学邀请赛决赛】互质(different)
  • MDK的编译过程及文件类型全解
  • 集群、容器云与裸金属服务器的全面对比分析
  • SpringBoot项目中Redis的使用
  • 【Python打卡Day30】模块与包的导入@浙大疏锦行
  • Java 处理地理信息数据[DEM TIF文件数据获取高程]
  • 探索C++对象模型:This指针与(构造、析构)成员函数的深度解析(中篇)
  • HTTP和HTTPS详解
  • Spring Boot是什么?MybatisPlus常用注解,LambdaQueryWrapper常用方法
  • Python图形化秒表:使用Turtle打造精确计时工具
  • 劳特巴赫trace32异常问题汇总