golang实现的高性能嵌入式持久化队列dque发布新版本

golang实现的高性能嵌入式持久化队列dque发布新版本 Dque 现已发布第 2 版。

v2 版本新增了涡轮模式功能,该模式不再对每次入队和出队操作执行磁盘同步,而是由操作系统决定同步时机。在我的本地 SSD 驱动器上,这一改进使性能提升了约 10 倍。涡轮模式默认处于关闭状态。

GitHub

joncrlsn/dque

头像

dque 是一个为 Go 语言打造的快速、嵌入式、持久化队列。欢迎通过创建 GitHub 账户为 joncrlsn/dque 的开发贡献力量。

希望尝试使用的用户能提供代码审查和反馈意见。包括:是否易于使用和理解?文档是否清晰?是否存在反模式的使用?(我个人认为没有,但有时可能会疏忽)。同时我也需要关于版本管理的建议,以支持 Go 1.11 中的新模块系统。目前我对此尚未完全掌握。


更多关于golang实现的高性能嵌入式持久化队列dque发布新版本的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

你好Johan,感谢你审阅我的代码。我通常进行白盒测试(在同一包内),但其中一个测试我只想测试API。所以我将包名末尾加上了_test。这是我之前见过的一个示例。

很高兴你提出质疑,因为通过访问内部实现我可能还能进行更多测试。

当我使用DQue时,指的是具有TurboOn()和TurboOff()方法的公共对象。当我使用dque时,指的是这个包。感谢你花时间查看我的代码。

  • Jon

更多关于golang实现的高性能嵌入式持久化队列dque发布新版本的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我快速浏览了一下,注意到两件事。在大部分书面内容中,您将包称为Dque而不是dque,比如在讨论开启关闭turbo模式时。

为什么将测试放在单独的包中?这并非必要,在testing包 - testing - Go Packages中提到:

要编写新的测试套件,请创建一个以_test.go结尾的文件,其中包含此处所述的TestXxx函数。将文件放在与被测试包相同的包中。该文件将在常规包构建时被排除,但在运行"go test"命令时会被包含。更多详情,请运行"go help test"和"go help testflag"。

以下是关于 dque v2 版本的评论,重点介绍了新功能、性能改进以及使用示例。作为 Go 语言的嵌入式持久化队列,dque 在 v2 中引入的涡轮模式显著提升了吞吐量,这在高并发场景下非常实用。

涡轮模式性能提升

涡轮模式通过减少磁盘同步操作来优化性能,这在本地 SSD 测试中实现了约 10 倍的提升。默认情况下该模式关闭,用户需手动启用以避免潜在的数据丢失风险。以下是一个启用涡轮模式的示例代码:

package main

import (
    "github.com/joncrlsn/dque"
    "log"
)

// 定义一个简单的队列项结构,必须实现 Serializable 接口
type Item struct {
    Name string
}

func (i *Item) Serialize() ([]byte, error) {
    return []byte(i.Name), nil
}

func (i *Item) Deserialize(data []byte) error {
    i.Name = string(data)
    return nil
}

func main() {
    // 创建或打开一个 dque 队列,指定目录和项构建器
    q, err := dque.NewOrOpen("myQueue", "./queueDir", 100, func() interface{} {
        return &Item{}
    })
    if err != nil {
        log.Fatal("Failed to open queue:", err)
    }
    defer q.Close()

    // 启用涡轮模式以提升性能
    q.TurboOn()

    // 入队一个项
    err = q.Enqueue(&Item{Name: "example"})
    if err != nil {
        log.Fatal("Enqueue failed:", err)
    }

    // 出队一个项
    iface, err := q.Dequeue()
    if err != nil {
        log.Fatal("Dequeue failed:", err)
    }
    item := iface.(*Item)
    log.Println("Dequeued item:", item.Name)
}

在这个示例中,TurboOn() 方法启用了涡轮模式,从而减少了磁盘同步。注意,在启用此模式时,如果系统崩溃,未同步的数据可能丢失,因此建议在可容忍数据丢失的场景下使用。

项目贡献和反馈

dque 是一个开源项目,鼓励社区通过 GitHub 参与贡献。对于代码审查,建议关注以下方面:

  • 易用性:API 设计是否直观,例如队列的创建和操作是否简单。
  • 文档清晰度:README 和代码注释是否足够详细,帮助用户快速上手。
  • 反模式检查:例如,确保队列项正确实现序列化接口,避免数据损坏。

关于 Go 模块支持,dque 可以集成 Go 1.11+ 的模块系统来管理依赖。以下是一个简单的 go.mod 文件示例,用于在项目中使用 dque:

module myapp

go 1.11

require github.com/joncrlsn/dque v2.0.0

这允许用户通过 go get 命令获取最新版本,并自动处理依赖关系。

总体而言,dque v2 的涡轮模式是一个重大改进,适用于需要高性能队列的嵌入式应用。建议用户在实际项目中测试并提供反馈,以帮助进一步优化。

回到顶部