Учитывая следующие факты, есть существующий с открытым исходным кодом Java API (возможно, как часть некоторого большего продукта), который реализует алгоритм, позволяющий воспроизводимое упорядочение событий в кластерной среде:Есть ли 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 с открытым исходным кодом, но явный алгоритм, я бы тоже принял это как ответ и попытался реализовать его сам.
Вы вообще знакомы с распределенными алгоритмами? (Первый урок состоит в том, что вы не будете синхронизировать часы нескольких компьютеров.) –
Я не уверен на 100%, что я действительно понимаю, о чем вы просите, но IMO-то вроде актерской модели, скорее всего, приведет вас к пути , Существует ряд реализаций. Возможно, вам захочется заглянуть в что-то функциональное (например, Clojure). –
@LouisWasserman Я только что спросил у ServerFault: http://serverfault.com/questions/394967/what-is-a-realistic-average-time-difference-between-servers-in-the-same-lan Ожидаемая разница 10-20 мс, поэтому значительно ниже 1 секунды. Пакеты не должны обрабатываться точно в одно и то же время, их просто нужно обрабатывать с тем же содержимым и в том же порядке. –