Siberite快速上手教程:5分钟从零构建并启动你的第一个消息队列服务
Siberite快速上手教程5分钟从零构建并启动你的第一个消息队列服务【免费下载链接】siberiteSiberite is a simple, lightweight, leveldb backed message queue written in Go.项目地址: https://gitcode.com/gh_mirrors/si/siberiteSiberite 是一款用 Go 语言编写的轻量级消息队列服务基于 LevelDB 持久化存储内存占用极低却能在 5 分钟内跑起来。本文面向新手手把手带你从零构建并启动你的第一个消息队列服务完成发送、读取、统计消息的全流程。一、为什么选择 Siberite 消息队列在 Redis、RabbitMQ 这类方案之间Siberite 走了一条不同的路对比维度内存型队列如 Redis企业级队列如 RabbitMQSiberite存储位置全部在内存进程内存储进程外LevelDB队列规模受内存限制功能重、配置多远超内存容量常驻内存随队列增长较高几乎恒定极小部署难度简单较复杂单二进制文件极简Siberite 的核心理念是持久化 低内存所有消息都存到磁盘的 LevelDB 中无论队列里积压多少消息服务器占用的内存都很少。它兼容 memcached 的 TCP 文本协议因此几乎所有 memcached 客户端都能直接连接使用详见 docs/clients.md。二、环境准备安装 Go 并获取源码Siberite 完全用 Go 编写你只需要安装 Go 工具链即可。第 1 步确认 Go 环境打开终端执行go version第 2 步克隆代码仓库git clone https://gitcode.com/gh_mirrors/si/siberite cd siberite项目结构非常清晰几分钟就能看懂它的组成siberite.go—— 程序入口负责解析命令行参数并启动服务service/service.go—— TCP 服务端接受并处理客户端连接controller/—— 命令分发与处理逻辑get、set、stats 等queue/—— 消息队列核心实现负责 LevelDB 中的读写repository/—— 队列仓库按队列名管理所有队列三、1分钟构建并启动消息队列服务第 1 步构建可执行文件go build siberite.go第 2 步创建数据目录并启动服务mkdir ./data ./siberite -listen localhost:22133 -data ./data看到以下输出说明你的消息队列服务已经成功启动listening on 127.0.0.1:22133 initializing... data directory: ./data启动参数说明定义在 siberite.go 中参数默认值作用-listen0.0.0.0:22133监听地址和端口-data./dataLevelDB 数据目录-pid无可选写入 PID 文件-version-打印版本号后退出 服务默认端口是22133消息队列数据会自动落盘到-data指定的目录重启服务后消息依然还在。四、用 Telnet 发送和读取第一条消息Siberite 使用 memcached 文本协议直接用 telnet 就能体验完整流程不需要写任何客户端代码telnet localhost 22133写入消息set work 0 0 10 1234567890 STORED读取消息get work VALUE work 0 10 1234567890 END看到返回的消息内容恭喜你——你的第一个消息队列服务已经可以正常收发消息了五、常用命令速查表命令的分发逻辑位于controller/dispatch.go完整支持以下命令命令说明set 队列名 0 0 长度写入一条消息get 队列名读取一条消息并删除get 队列名/peek只查看队首消息不删除stats查看服务与队列统计信息version查看版本号delete 队列名删除整个队列flush 队列名/flush_all清空指定队列 / 所有队列quit断开连接执行stats可以看到队列积压数量、连接数、命令计数等运行指标stats STAT uptime 47 STAT curr_connections 1 STAT cmd_get 2 STAT cmd_set 2 STAT queue_work_items 0 END六、进阶玩法持久游标与扇出队列Siberite 有两个非常实用的特性适合进阶场景1️⃣ 持久游标 —— 一个队列多次消费默认get 队列名会消费并删除消息。若想对同一队列进行多次独立读取使用游标语法get work/open # 初始化游标 open get work/open # 从游标继续读取不删除源消息 get work/close # 关闭游标游标会持久化保存进度重启服务后也能继续从上次位置读取且每个队列的游标数量没有限制。2️⃣ 扇出队列 —— 一条消息写入多个队列用号连接多个队列名即可同时投递set workauditbackup 0 0 10 1234567890 STORED这在做日志广播、事件分发时非常方便。此外Siberite 还支持两阶段可靠读取客户端断开连接前若未确认处理完成消息会自动交给下一个消费者保证消息不丢失。七、性能表现低内存占用的秘密官方提供了一组与 Kestrel、Darner 的对比基准测试完整数据见 docs/benchmarks.md测试脚本位于bench/目录。常驻内存对比——即使队列规模达到 50 多万条消息Siberite 的内存占用仍只有 Kestrel 的约 1/8吞吐量对比——在 10 个队列的洪峰压力下Siberite 在 50~100 连接时达到约 7.4 万请求/秒是三者中最高的八、常见问题FAQQ服务启动后端口被占用怎么办换一个端口即可例如./siberite -listen localhost:12345 -data ./data。Q消息会丢失吗不会。所有消息通过 LevelDB 持久化到磁盘进程重启后数据依然完整配合两阶段读取消费过程也是可靠的。Q我的客户端能用吗只要支持 memcached TCP 文本协议基本就能用若需要可靠读取open/close/abort客户端需保持持久连接。Q数据目录可以放哪-data可指向任意目录建议放在 SSD 上以获得更好的读写性能。总结至此你已经用不到 5 分钟完成了获取源码 → 构建编译 → 启动消息队列服务 → 用 telnet 收发消息 → 了解游标与扇出等高级玩法。Siberite 证明了简单同样可以很强大一个二进制文件、一个端口就能获得一个持久化、低内存、高吞吐的消息队列服务。接下来不妨把它接入你自己的项目中试试吧【免费下载链接】siberiteSiberite is a simple, lightweight, leveldb backed message queue written in Go.项目地址: https://gitcode.com/gh_mirrors/si/siberite创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考