新闻详情

新闻详情

首页 / 资讯中心 / 详情

不写框架直接用SQL:honker的honker_*扩展函数完整清单与用法

发布时间:2026/9/29 20:25:05来源:尧图网络
不写框架直接用SQL:honker的honker_*扩展函数完整清单与用法
不写框架直接用SQLhonker的honker_*扩展函数完整清单与用法【免费下载链接】honkerSQLite extension bindings for Postgres NOTIFY/LISTEN semantics with durable queues, streams, pub/sub, and scheduler项目地址: https://gitcode.com/gh_mirrors/ho/honkerhonker 是一个 SQLite 扩展 多语言绑定它为 SQLite 加上类似 Postgres 的 NOTIFY/LISTEN 语义并提供持久化队列、事件流、发布订阅和定时调度。最酷的一点是你不需要任何框架或客户端库——只要你的 SQLite 客户端支持load_extension就能用纯 SQL 的honker_*扩展函数完成入队、认领、重试、限流、定时任务等全部操作。本文给出这份函数清单的完整解读和实用示例适合刚接触 honker 的初学者快速上手。一键加载两步启用全部函数任何能加载扩展的 SQLite 客户端sqlite3 命令行、Python 的sqlite3、DBeaver 等都只需两步.load ./libhonker_ext -- 加载扩展路径按实际安装位置写 SELECT honker_bootstrap(); -- 建好 honker 需要的所有表honker_bootstrap()会幂等地创建队列、锁、限流、调度器、结果、流等 9 张_honker_前缀的表。完整加载流程可参考 bench/ext_bench.py。 注意跨进程唤醒worker 被叫醒需要文件型数据库:memory:不支持监听唤醒。honker_* 扩展函数完整清单以下 30 个函数全部注册在 honker-core/src/honker_ops.rs 的attach_honker_functions中所有绑定Python/Node/Go/Ruby...和 SQL 扩展共用同一份实现行为完全一致。分类函数作用初始化honker_bootstrap()建表返回 1队列honker_enqueue(...)入队返回新 job id队列honker_claim_batch(...)批量认领返回 JSON 数组队列honker_ack_batch(...)/honker_ack(...)确认完成删除行队列honker_retry(...)/honker_fail(...)重试或转入死信表队列honker_heartbeat(...)延长认领超时队列honker_cancel(...)/honker_get_job(...)取消任务 / 查看任务队列honker_queue_next_claim_at(...)下一个可认领时间点队列honker_sweep_expired(...)清理过期 pending 任务锁honker_lock_acquire/release/renew命名锁获取、释放、续期限流honker_rate_limit_try/sweep固定窗口限流、清理窗口调度honker_scheduler_register/unregister/tick/soonest/pause/resume/list/update定时任务全生命周期定时honker_cron_next_after(expr, from)计算 cron 下次触发时间结果honker_result_save/get/sweep任务结果存取带 TTL流honker_stream_publish/read_since/save_offset/get_offset持久化事件流与消费位点通知notify(channel, payload)进程间通知NOTIFY 语义监听honker_update_watcher_open/wait/closeSQL 侧打开更新监视器队列函数入队、认领、确认这是最常用的一组。入队支持 7 个参数延迟、定时、优先级、重试上限、过期-- 立即可执行最多重试 3 次永不自动过期 SELECT honker_enqueue(emails, {to:aliceexample.com}, NULL, NULL, 0, 3, NULL);参数优先级规则见 enqueue 实现delay相对延迟run_at绝对时间 立即expires传 NULL 表示永不失效。worker 侧的认领是一次带部分索引的UPDATE ... RETURNING速度快且天然互斥SELECT honker_claim_batch(emails, worker-1, 32, 300); -- 一次认领 32 个超时 300s SELECT honker_ack_batch([1,2,3], worker-1); -- 返回删除行数认领后任务进入processing状态并带上claim_expires_at可见性超时。worker 处理完调honker_ack删除该行如果 worker 挂掉超时后该行会被其他 worker 重新认领attempts每次 1超过max_attempts就自动进入死信表_honker_dead见 claim_batch 实现。配套函数honker_heartbeat(job_id, worker_id, extend_s)长任务定期续命避免被抢走honker_retry(job_id, worker_id, delay_s, error)失败后延迟重投重试耗尽自动转死信honker_fail(job_id, worker_id, error)直接判死刑信honker_cancel(job_id)运营手动撤销排队/进行中任务honker_queue_next_claim_at(queue)worker 循环用它算睡多久返回 0 表示当前无事可做命名锁与限流SQL 里的 Redis 替代品命名锁TTL 自动过期防止死锁SELECT honker_lock_acquire(backup, me, 60); -- 1拿到锁0被别人持有 SELECT honker_lock_renew(backup, me, 60); -- 长临界区续期 SELECT honker_lock_release(backup, me); -- 释放细节honker_lock_acquire对同一 owner 重复获取不会刷新 TTL所以需要续期时必须用honker_lock_renewlock_renew 注释。调度器主进程就是用honker-scheduler这把锁来做互斥的。固定窗口限流SELECT honker_rate_limit_try(api, 10, 60); -- 1未超限计数10已超限 SELECT honker_rate_limit_sweep(3600); -- 清理 1 小时前的窗口定时调度cron every 全家桶honker 自带基于 cron 表达式的调度器支持三种表达式解析逻辑在 honker-core/src/cron.rs5 段标准 cron0 3 * * *每天凌晨 3 点6 段 cron多一个秒位*/2 * * * * *间隔表达式every 5s、every 1h等先纯查询验证下次触发时间SELECT honker_cron_next_after(0 3 * * *, unixepoch()); -- 5 段 SELECT honker_cron_next_after(every 5s, unixepoch()); -- 间隔注册一个周期任务同名重复注册等于覆盖更新SELECT honker_scheduler_register(nightly, backups, 0 3 * * *, go, 0, NULL); -- 返回 1调度主循环只需三行 SQLSELECT honker_scheduler_tick(unixepoch()); -- 到点就入队返回本次触发的 JSON 数组 SELECT honker_scheduler_soonest(); -- 最近的下次触发时间用来算睡眠时长其余生命周期函数honker_scheduler_unregister(name)、honker_scheduler_pause(name)/honker_scheduler_resume(name)暂停/恢复、honker_scheduler_list()查看全部计划、honker_scheduler_update(...)改表达式/负载/优先级/重试上限。⚠️ 一个小知识调度器停机较久后恢复单个任务一次 tick 最多补投 64 次SCHEDULER_MAX_CATCHUP_FIRES再多的积压触发点会跳过而不是堆积避免一个长停机的every 1s任务瞬间灌入几万条任务scheduler_tick 实现。任务结果存储让 SQL 也能存返回值任务跑完后想把结果存下来SELECT honker_result_save(42, {ok:true}, 3600); -- 带 1 小时 TTL SELECT honker_result_get(42); -- 未过期返回值过期/不存在返回 NULL SELECT honker_result_sweep(); -- 清理过期结果TTL 传 0 或负数则永久保存。honker_result_get对已过期行返回 NULL查询无需自己判时间。持久化事件流带消费位点的 publish流stream是至少投递一次 每个消费者独立位点的持久化日志SELECT honker_stream_publish(orders, k, {id:42}); -- 返回 offset SELECT honker_stream_read_since(orders, 0, 1000); -- 从 offset 0 读 1000 条 SELECT honker_stream_save_offset(worker, orders, 42); -- 记录消费进度 SELECT honker_stream_get_offset(worker, orders); -- 查询进度未消费为 0位点更新是单调递增的重复投递同一个 offset 不会把进度回拨stream_save_offset 实现多个消费者各记各的位点互不干扰。进程间通知与纯 SQL 监听notify(channel, payload)是 honker 的 NOTIFY 原语写入_honker_notifications表attach_notify 实现SELECT notify(orders, {id:42});想纯 SQL 做推语义而不依赖任何语言绑定可以用扩展自带的三个 watcher 函数注册于 honker-extension/src/lib.rsSELECT honker_update_watcher_open(app.db, NULL); -- 返回监视器 id SELECT honker_update_watcher_wait(1, 2000); -- 1有更新0超时-1已关闭 SELECT honker_update_watcher_close(1);监视器底层读PRAGMA data_version默认每 1ms 轮询一次跨进程唤醒延迟在毫秒级。底层表一览所有函数的家每个函数都在读写下面这些表建表 DDL 见 honker-core/src/lib.rs你可以直接SELECT它们排查问题表存储内容_honker_live排队中 处理中的任务部分索引保证认领快_honker_dead死信重试耗尽 / 显式失败 / 过期的任务_honker_locks命名锁_honker_rate_limits限流窗口计数_honker_scheduler_tasks定时任务定义与下次触发时间_honker_results任务结果带 TTL_honker_stream/_honker_stream_consumers流事件 / 消费位点_honker_notificationsnotify 通知行使用技巧与常见坑和语言绑定混用SQL 写的任务Python/Node/Go 的 worker 照样能认领——它们共享同一套表和 schema见 README.md 的说明反之亦然。事务原子性honker_enqueue就是普通 INSERT放进你现有的BEGIN ... COMMIT里业务表和队列要么一起提交要么一起回滚这就是事务性 outbox模式。参数类型宽容但有底线整数参数允许以浮点数形式传入兼容 better-sqlite3 等客户端但带小数部分的值会报错不做隐式截断。死信要定期看SELECT * FROM _honker_dead检查last_error常见值具体错误信息、max attempts exceeded、expired。唤醒语义honker 对每次提交都唤醒是有意为之——一次索引 SELECT 很便宜漏掉唤醒才是正确性 bug如果空闲 CPU 更敏感可以调大 watcher 轮询间隔。总结honker 把队列、锁、限流、调度、流、通知这些通常要 Redis 或 Postgres 工具链才能做的事收敛成了约 30 个纯 SQL 的honker_*函数全部实现集中在 honker-core/src/honker_ops.rs任何 SQLite 客户端加载扩展即可使用。对新手来说记住三组最高频函数就够起步了honker_enqueuehonker_claim_batchhonker_ack跑通队列honker_scheduler_registerhonker_scheduler_tick跑通定时notify watcher 跑通进程间通知。更多示例可看 bench/ext_bench.py 和 README.md 的 SQL Extension 章节。【免费下载链接】honkerSQLite extension bindings for Postgres NOTIFY/LISTEN semantics with durable queues, streams, pub/sub, and scheduler项目地址: https://gitcode.com/gh_mirrors/ho/honker创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Coding Agent 正在偷走你的控制权?用 TaoToken 统一 Key 守住 harness 配置权 2026/9/29 21:11:50

Coding Agent 正在偷走你的控制权?用 TaoToken 统一 Key 守住 harness 配置权

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
从零构建AI工程链路:手写Transformer与推理模型实战指南 2026/9/29 21:11:49

从零构建AI工程链路:手写Transformer与推理模型实战指南

去年我给自己挖了一个不小的坑:在一个中小规模项目里,不用任何现成的模型库,从零动手搭建一条完整的AI工程链路。项目标题就叫“ai-engineering-from-scratch”。当时好几个朋友都劝我,说现成的框架一把一把抓,费这个劲…

阅读更多 →
Dify平台深度解析:从入门到企业级AI应用实战——用TaoToken统一Key打通LLM工作流与RAG配置 2026/9/29 21:11:43

Dify平台深度解析:从入门到企业级AI应用实战——用TaoToken统一Key打通LLM工作流与RAG配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
openclaw(小龙虾)能撑起复杂业务系统吗?从配置骨架到验证动作的完整拆解 2026/9/29 21:11:36

openclaw(小龙虾)能撑起复杂业务系统吗?从配置骨架到验证动作的完整拆解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
素材越攒越多怎么快速找回?智能集合与组合检索的增量实现 2026/9/29 21:11:35

素材越攒越多怎么快速找回?智能集合与组合检索的增量实现

素材越攒越多怎么快速找回?智能集合与组合检索的增量实现 做内容的人很容易遇到一个反直觉的问题:素材越认真收,找一条旧视频反而越慢。上周我需要一段竖屏、720P 左右、时长半分钟以内的产品演示,知道它就在本地,却在…

阅读更多 →
芯片烧录自己做还是外包?成本、工艺与品控深度解析 2026/9/29 21:11:29

芯片烧录自己做还是外包?成本、工艺与品控深度解析

芯片烧录到底自己做还是外包?这问题几乎每个做硬件的团队都会撞上一次。小批量打样的时候,手工烧录几十片根本不是事,可一旦铺到量产,几百上千片的烧录时间、误操作率、设备折旧全都在账上。更别说还有些型号要用专用烧录座&#…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉