破坏者:日记示例

Posted

技术标签:

【中文标题】破坏者:日记示例【英文标题】:Disruptor: journaling Example 【发布时间】:2012-08-30 23:54:31 【问题描述】:

我很好奇关于日志记录步骤的最常见(或推荐)的中断器实现。我最常见的问题是:

它是如何实际实现的(通过示例)? 使用 JPA 是否明智? 什么数据库常用(社区已经实施了带有破坏者的项目)? 在(EventProcessor 的)中间处理程序处使用是否明智,因此应保存每条消息的状态,而不是在业务逻辑流程之前和之后保存?

顺便说一下(对不起,我知道这与日志步骤无关),在 eventHandler 过程中从 RingBuffer 中删除消息的正确方法是什么(假设消息已失效/过期并且应该被整个过程删除)。我想知道类似于Dead Letter Channel 模式的东西。

干杯!

【问题讨论】:

【参考方案1】:

Disruptor 通常用于低延迟、高吞吐量的处理。例如。数百万条消息,典型延迟为数百微秒。由于很少有数据库可以处理这种具有合理延迟的更新速率,因此通常对原始文件进行日志记录,并复制到第二个(或第三个)系统。

出于报告目的,系统会读取此文件或侦听消息并尽快更新数据库,但这已脱离关键路径。

当每个事件处理器都处理完一个条目时,环形缓冲区中的条目已失效。


在每个事件处理器都处理完它和它之前的所有消息之前,消息使用的槽不可用。就性能和对设计的影响而言,删除一条消息的代价太高了

每个事件处理器都会看到每条消息。由于这种情况同时发生,这样做的成本很低,但事件处理器因此忽略消息是很正常的。 (可能是大多数消息)

【讨论】:

是的,我所指的数据库报告被假定为在业务关键路径之外处理。而关于死消息,如果在这个过程中消息过期了怎么办,应该将其删除(或者转发到死消息仓库)。 一条过期的消息需要像任何其他消息一样被处理,它只是你用它做的不同,例如您发送的是过期响应而不是已接受的响应。 过期响应通常也取决于其他因素(在异步架构上)。但要明确一点,不能在完成之前从 RingBuffer 中删除消息吗? 在每个事件处理器都处理完它和它之前的所有消息之前,消息使用的槽不可用。就性能和对设计的影响而言,删除消息的成本太高。 我明白了,这解释了很多关于业务逻辑过程中的消息操作。谢谢!

以上是关于破坏者:日记示例的主要内容,如果未能解决你的问题,请参考以下文章

json 为什么API模式被破坏以及我们如何解决它 - 代码示例 - 示例IO状态

8.1.20示例:类型安全性与装载约束

LeetCode日记 41.缺失的第一个正数

asyncio "任务已被破坏,但它正在等待处理!"在 pysnmp 示例程序中

OptaPlanner 8.0.0 final (Windows 10) 中的课程时间表和会议安排示例被破坏

小航的算法日记哈希