2012-06-02 2 views
0

Учитывая следующие факты, есть существующий с открытым исходным кодом 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 с открытым исходным кодом, но явный алгоритм, я бы тоже принял это как ответ и попытался реализовать его сам.

+1

Вы вообще знакомы с распределенными алгоритмами? (Первый урок состоит в том, что вы не будете синхронизировать часы нескольких компьютеров.) –

+0

Я не уверен на 100%, что я действительно понимаю, о чем вы просите, но IMO-то вроде актерской модели, скорее всего, приведет вас к пути , Существует ряд реализаций. Возможно, вам захочется заглянуть в что-то функциональное (например, Clojure). –

+0

@LouisWasserman Я только что спросил у ServerFault: http://serverfault.com/questions/394967/what-is-a-realistic-average-time-difference-between-servers-in-the-same-lan Ожидаемая разница 10-20 мс, поэтому значительно ниже 1 секунды. Пакеты не должны обрабатываться точно в одно и то же время, их просто нужно обрабатывать с тем же содержимым и в том же порядке. –

ответ

1

Рассматривая вопрос и последующие действия, возможно, «не был» API для удовлетворения ваших требований. В день вы могли бы взглянуть на Кафке (от LinkedIn)

И общее понятие «журнал» лица, в том, что люди любят называть «большие данные»:

на самом деле ответ на свой вопрос, я начинал с блога о "журнале".В моих условиях, как он работает - И Кафка не только пакет из делать обработку журнала - Работает следующим образом:

  • Вместо очереди на основе передачи сообщений/публикации-подписки
  • Кафка использует «журнал» сообщений
  • Подписчики (или конечные точки) могут потреблять журнал
  • Журнал гарантирует, что он «в порядке»; она обрабатывает Giga-данные, быстро
    • Двойная проверка на гарантии, то, как правило, компромисс надежности
  • Вы просто читать журнал, я думаю, что читает разрушительны по умолчанию.
  • Если есть группа абонентов, каждый может «прочитать» до того, как закончится запись в журнале.

Основной процесс обработки (вычисления) для журнала - это модель Map-Reduce-Filter, поэтому вы читаете - все очень быстро; держи только то, что хочешь; обработать (уменьшить) результат (ы).

Недостаток, похоже, вам нужны скопления и прочее, чтобы он действительно сиял. Поскольку упоминались разные серверы или сайты, я думаю, что мы все еще в пути. Мне показалось, что при загрузке Apache можно запускать и запускать, потому что они склонны воспринимать не-Windows-среды (ho hum).

«быстрым» вариантом другой бы

Что потребуется вам сделать сантехнику для подключения различных серверов. Поскольку требования ...

серверы, принимающие события. Они начинаются с того же начального состояния и должны синхронизироваться, соглашаясь на какое событие обрабатывать в каком порядке. К счастью для меня, события не должны быть обработаны как можно скорее, но «в немного», так что у меня есть некоторое время, чтобы серверы договориться до крайнего срока

Я предлагаю смотреть на "Getting Started" example or tutorial with Kafka, а затем ищет в аналогичном ZooKeeper организовал программное обеспечение (ы) для сообщений/журналов. Удачи и наслаждайтесь!

0

До сих пор у меня нет четкого ответа, но я думаю, было бы полезно, если бы кто-нибудь заинтересовался тем, что я нашел.

Вот некоторые теоретические дискуссии, связанные с темой:

Dynamic Vector Clocks for Consistent Ordering of Events

Conflict-free Replicated Data Types

Один из способов сделать множественный процесс одновременно максимально ждать друг друга, что я мог бы использовать для синхронизации «партии» является распределенным барьером. Одна реализация Java, по-видимому, доступна в верхней части Hazelcast, а другая использует ZooKeeper

Одна простая альтернатива, которую я нашел, - использовать БД. Каждый процесс вставляет все события, которые он получает в БД. В зависимости от конструкции БД это может быть полностью одновременным и блокируемым, например, в VoltDB. Затем с регулярным интервалом в одну секунду запускается какое-то «задание cron», которое выбирает и маркирует события, которые будут обрабатываться в следующей партии. Работа может выполняться на каждом сервере. Первый, чтобы запустить задание для одной партии, фиксирует набор событий, так что другие просто используют список, который первый определил. Таким образом, мы гарантируем, что все партии содержат один и тот же набор событий на всех серверах. И если мы можем использовать полный заказ по всей партии, который задание cron могло бы указать, тогда состояние серверов будет храниться в синхронизации.

Смежные вопросы