基于golang rocksdb实现的高性能队列
来源:互联网 发布:新疆农业大学网络课程 编辑:程序博客网 时间:2024/06/08 20:03
作者:峰云就她了
链接:http://xiaorui.cc/?p=4942
來源:个人博客
共 2167 字,阅读需 5 分钟
前言
高性能队列? golang channel 可以理解为一个高性能的队列。但他毕竟是基于内存的,如果因各种情况堆积任务,可能会被oom,怎么办? 除去业务上的优化,看看是否有别的选择? 什么redis
? redis3.x之后倒是有个虚拟磁盘技术,除去内存外,还可以使用磁盘,但性能太差。 Rabbitmq
堆积后速度也很慢,慢主要是因为他的持久化分片设计问题,后续有时间跟大家唠唠。 持久化的队列选型其实可以选择kafka
,但很多时候我又不喜欢多引入一个中间件。
话说,不管是python还是golang,不管是原生或者社区都没有太好用的持久化队列库包,这里说的是直接可引入库像sqlite库那样,而不是消息队列服务端。
先前在github中找到一些golang的队列实现,但不合心意,不是性能太差,就是实现太丑,还有使用不友好。 借鉴了这些所谓经验,开发了一个高性能队列,代码我已经推到github中,有兴趣的朋友可以试试. Github https://github.com/rfyiamcool/rocks_queue
队列的设计原理
我先前写过一篇文章来阐述过 现在市面上的持久化队列的设计原理,方案不外乎就几种:
一种是类似redis
的方案,日志先行,通过后面的cow机制来重新覆盖日志文件,这样避免日志文件过大…
一种是类似kafka
分区方案,设计逻辑信息id, 然后进行分区,每个分区里有一堆的数据文件及索引文件,每个索引可以二分的查找具体id的偏移量位置.
一种是基于lsm
引擎设计的nosql来扩展队列模型, 就是我现在采用的模式. 社区里现在lsm引擎数数据库比较热的有 leveldb
, rocksdb
. 市面上不少公司是使用rocksdb
来设计的nosql,像ssdb
,ardb
, 360 pika
, pingcap的tidb
…
rocksdb只有kv模型,我们如何通过kv模型来构建双端链表的模型? 可以看下面的设计模式…
表明类型为list队列 key value+queue_name,l 1list数据存储格式 key valuel[queue_name]\x01\x00\x00\x00\x00\x00\x00\x03 xiaorui.cc index: 945l[queue_name]\x01\x00\x00\x00\x00\x00\x00\x03 xiaorui.cc index: 946l[queue_name]\x01\x00\x00\x00\x00\x00\x00\x03 xiaorui.cc index: 947l[queue_name]\x01\x00\x00\x00\x00\x00\x00\x03 xiaorui.cc index: 948l[queue_name]\x01\x00\x00\x00\x00\x00\x00\x03 xiaorui.cc index: 949l[queue_name]\x01\x00\x00\x00\x00\x00\x00\x03 xiaorui.cc index: 950
怎么用
首先安装rocksdb存储引擎
https://github.com/facebook/rocksdb/blob/master/INSTALL.md
测试样例代码
git clone git@github.com:rfyiamcool/rocks_queue.gitcd rocks_queuego run main.go
性能如何
使用固态硬盘ssd, 不加载tcp模块,直接单纯的库引用的模型下,每秒可以插入19w数据,每秒可以get 18w的数据。 限于机械硬盘的io能力,插入读取也就8w左右…
参考了约炮神器陌陌 { GoRedis半成品代码 }
END…
- 基于golang rocksdb实现的高性能队列
- golang:高性能消息队列moonmq的简单使用
- golang实践-如何实现高性能的定时任务管理器
- 基于 CoreText 实现的高性能 UITableView
- 基于 CoreText 实现的高性能 UITableView
- 高性能Key/Value存储引擎levelDB, rocksDB, sessionDB
- golang:一个高性能低精度timer实现
- 基于NIO实现的一个高性能通信框架
- 高性能并发队列(C++实现)
- 基于Golang实现的Rabbitmq 连接池
- 基于golang http包实现的文件服务器
- PhxQueue:高可用、高可靠、高性能的分布式队列
- Go实战--golang中使用gRPC和Protobuf实现高性能api(golang/protobuf、google.golang.org/grpc)
- 【Server】高性能的消息队列 (三)
- 高性能的消息队列 (三)
- 高性能队列Disruptor的使用
- 高性能阻塞队列
- rabbitmq工作队列实现高性能任务的负载分发[python实例]
- Linux常用操作命令
- Spark本地安装与配置
- 大数据分析与生态系统论坛:金融、电网、容器、数据库、图计算等共谱大数据生态
- Android插件化学习
- 机器学习九大算法---决策树
- 基于golang rocksdb实现的高性能队列
- iTerm2 指南
- [Android6.0]App中调用init.rc中的服务,从而运行shell脚本
- 笔记
- Ubuntu 16.04安装微信
- 设计模式(十八)------23种设计模式(10):命令模式
- 【bootstrap】入门
- 工作日常1
- 输出菱形星号