go-disruptor

高性能的消息框架
授权协议 Apache
开发语言 Google Go
所属分类 程序开发、 并发/并行处理框架
软件类型 开源软件
地区 不详
投 递 者 傅明知
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

这是Go编程语言里 LMAX Disruptor的接口。 它保留了Disruptor的本质和原理,并利用了很多相同的抽象概念和理论,但不会保持同样的API。

简述:

在我的 MacBook Pro (Intel Core i7-4960HQ CPU @ 2.60GHz) 中,我使用了 Go 1.4.2, 此版本使我能在一秒内发送9亿多份邮件(是的,你没有听错), 从一个goroutine到另一个goroutine. 讯息在两台CPU间的传递很简单。 请注意,您的里程可能会有所不同,通过控制CPU并清除其缓存,不同的操作系统可以添加特定的“jitter”到App中。Linux和Windows系统有给定的进程分配给特定的CPU内核它通过将所有的CPU缓存热显著降低“jitter”的能力。 顺便,当Disruptor代码被编译并在Nexus 5上运行,它可以每秒可推送约15-20万条信息。

一旦被初始化,在运行时,Disruptor杰出设计的考虑因素之一,就是以一个恒定的速率来处理消息。为此,它使用两个主要技术:

1. 它避免了在所有costs上使用锁,costs通常会引起CPU内核间的排斥,影响可测量性。

2. 它允许应用程序预先在一个环形缓冲区分配连续的空间,不产生垃圾。 

通过避免垃圾,垃圾清理站和应用程序暂停的功能可以免去。

示例代码:

Wireup

runtime.GOMAXPROCS(2) // make sure we have enough cores available to execute
const RingBufferCapacity = 1024 // must be a power of 2
const RingBufferMask = RingBufferCapacity - 1
// this instance will be shared among producers and consumers of this application
var ringBuffer = [RingBufferCapacity]MyStruct{}
myDisruptor := disruptor.
    Configure(RingBufferCapacity).
    WithConsumerGroup(MyConsumer{}). // we can have a set of concurrent consumers run first
    // WithConsumerGroup(MyConsumer{}). // and then run this/these consumers after the first set of consumers
    BuildShared() // Build() = single producer vs BuildShared() = multiple producers
myDisruptor.Start()
defer myDisruptor.Stop() // clean shutdown which stops all idling consumers after all published items have been consumed
// application code here, e.g. listen to HTTP, read from a network socket, etc.

生产者

Producer
writer := myDisruptor.Writer()
// for each item received from a network socket, e.g. UDP packets, HTTP request, etc. etc.
sequence := writer.Reserve(1) // reserve 1 slot on the ring buffer and give me the upper-most sequence of the reservation
// this could be written like this: ringBuffer[sequence%RingBufferCapacity] but the Mask and & operator is faster.
ringBuffer[sequence&RingBufferMask].MyImportStructData = ... // data from network stream
writer.Commit(sequence, sequence) // the item is ready to be consumed

消费者

type MyConsumer struct{}
func (m MyConsumer) Consume(lowerSequence, upperSequence int64) {
    for sequence := lowerSequence; sequence <= upperSequence; sequence++ {
        message := ringBuffer[sequence&RingBufferMask] // see performance note on producer sample above
        // handle the incoming message with your application code
    }
}
  • GO-Disruptor并发框架 Disruptor能在一秒内发送9亿多份邮件(是的,你没有听错), 从一个goroutine到另一个goroutine. 讯息在两台CPU间的传递很简单。 请注意,您的里程可能会有所不同,通过控制CPU并清除其缓存,不同的操作系统可以添加特定的“jitter”到App中。Linux和Windows系统有给定的进程分配给特定的CPU内核它通过将所有的CPU缓存热显著

  • 前文讲了那么多理论,原理。现在通过实际的代码,来看看Disruptor2.0的几种实际应用代码。 <dependency> <groupId>com.lmax</groupId> <artifactId>disruptor</artifactId> <version>3.4.0</version>

  • 前文了解了Disruptor与RingBuffer的基础知识后,接下来了解Disruptor对 ringbuffer的访问控制策略。 Disruptor对RingBuffer的读取策略 假设消费者(Consumer)是一个想从 Ring Buffer 里读取数据的线程,它可以访问 ConsumerBarrier对象——这个 对象由 RingBuffer 创建并且代表消费者与 RingBuffer

  • 原文地址http://stackoverflow.com/questions/6559308/how-does-lmaxs-disruptor-pattern-work 第一个回答(answered Jul 3 '11 at 8:03 Michael Barker): Disruptor最简单的描述就是:它是线程间通信最高效的方式。它可以用来替代队列,同时有很多SEDA和Actors模式的特性。

 相关资料
  • 主要内容:1.Disruptor介绍,2.Disruptor 的核心概念,3.demo1.Disruptor介绍 Disruptor是一个开源的Java框架,它被设计用于在生产者—消费者(producer-consumer problem,简称PCP)问题上获得尽量高的吞吐量(TPS)和尽量低的延迟。 从功能上来看,Disruptor 是实现了“队列”的功能,而且是一个有界队列。那么它的应用场景自然就是“生产者-消费者”模型的应用场合了。 其实Disruptor与其说是一个框架,不

  • 问题内容: 我阅读了今年的UberConf的幻灯片,其中一位发言者认为Spring JMS给您的消息队列系统增加了性能开销,但是在幻灯片中我看不到任何证据支持这一点。演讲者还提出了点对点比传统“发布- 订阅”方法更快的情况,因为每个消息仅发送一次,而不是广播给每个消费者。 我想知道是否有经验的Java消息传递专家可以在这里介绍一些技术问题: 使用Spring JMS而不是单纯的JMS实际上会产生性

  • 在网页应用中,你经常需要在处理完表单或其它类型的用户输入后,显示一个通知消息(也叫做“flash message”)给用户。 对于这个功能,Django 提供基于Cookie 和会话的消息,无论是匿名用户还是认证的用户。其消息框架允许你临时将消息存储在请求中,并在接下来的请求(通常就是下一个请求)中提取它们并显示。每个消息都带有一个特定level 标签,表示其优先级(例如info、warning

  • 主要内容:1 asyncPutMessage存储普通消息,1.1 checkStoreStatus检查存储状态,1.2 checkMessage检查消息,2 CommitLog#asyncPutMessage异步存储消息,2.1 处理延迟消息,2.2 获取最新mappedFile,2.3 appendMessage追加存储消息,3 存储高性能设计总结基于RocketMQ release-4.9.3,深入的介绍了Broker存储消息的源码,以及存储的高性能设计。 1 asyncPutMessage

  • Uragano 旨在提供一个搭建和使用简单的高性能 RPC 框架。Uragano 是基于 netstandard2.0 开发的。Uragano 默认采用 DotNetty 实现远程通信,使用 MessagePack 进行编解码。

  • 问题内容: 美好的一天! 我正在使用JavaFX SDK开发程序。我想有一个像C#一样的消息框: 我想使用JavaFX SDK拥有这样的功能。非常感谢您的回答。 问题答案: 更新资料 从Java8u40开始,核心JavaFX库包含对话框(消息框)功能。请参考以下类别的文档: 警报 对话框(和子类) 有关更长的教程,请参考Makery JavaFX对话框教程( 强烈 建议使用此教程)。 原始答案 这