Siberite协议详解:用memcache TCP文本协议与消息队列通信的完全指南
Siberite协议详解用memcache TCP文本协议与消息队列通信的完全指南【免费下载链接】siberiteSiberite is a simple, lightweight, leveldb backed message queue written in Go.项目地址: https://gitcode.com/gh_mirrors/si/siberiteSiberite是一个用 Go 编写的简单、轻量级LevelDB 消息队列服务LevelDB-backed message queue它直接使用memcache TCP 文本协议对外通信——这意味着你不需要学习任何私有协议甚至可以用telnet手工敲命令完成消息的写入、读取与运维。本文是面向新手和开发者的 Siberite 协议完全指南带你从零跑通队列通信。 为什么选择 Siberite 消息队列与 Redis 这类常驻内存的队列不同Siberite 把所有消息存储到进程外的 LevelDB 中因此队列大小不受内存限制常驻内存始终极低。它是经典分布式队列 Kestrel 与 Darner 的 Go 重写版支持两阶段可靠读取reliable fetch客户端取走消息后若未确认close消息会自动交给下一个消费者。如上图所示性能基准报告队列规模增大到 52 万条时Kestrel 的常驻内存已接近 85 万 Kb而Siberite 消息队列始终保持在 10 万 Kb 以下这正是轻量级的直观体现。 一分钟启动构建并运行 Siberite 服务Siberite 构建极其简单只需一个 Go 入口文件 siberite.gogo build siberite.go mkdir ./data ./siberite -listen localhost:22133 -data ./data默认监听端口为22133。启动后任何支持 memcache TCP 文本协议的客户端都能直接连接通信。 核心协议命令全解析Siberite 遵循 Kestrel 的 memcache 风格文本协议命令由空格分隔的字段组成响应以STORED、VALUE、END等关键字标识。所有命令的分发逻辑都集中在 controller/dispatch.go下面逐一拆解。set 命令向队列写入一条消息set work 0 0 10 1234567890 STORED格式set 队列名 flags exptime 字节数 紧随其后的数据块以\r\n结尾服务端校验字节数后入队成功返回STORED实现见 controller/set.goget 命令消费消息与两阶段可靠读取get work VALUE work 0 10 1234567890 END普通get 队列名取出队头消息并删除这是最常用的消费方式响应格式VALUE 队列名 0 字节数 数据块 END实现见 controller/get.go两阶段读取open、close、abort、peekSiberite 支持 Kestrel 风格的两阶段可靠读取通过get 队列名/子命令语法触发子命令作用get work/open开启一次打开读取消息被标记为处理中未确认前不会删除get work/close确认处理完成消息正式出队get work/abort放弃处理消息放回队列交给下一个消费者get work/peek只查看队头消息不产生消费get work/close/open组合命令确认上一条并立即读取下一条减少往返 小贴士如果客户端持有未 close 的消息时再次执行get服务端会返回CLIENT_ERROR Close current item first提醒你先关闭当前消息。持久游标同一队列多次消费用get 队列名.游标名可以为队列创建一个持久游标durable cursorget work/reader_a游标随每次读取推进但不删除源队列中的消息同一队列可同时存在任意多个游标游标同样支持两阶段读取如get work.reader_a/open、get work.reader_a/close/open这是 Siberite 相比 Kestrel/Darner 的独有特性非常适合一份数据、多个下游的场景fanout 命令一条消息写入多个队列在set时用连接多个队列名即可实现扇出写入set worknotifyaudit 0 0 10 1234567890 STORED消息会被依次写入work、notify、audit三个队列无需客户端发送多次。运维与统计命令命令作用响应示例stats查看服务与队列统计连接数、指令计数、队列长度等见 controller/stats.goSTAT uptime 47…ENDversion查看版本号VERSION siberite-0.4.1delete 队列名删除整个队列见 controller/delete.goENDflush 队列名清空指定队列ENDflush_all清空所有队列Flushed all queues.quit关闭连接—stats返回的关键指标示例STAT cmd_get 2 STAT cmd_set 2 STAT queue_work_items 0 STAT queue_work_open_transactions 0queue_work_items表示队列积压量open_transactions表示尚未 close 的两阶段读取数是日常监控消息队列时最常用的两个指标。 如何连接任意 memcache 客户端都可用由于协议完全兼容 memcache TCP 文本协议你可以直接复用现成的 memcache 客户端库。不过要注意两阶段可靠读取要求客户端在多次 get 之间保持持久连接以下客户端已验证支持Rubysiberite-client、memcache-clientGogomemcachekklis 分支完整清单见 docs/clients.md。最快的体验方式是直接用telnet手工交互telnet localhost 22133⚡ 高并发下的消息队列吞吐表现下图是官方 Flood 基准测试docs/benchmarks.mdSiberite 消息队列在 50~800 并发连接区间保持6 万~7.4 万请求/秒的吞吐峰值明显高于 Kestrel 与 Darner。✅ 小结与注意事项协议零门槛会 memcache TCP 文本协议就会用 Siberiteset入队、get出队即可上手可靠消费重要任务建议用get 队列/openclose两阶段流程防止消费者崩溃导致消息丢失多路消费用get 队列.游标名持久游标实现一对多消费已知限制协议中的t毫秒等待新消息语法目前被接受但不生效协议允许、实际空操作掌握以上命令你就能用文本协议完整驱动 Siberite 消息队列的读写与运维快速构建低成本、可持久化的分布式任务队列。【免费下载链接】siberiteSiberite is a simple, lightweight, leveldb backed message queue written in Go.项目地址: https://gitcode.com/gh_mirrors/si/siberite创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考