eKuiper Newsletter 2022-06|离线缓存重发机制升级,优化弱网场景使用

简介: 六月,项目圆满完成了在基金会的第一次年度 review,并确立了下一年度升级到 Stage 2 的目标。

六月的盛夏时节正是 eKuiper 项目捐献给 LF Edge 基金会一周年之时。六月初,项目圆满完成了在基金会的第一次年度 review,并确立了下一年度升级到 Stage 2 的目标。在此我们衷心感谢各位社区贡献者、合作伙伴和用户,期待新的一年能有更多伙伴加入到社区的建设中。

我们的开发工作也取得了不错的进展。月初,小版本 1.5.1 发布,主要解决了一些用户问题。在 1.6.0 版本开发方面,我们完成了离线缓存和重发机制的升级,更适应边缘部署中常见的边云网络连接易丢失的弱网场景。与此同时,我们补齐了一些 SQL 语法支持,包括 IN/NOT IN 表达式的支持、ORDER BY 对表达式和别名的支持等,方便用户编写更复杂的过滤和排序逻辑。最后,可视化拖拽能力的开发目前已完成后台 API 的部分验证。

离线缓存和重发

大数据时代,云边协同是主流的计算模式。边缘计算的一部分结果需要发送到云端进行进一步的整合。然而边云之间的网络连接常常是不稳定的,网络连接故障时有发生。作为边缘流式计算引擎,eKuiper 经常有规则将计算结果汇入外部系统,尤其是远程的外部系统中。这种情况下,我们需要考虑弱网环境的处理:在网络断开等故障期间,必须对数据进行缓存,并在重新连接后重新发送。

此前,eKuiper 在一定程度上支持 sink 缓存。它提供了一个全局配置来切换缓存开启;系统/规则级配置用于内存缓存的序列化时间间隔。然而,缓存只是在内存中和复制到 DB(内存的镜像)中,并且没有定义明确的重发策略。六月,我们对缓存机制进行了优化,缓存将同时保存在内存和磁盘中,这样缓存的容量就变得更大了;它还将持续检测故障恢复状态,并在不重新启动规则的情况下实现自动重新发送。

流程

缓存只发生在 sink 中,因为那是 eKuiper 之外唯一可以发送数据的地方。每个 sink 都可以配置自己的缓存机制。每个 sink 的缓存流程是相同的。如果启用了缓存,所有 sink 的事件都会经过两个阶段:首先是将所有内容保存到缓存中;然后在收到 ack 后删除缓存。

  • 错误检测:发送失败后,sink 应该通过返回特定的错误类型来识别可恢复的失败(网络等),这将返回一个失败的 ack,这样缓存就可以被保留下来。对于成功的发送或不可恢复的错误,将发送一个成功的 ack 来删除缓存。
  • 缓存机制:缓存将首先被保存在内存中。如果超过了内存的阈值,后面的缓存将被保存到磁盘中。一旦磁盘缓存超过磁盘存储阈值,缓存将开始 rotate。内存中最早的缓存将被丢弃,并加载磁盘中最早的缓存来代替。
  • 重发策略:如果有一个 ack 正在发送中,则等待一个成功的 ack 以继续发送下个缓存数据。否则,当有新的数据到来时,发送缓存中的第一个数据以检测网络状况。如果 ack 成功,按顺序链式发送所有的缓存(mem + disk)。链式发送可定义一个发送间隔,防止形成消息风暴。

配置

sink 缓存的配置有两个层次。etc/kuiper.yaml 中的全局配置,定义所有规则的默认行为。还有一个规则 sink 层的定义,用来覆盖默认行为。

  • enableCache:是否启用 sink cache。缓存存储配置遵循 etc/kuiper.yaml 中定义的元数据存储的配置。
  • memoryCacheThreshold:要缓存在内存中的消息数量。出于性能方面的考虑,最早的缓存信息被存储在内存中,以便在故障恢复时立即重新发送。这里的数据会因为断电等故障而丢失。
  • maxDiskCache:缓存在磁盘中的信息的最大数量。磁盘缓存是 FIFO。如果磁盘缓存满了,最早的一页信息将被加载到内存缓存中,取代旧的内存缓存。
  • bufferPageSize:缓冲页是批量读/写到磁盘的单位,以防止频繁的IO。如果页面未满,eKuiper因硬件或软件错误而崩溃,最后未写入磁盘的页面将被丢失。
  • resendInterval:故障恢复后重新发送信息的时间间隔,防止信息风暴。
  • cleanCacheAtStop:是否在规则停止时清理所有缓存,以防止规则重新启动时对过期消息进行大量重发。如果不设置为 true,一旦规则停止,内存缓存将被存储到磁盘中。否则,内存和磁盘规则会被清理掉。

目前,该功能的代码已经合并到 1.6.0 版本的分支(https://github.com/lf-edge/ekuiper/tree/1.6.0)中。感兴趣的朋友可以自行编译使用。

列表过滤

在规则引擎中,我们经常需要判断某个值是否在一个列表中,从而触发相应的动作。在标准 SQL 语法中,通常使用 IN/NOT IN 表达式进行这样的过滤。本月,我们实现了 IN 运算符的支持。使用方法支持以下两种:

  1. 与标准 SQL 语法相同,支持同时设置多个表达式。

    expression [NOT] IN (expression2,...n)
  2. 在 eKuiper 的使用场景中,复杂类型和无模式使用较多,因此也支持直接使用表达式(需要确保为数组类型)作为右侧运算符。

    expression [NOT] IN arrayExpression

1.5.1 版本

月初发布的 1.5.1 版本主要解决问题和小功能更新。主要的功能更新包括:

  • 扩大数据模板的支持范围。新的版本中添加了 memory sink, edegX sink, tdengine sink 等对数据模板的支持。
  • 支持 window_start() 和 window_end() 作为其他函数的参数。

解决的 bug 包括:

  • 重启规则后,Neuron 连接失败问题
  • 插件更新导致规则语法错误时,已运行规则的状态异常问题
  • 使用共享源时,重启规则可能随机导致连接失败
  • REST API 使用鉴权后的跨域访问问题
相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
1月前
|
SQL 缓存 监控
MySQL缓存机制:查询缓存与缓冲池优化
MySQL缓存机制是提升数据库性能的关键。本文深入解析了MySQL的缓存体系,包括已弃用的查询缓存和核心的InnoDB缓冲池,帮助理解缓存优化原理。通过合理配置,可显著提升数据库性能,甚至达到10倍以上的效果。
|
3月前
|
存储 机器学习/深度学习 缓存
性能最高提升7倍?探究大语言模型推理之缓存优化
本文探讨了大语言模型(LLM)推理缓存优化技术,重点分析了KV Cache、PagedAttention、Prefix Caching及LMCache等关键技术的演进与优化方向。文章介绍了主流推理框架如vLLM和SGLang在提升首Token延迟(TTFT)、平均Token生成时间(TPOT)和吞吐量方面的实现机制,并展望了未来缓存技术的发展趋势。
性能最高提升7倍?探究大语言模型推理之缓存优化
|
21天前
|
缓存 运维 监控
Redis 7.0 高性能缓存架构设计与优化
🌟蒋星熠Jaxonic,技术宇宙中的星际旅人。深耕Redis 7.0高性能缓存架构,探索函数化编程、多层缓存、集群优化与分片消息系统,用代码在二进制星河中谱写极客诗篇。
|
1月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
305 4
|
6月前
|
缓存 并行计算 PyTorch
PyTorch CUDA内存管理优化:深度理解GPU资源分配与缓存机制
本文深入探讨了PyTorch中GPU内存管理的核心机制,特别是CUDA缓存分配器的作用与优化策略。文章分析了常见的“CUDA out of memory”问题及其成因,并通过实际案例(如Llama 1B模型训练)展示了内存分配模式。PyTorch的缓存分配器通过内存池化、延迟释放和碎片化优化等技术,显著提升了内存使用效率,减少了系统调用开销。此外,文章还介绍了高级优化方法,包括混合精度训练、梯度检查点技术及自定义内存分配器配置。这些策略有助于开发者在有限硬件资源下实现更高性能的深度学习模型训练与推理。
1132 0
|
2月前
|
缓存 运维 安全
WordPress安全加速:Cloudflare + Nginx缓存优化方案
本文介绍如何通过Cloudflare与Nginx优化WordPress网站性能,涵盖静态资源长期缓存、动态页面智能缓存及敏感路径保护,提升加载速度并保障后台安全。适用于使用Cloudflare与Nginx环境的WordPress站点。
109 0
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
210 6
|
缓存 JavaScript 中间件
优化Express.js应用程序性能:缓存策略、请求压缩和路由匹配
在开发Express.js应用时,采用合理的缓存策略、请求压缩及优化路由匹配可大幅提升性能。本文介绍如何利用`express.static`实现缓存、`compression`中间件压缩响应数据,并通过精确匹配、模块化路由及参数化路由提高路由处理效率,从而打造高效应用。
468 106
|
11月前
|
缓存 监控 前端开发
在资源加载优化中,如何利用浏览器缓存提升性能?
通过以上这些方法,可以有效地利用浏览器缓存来提升资源加载的性能,减少网络请求次数,提高用户体验和应用的响应速度。同时,需要根据具体的应用场景和资源特点进行灵活调整和优化,以达到最佳的效果。此外,随着技术的不断发展和变化,还需要持续关注和学习新的缓存优化方法和策略。
325 53
|
10月前
|
存储 缓存 自然语言处理
SCOPE:面向大语言模型长序列生成的双阶段KV缓存优化框架
KV缓存是大语言模型(LLM)处理长文本的关键性能瓶颈,现有研究多聚焦于预填充阶段优化,忽视了解码阶段的重要性。本文提出SCOPE框架,通过分离预填充与解码阶段的KV缓存策略,实现高效管理。SCOPE保留预填充阶段的关键信息,并在解码阶段引入滑动窗口等策略,确保重要特征的有效选取。实验表明,SCOPE仅用35%原始内存即可达到接近完整缓存的性能水平,显著提升了长文本生成任务的效率和准确性。
512 3
SCOPE:面向大语言模型长序列生成的双阶段KV缓存优化框架