LMAX Disruptor 的 Go 语言版本。
概述----------------------------- 这是将 LMAX Disruptor 移植到 Go 编程语言的一个实现。它保留了 Disruptor 的精髓和精神,使用了相同的底层抽象和概念,但不保留名称或 API。在现代的桌面硬件上,它可以每秒向一个 goroutine 发送数亿条消息—是的,数亿条—。
一旦初始化并运行,Disruptor 的主要设计考虑之一是以恒定速率处理消息。它采用了两种主要技术来实现这一点。首先,它避免使用互相竞争的锁,从而干扰并最终阻止扩展。其次,Disruptor 不产生垃圾。它通过在环形缓冲区上预先分配连续空间来实现这一点。通过完全避免垃圾,可以几乎完全避免垃圾收集和停止世界的应用程序暂停。
在 Go 中,通道(chan)的当前实现维护了发送、接收和 len 操作周围的互斥锁。结果是,它的最大无争议吞吐量为每秒 20-30 万条消息,与 Disruptor 相比要慢一数量级。同样的通道,在 OS 线程之间竞争时,每秒只能推送大约 5-7 万条消息,而 Disruptor 则继续推送至少一数量级以上的消息,比同类竞争通道要快。
上述示例比典型的通道实现更为复杂。它展示了一个包含 4 个独立消费者的完整流程,分为 2 个阶段。去掉所有注释、实例化和额外的解释性内容后,代码变得非常简洁。事实上,给定的"发布"操作只需要三个指令 - 预留一个槽、更新环形缓冲区和"提交"预留的序列范围。在消费者端,有一个"for"循环来处理应用程序中的所有输入项。同样,这并不像通道那样简洁(也不像通道那样灵活),但
暂无开放 Issues,或尚未同步最近议题。