我们将事件存储在Chronicle Queue V4中,并有一个尾随来处理它们。其中一些事件到期(不是基于时间,但被后来的事件取代),因此可以在处理过程中跳过。
有没有办法更新现有的摘录,即将布尔标志“expired”设置为true,这样我们就可以跳过过期的事件?或者是否有另一种解决方案可以通过Chronicle Queue实现这一目标?
例如,系统生成事件A1,B1和C1。现在B2事件到来,使B1过时了。我们现在可以跳过B1而无需昂贵的处理。
此致 约亨
答案 0 :(得分:0)
分析您的要求
您正在将事件写入队列。事件有一个唯一的密钥K。
在写作时,当前事件可能会取代旧的,已写入的相同密钥K的事件。
您希望使用密钥K更新旧的已编写的事件,以告知新的版本(稍后出现)。
我认为这是一个非常常见的要求,它起初看起来很吸引人,但(正如我所经历的那样)它是有缺陷的。原因如下:
假设您正在处理大量事件(例如每秒100秒)是有帮助的。 Chronicle Queue在适度的硬件上非常有能力。现在我还假设你只是写入队列,你不会在任何其他地方记录你的数据。
关键点在于上面的第2点:您正在编写一个事件,并且您意识到需要更新旧事件。你需要做什么?您需要扫描整个队列,可能会返回很长时间/大量事件来搜索旧事件。只有这样,您才能更新它并完成新事件。这不会缩放。
潜在解决方案:
Tailer需要知道所有:
我假设你的tailer对数据执行了一些动作A. 你让你的tailer遍历所有事件并且只有在确定它具有K的事件的最新版本之后才执行A. 评估:标题需要为每个事件完整扫描队列,或者需要为每个事件密钥K构建一些数据结构/映射。
基于索引的版本地图
您的appender在编写事件时从Chronicle Queue获取索引。在基于存储器或文件的地图(例如Chronicle Map,MapDB ...)中,存储密钥K以及事件的最新索引。如果密钥已经在地图中,则只需更新密钥。现在,tailer不会按顺序处理队列,但是一个组件从地图中获取所有键,搜索索引,读取事件并执行A.然后它将转到下一个键。
要考虑的事情
在特定时间范围内,报告者将处理多少事件?这将决定地图大小:地图大小:每个时间帧的事件数*(密钥长度+ 64位索引号)
也许连续操作更好:使动作具有幂等性和可重复性:可以根据需要随时运行,旧版本永远不会更新事件的较新版本。
恕我直言,Chronicle Queue的索引是一个非常好的工具,它几乎是免费的:)