鉴于以下事实,是否存在现有的开源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,但是一个清晰的算法,我也会把它作为一个答案并尝试自己实现它。
答案 0 :(得分:1)
看看这个问题以及你的后续行动可能"不是"#34;一个满足您要求的API。到了今天你可以看一下Kafka(来自LinkedIn)
"日志的一般概念"实体,人们喜欢打电话给大数据':
实际上,对于你的问题,我从博客开始,关于"日志"。按照我的说法,它的工作方式 - 而Kafka并不是唯一一个进行日志处理的软件包 - 工作原理如下:
日志的基本处理(计算)过程是Map-Reduce-Filter模型,因此您可以快速读取所有内容;只保留你想要的东西;处理它(减少)产生结果。
缺点似乎是你需要集群和东西来让它真正闪耀。由于提到了不同的服务器或站点,我认为我们仍然在轨道上。我发现启动和运行Apache下载是一件很蠢的事情,因为它倾向于假设非Windows环境( ho hum )。
另一个'快速'选项是
需要您进行连接不同服务器的管道。由于要求包括......
接收事件的服务器。它们以相同的初始状态开始,并且应该通过同意以哪个顺序处理哪个事件来保持同步。对我来说幸运的是,这些事件不是尽快处理的,而是在#34;中,以便我有时间让服务器在截止日期前达成协议
我建议查看"Getting Started" example or tutorial with Kafka,然后查看类似的ZooKeeper组织的消息/日志软件。祝你好运,享受!
答案 1 :(得分:0)
到目前为止,我还没有得到明确的答案,但我认为有兴趣看到我发现的内容会很有用。
以下是与该主题相关的一些理论讨论:
Dynamic Vector Clocks for Consistent Ordering of Events
Conflict-free Replicated Data Types
使多个concurent进程相互等待的一种方法,我可以用它来同步“批处理”是一个分布式屏障。一个Java实现似乎在Hazelcast之上可用,另一个使用ZooKeeper
我找到的一个更简单的替代方案是使用DB。每个进程都会将收到的所有事件插入到数据库中。根据数据库设计,这可以完全并发和无锁,例如在VoltDB中。然后以一秒的固定间隔运行一些“cron job”,选择并标记要在下一批中处理的事件。该作业可以在每台服务器上运行。第一个为一个批次运行作业会修复事件集,以便其他人可以使用第一个定义的列表。就像我们一样,我们保证所有批次在所有服务器上都包含相同的事件集。如果我们可以在整个批处理中使用完整的订单(cron作业可以自行指定),那么服务器的状态将保持同步。