0

鉴于以下事实,是否存在一个现有的开源 Java API(可能作为某些更大产品的一部分),它实现了一种算法,可以在集群环境中对事件进行可重现的排序:

1) There are N sources of events, each with a unique ID.
2) Each event produced has an ID/timestamp, which, together with
   its source ID, makes it uniquely identifiable.
3) The ids can be used to sort the events.
4) There are M application servers receiving those events.
   M is normally 3.
5) The events can arrive at any one or more of the application
   servers, in no specific order.
6) The events are processed in batches.
7) The servers have to agree for each batch on the list of events
   to process.
8) The event each have earliest and latest batch ID in which they
   must be processed.
9) They must not be processed earlier, and are "failed" if they
   cannot be processed before the deadline.
10) The batches are based on the real clock time. For example,
    one batch per second.
11) The events of a batch are processed when 2 of the 3 servers
    agree on the list of events to process for that batch (quorum).
12) The "third" server then has to wait until it possesses all the
    required events before it can process that batch too.
13) Once an event was processed or failed, the source has to be
    informed.
14) [EDIT] Events from one source must be processed (or failed) in
    the order of their ID/timestamp, but there is no causality
    between different sources.

不太正式,我有那些接收事件的服务器。它们从相同的初始状态开始,并且应该通过同意以何种顺序处理哪个事件来保持同步。对我来说幸运的是,这些事件不会尽快处理,而是“稍后”处理,这样我就有时间让服务器在截止日期前达成一致。但我不确定这是否真的会对算法产生任何真正的影响。如果所有服务器都同意所有批次,那么它们将始终保持同步,因此在查询时呈现一致的视图。

虽然我对 Java API 最满意,但如果我可以从 Java 调用它,我会接受其他东西。如果没有开源 API,但有一个清晰的算法,我也会把它作为答案并尝试自己实现它。

4

2 回答 2

1

查看问题和您的后续行动,可能“没有”API 可以满足您的要求。今天你可以看看 Kafka(来自 LinkedIn)

还有“日志”实体的一般概念,人们喜欢称之为“大数据”:

实际上,对于您的问题,我将从有关“日志”的博客开始。在我看来,它的工作方式——而且 Kafka 并不是唯一一个进行日志处理的包——工作方式如下:

  • 而不是基于队列的消息传递/发布订阅
  • Kafka 使用消息的“日志”
  • 订阅者(或端点)可以使用日志
  • 日志保证“有序”;它处理千兆数据,速度很快
    • 仔细检查保证,通常需要权衡可靠性
  • 您只是阅读了日志,我认为默认情况下读取是破坏性的。
  • 如果有一个订阅者组,每个人都可以在日志条目消失之前“阅读”。

日志的基本处理(计算)过程是 Map-Reduce-Filter 模型,因此您可以非常快速地读取所有内容;只保留你想要的东西;处理它(减少)产生结果。

缺点似乎是你需要集群和其他东西才能让它真正发光。由于提到了不同的服务器或站点,我认为我们仍在进行中。我发现启动并运行 Apache 下载是一件很挑剔的事情,因为它倾向于假设非 Windows 环境(呵呵)。

另一个“快速”选项是

这需要你做连接不同服务器的管道。由于要求包括...

接收事件的服务器。它们从相同的初始状态开始,并且应该通过同意以何种顺序处理哪个事件来保持同步。对我来说幸运的是,这些事件不会尽快处理,而是“稍后”处理,这样我就有时间让服务器在截止日期前达成一致

我建议查看Kafka 的“入门”示例或教程,然后查看类似的 ZooKeeper 组织的消息/日志软件。祝你好运,享受!

于 2015-01-17T13:00:01.573 回答
0

到目前为止,我还没有得到明确的答案,但我认为任何有兴趣了解我发现的人都会很有用。

以下是与该主题相关的一些理论讨论:

用于事件一致排序的动态矢量时钟

无冲突的复制数据类型

使多个并发进程相互等待的一种方法是分布式屏障,我可以用它来同步“批次”。一个 Java 实现似乎可以在Hazelcast 之上使用,另一个使用ZooKeeper

我发现的一种更简单的替代方法是使用数据库。每个进程都将它接收到的所有事件插入到数据库中。根据 DB 设计,这可以是完全并发且无锁的,例如在 VoltDB 中。然后每隔一秒,一些“cron 作业”会运行,选择并标记要在下一批中处理的事件。该作业可以在每台服务器上运行。第一个为一批运行作业的人修复了一组事件,以便其他人可以使用第一个定义的列表。像这样,我们保证所有批次在所有服务器上都包含相同的事件集。如果我们可以对整个批次使用完整的顺序,cron 作业可以自行指定,那么服务器的状态将保持同步。

于 2012-06-03T09:56:22.267 回答