- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我已经了解了 LMAX 和这个叫做 RingBuffer 的美妙概念。所以人们告诉我们,当只用一个线程写入环形缓冲区时,性能比多个生产者要好得多......
但是我真的不觉得典型的应用程序可以只使用一个线程在环形缓冲区上写...我真的不明白 lmax 是怎么做到的(如果他们这样做的话)。例如N个不同的交易员在交易所下订单,这些都是异步请求转换为订单并放入ringbuffer,他们怎么可能用一个线程来写?
问题 1. 我可能遗漏了某些东西或误解了某些方面,但是如果您有 N 个并发生产者,如何将它们合并为 1 个而不相互锁定?
问题 2。我记得 rxJava observables,你可以使用 Observable.merge 将 N 个 observables 合并为 1 个我想知道它是否以任何方式阻止或维护任何锁?
最佳答案
多线程写入对 RingBuffer 的影响很小,但在非常重的负载下可能会很重要。
RingBuffer 实现包含一个 next
节点,下一次添加将在该节点进行。如果只有一个线程正在写入环,该过程将始终在最短时间内完成,即 buffer[head++] = newData
。
要在避免锁定的同时处理多线程,您通常会执行类似 while ( !buffer[head++].compareAndSet(null,newValue)){}
的操作。当其他线程干扰数据存储时,这个紧密循环将继续执行,从而降低吞吐量。
请注意,我在上面使用了伪代码,看看我的实现中的getFree
here一个真实的例子。
// Find the next free element and mark it not free.
private Node<T> getFree() {
Node<T> freeNode = head.get();
int skipped = 0;
// Stop when we hit the end of the list
// ... or we successfully transit a node from free to not-free.
// This is the loop that could cause delays under hight thread activity.
while (skipped < capacity && !freeNode.free.compareAndSet(true, false)) {
skipped += 1;
freeNode = freeNode.next;
}
// ...
}
关于java - 用单线程写 LMAX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30237952/
我正在对 Disruptor 队列的内部 C 实现进行性能测试,我很乐意对其他类似的非线程事件流处理方法进行基准测试。 Google 上的内容很少,因此非常感谢任何指点或建议。 最佳答案 这里有一个C
我试图理解 disruptor pattern 。我观看了 InfoQ 视频并尝试阅读他们的论文。我知道涉及一个环形缓冲区,它被初始化为一个非常大的数组,以利用缓存局部性,消除新内存的分配。 听起来好
我对破坏者模式做了一些研究,但有一件事我无法理解。 有生产者,它们为环形缓冲区提供条目。有环形缓冲区,基本上是一个固定但无限的数组。有消费者(基本上是独立的线程),处理来自环形缓冲区的条目。 我试图讲
我已经了解了 LMAX 和这个叫做 RingBuffer 的美妙概念。所以人们告诉我们,当只用一个线程写入环形缓冲区时,性能比多个生产者要好得多...... 但是我真的不觉得典型的应用程序可以只使用一
我希望我能得到最简单的示例代码,它将展示如何使用 LMAX disruptor(http://code.google.com/p/disruptor/)。 不幸的是,每段代码都已过时。有人知道吗,我在
本文整理了Java中com.lmax.disruptor.YieldingWaitStrategy类的一些代码示例,展示了YieldingWaitStrategy类的具体用法。这些代码示例主要来源于G
考虑来自 LMAX Architecture description from Martin Fowler 的以下场景: I'll use a simple non-LMAX example to i
我对 LMAX Disruptor 的理解它是一个 JAR,充满了速度惊人、并发的 Java 代码,每秒可实现 2000 万条消息的吞吐量(如果使用正确)。 我们目前的 ActiveMQ 实例对于我们
有什么办法可以在一个结构中同时拥有这两种功能 - BlockingQueue 的语义,即非阻塞 peek、阻塞 poll 和阻塞 put。多个提供者一个消费者。 RingBuffer,它有效地充当对象
我在 Healpy 文档中发现 healpy.anafast lmax 的默认值为 3*nside-1 制定这个标准有什么理由吗?它是 HEALPix 内的标准,还是 CMB 实验的标准,或者可能有物
试图理解下面的(部分)堆栈跟踪。使用spring的项目reactor 2.0.4。 我得到了任务调度程序线程,它们应该创建任务并为工作线程分配任务。应用程序此时挂起(工作线程未记录任何内容,在不同时间
您能否提供一个使用 LMAX Disruptor 模式实现并行排序或并行最大值查找的代码示例链接。 最佳答案 其实不太适用。干扰器本质上就像一个带有处理程序的管道,独立地访问每个项目,但它的实现方式非
我需要从 mongodb 存储和获取大量数据,所以我被要求使用 lmax Disruptor 接收和存储数据,我已经花了几天时间在 lmax github 帐户上寻找一个简单的教程,但我不太明白如何将
我最近一直在学习 LMAX Disruptor 并进行了一些实验。令我困惑的一件事是 EventHandler 的 onEvent 处理程序方法的 endOfBatch 参数。考虑我的以下代码。首先,
我也在考虑将干扰器模式集成到我们的应用程序中。在开始使用 disruptor 之前,我对一些事情有点不确定 我有 3 个生产者,主要是一个对请求进行反序列化的 FIX 线程。随着市场的变化不断修改订单
LMAX Disruptor“入门”中的示例代码... public class LongEvent { private long value; public void set(lon
如何监控 LMAX Disruptor?假设我有 3 个环形缓冲区,并希望提供一个 UI 来给我环形缓冲区的信息。 最佳答案 您可能想要监控的最重要的属性是剩余容量,以便您可以判断消费者是否跟上。 公
在使用破坏者时,可能会有一个消费者滞后,并且由于消费者缓慢,整个应用程序都会受到影响。 请记住,每个生产者(Publisher)和消费者(EventProcessor)都在单个线程上运行,那么慢消费者
只是回顾一下我的计划,看看它是否可行。 我正在使用 RDBMS 并计划在没有事件源的情况下使用 CQRS。我认为事件溯源对于第一次尝试来说有点先进,我不得不使用 RDBMS。 基于任务的 UI 由许多
熟悉的人lmax ring buffer (disruptor)知道该数据结构的最大优点之一是它可以对传入事件进行批处理,当我们有一个消费者可以利用批处理使系统自动适应负载时,你抛给它的事件越多越好。
我是一名优秀的程序员,十分优秀!