问题标签 [lmax]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1591 浏览

architecture - LMAX 架构 - 数据增长

考虑Martin Fowler的 LMAX 架构描述中的以下场景:

我将使用一个简单的非 LMAX 示例来说明。想象一下,您正在通过信用卡订购果冻豆。<...>

在 LMAX 架构中,您可以将此操作分成两部分。第一个操作将捕获订单信息并通过向信用卡公司输出事件(请求信用卡验证)来完成。然后,业务逻辑处理器将继续为其他客户处理事件,直到它在其输入事件流中收到信用卡验证事件。在处理该事件时,它将执行该订单的确认任务。

因此,订单一直保存在内存中,直到收到付款处理结果。

现在让我们假设不是信用卡处理步骤,而是需要更多时间的步骤,例如:我们需要执行库存检查,其中有人必须物理验证我们是否有已订购的特定风味的软糖。这可能需要一个小时。

如果是这种情况,是否会导致内存中保存的数据增长,因为可能有很多订单正在等待库存状态更新事件?

可能在这种情况下,我们需要从内存中删除订单并将其作为输出事件的一部分包含在内,外部系统(库存)负责生成另一个包含订单详细信息的输入事件。

我在这种方法中看到的问题是,我们不能将库存作为业务逻辑处理器的一部分。

关于我们如何解决这个问题的想法?

0 投票
1 回答
1463 浏览

java - LMAX Disruptor 如何解决典型的消息代理问题?

我对LMAX Disruptor的理解是,它是一个 JAR,里面装满了可怕的快速、可怕的并发 Java 代码,每秒可以处理 2000 万条消息(如果使用正确的话)。

我们目前有一个 ActiveMQ 实例,它在整个过程中运行速度很慢,大约每秒 400 条消息。我想知道我们是否会从重构代码以使用 LMAX 中受益,但有以下担忧:

  • 如何拥有 1 个发布者和多个(竞争)消费者
  • LMAX 如何存储/存放它的信息?在记忆中?
  • 故障转移 - LMAX 是否有故障转移协议/机制
  • 磁盘 I/O - LMAX 可以将未使用的消息保存到磁盘并在以后恢复它们吗?

而且,如果我对所有这些完全不了解,并且似乎完全误解了 LMAX Disruptors 的使用,那么有人可以提供一个具体的例子来说明何时使用它吗?提前致谢!

0 投票
2 回答
4570 浏览

disruptor-pattern - Disruptor - 消费者是多线程的吗?

我对破坏者有以下问题:

  1. 消费者(事件处理器)没有实现他们实现 EventHandler 的任何 Callable 或 Runnable 接口,那么它们如何并行运行,所以例如我有一个中断器实现,其中有一个像这样的菱形图案

其中c1到c3可以在p1之后并行工作,C4和C5在它们之后工作。

所以通常我会有这样的东西(P1和C1-C5是runnables/callables)

但是在 Disruptor 的情况下,我的事件处理程序都没有实现 Runnable 或 Callable,那么中断器框架最终是如何并行运行它们的呢?

采取以下场景:

我的消费者 C2 需要对事件进行一些注释的 Web 服务调用,在 SEDA 中,我可以为这样的 10 个 C2 请求启动 10 个线程 [用于将消息拉出队列 + 进行 Web 服务调用并更新下一个 SEDA 队列],这将确保我不会按顺序等待 10 个请求中的每一个的 Web 服务响应,在这种情况下,我的事件处理器 C2(如果)是单个实例,将按顺序等待 10 个 C2 请求。

0 投票
2 回答
2113 浏览

failover - 破坏者模式 - 主节点和从节点如何保持同步?

LMAX Disruptor模式中,复制器用于将输入事件从主节点复制到从节点。所以设置可能如下所示:

在此处输入图像描述

主节点的复制器将事件写入数据库(尽管我们可以认为比写入数据库更好的机制——这对问题陈述不是很重要)。从节点的 Receiver 从 DB 中读取数据并将事件放到从节点的环形缓冲区中。

从节点的输出事件被忽略。

现在主节点的业务逻辑处理器有可能比从节点的业务逻辑处理器慢。例如,主节点的 BL 可能位于插槽 102,而从节点可能位于 106。(这可能是因为复制器在业务逻辑处理器之前从环形缓冲区读取事件)。

在这种情况下,如果主节点发生故障并且从节点现在成为主节点,则外部系统可能会错过一些关键事件。这可能是因为节点 2 在充当从节点时忽略了其输出。

Martin Fowler 确实指出复制器的工作是保持节点同步:“之前我提到 LMAX 在集群中运行其系统的多个副本以支持快速故障转移。复制器使这些节点保持同步”

但我不确定它如何保持业务逻辑处理器同步?有任何想法吗?

0 投票
1 回答
913 浏览

message-queue - 使用多个 LMAX Disruptor

我是 LMAX Disruptor 的新手,我正在探索在需要处理大量流量的多层异步项目中使用它。

向平台发送请求以发送 SMS,清除/检查请求是否存在简单错误并记录下来。

获取和分析与发送 SMS 的客户端相关的各种其他信息,并将其他参数添加到 SMS 信息中。

分析并选择正确的路由路径。然后根据 SMS-info 设置平台特定的协议参数并将其提交给路由器。

像这样,将有接收和处理 SMS 传递以记录、计费、重试和许多其他的流程。在每个阶段,程序流程中都会有并发或顺序执行。如果这是项目的高级视图,是否应使用 LMAX 中断器框架在各个模块之间进行通信(短信信息)?

如果是这样,需要创建多少中断器的右缓冲区?

如果我的理解是正确的,是否在不同的每个层/功能之间创建了新的环形缓冲区?

可以将 POJO 对象写入 ringbuffer 吗?如何将其应用于集群环境?尽管我阅读了一些文档并看过一些有关此框架的视频,但我无法使用此框架可视化解决方案。

任何指南/示例/可视图表/文档或您对此的想法都会对我有很大帮助。

0 投票
2 回答
753 浏览

disruptor-pattern - LMAX Disruptor:必须 EventHandler 克隆从 EventHandler#onEvent 接收的对象

我有一个包含许多生产者和消费者的应用程序。

据我了解,RingBuffer 在 RingBuffer init 开始时创建对象,然后在 Ring 中发布时复制对象并在 EventHandler 中从中获取它们。

我的应用程序 LogHandler 在列表中缓冲接收到的事件,以便在列表达到一定大小后进一步以批处理模式发送。因此 EventHandler#onEvent 将接收到的对象放入列表中,一旦达到大小,它就会在 RMI 中将其发送到服务器并清除它。

我的问题是,我是否需要在放入列表之前克隆对象,据我所知,一旦使用它们就可以重复使用?

我是否需要同步对 EventHandler#onEvent 中列表的访问?

0 投票
1 回答
2055 浏览

java - 在 Java Servlet 中使用中断器并处理多个事件

我在我的 Web 应用程序中使用 LMAX 中断器,它接受 http 请求参数并将它们处理到环形缓冲区。3 个事件处理程序处理和处理数据,最后一个将其保存到数据库中。当 servlet 被实例化时,初始化一次 ringbuffer。这是正确的吗?

在这里,我将值直接放入 ringbuffer

事件处理程序

这是发布到环形缓冲区的正确方法吗?我需要同步“ringBuffer”对象吗?前 2 个事件并行运行,然后是第 3 个事件。当我有快速的发布者和缓慢的消费者时,我应该如何处理这个问题?我正在使用disruptor 3.1.1,我在web 环境中找不到很好的disruptor 使用示例。一个简单的代码实现,如果你做过,会帮助我理解很多!

0 投票
0 回答
101 浏览

virtual-machine - 安装在硬件上的 RHEL VM vrs RHEL 上的破坏者性能?

在我看来,这是一个重要的问题,因为“云”越来越流行,并且对于使用 VM 来满足各种需求的公司而言。

具体来说,问题是:Disruptor 库如何在 RHEL 虚拟机 vrs 上执行。RHEL直接安装在硬件上?知道使用它是否有改进也非常有用。不在虚拟机上?

0 投票
1 回答
1050 浏览

java - 监控 LMAX Disruptor

如何监控 LMAX Disruptor?假设我有 3 个环形缓冲区,并希望提供一个 ui 来为我提供环形缓冲区的信息。

0 投票
1 回答
918 浏览

java - LMAX 的干扰器以何种方式可用于股票市场?

我已经对破坏者模式进行了一些研究,但有一件事我无法绕开。

有生产者,它们为环形缓冲区提供条目。有环形缓冲区,基本上是一个固定但无限的数组。有消费者(基本上是独立的线程),处理来自环形缓冲区的条目。

我试图说明如何在股票市场的真实案例场景中使用破坏者模式。

通常,您将拥有包含所有订单的订单簿。我怎么看,生产者会收到经纪人的新订单。生产者将订单放入环形缓冲区。将订单放入环形缓冲区后,消费者获取订单并与订单簿进行交叉检查。

现在这是我在理解优势时遇到一些麻烦的部分。如果会有多个消费者,这就是你想要的可扩展系统,怎么会有多个消费者处理订单?

当消费者访问时,订单簿必须被锁定以确保完整性。我正在寻找的是这个问题的答案以及订单匹配引擎如何可能从这种模式中受益的粗略想法。

LMAX 有自己的订单匹配引擎,所以我必须忽略一些东西。

谢谢