Распределенное проектирование алгоритмов

Я читал "Введение в алгоритмы", и у меня в голове начали появляться некоторые идеи и вопросы. Больше всего меня озадачивает вопрос о том, как разработать алгоритм для планирования элементов/сообщений в распределенной очереди.

Мои мысли привели меня к просмотру Википедии по таким темам, как сортировка, очереди сообщений, планирование, распределенные хэш-таблицы, и это лишь некоторые из них.

Сценарий: Допустим, вы хотите иметь систему, которая ставит в очередь сообщения (например, строки или какой-либо сериализованный объект). Ключевая особенность этой системы - избежать единой точки отказа. Система должна быть распределена между несколькими узлами в рамках некоторого кластера и должна последовательно (или как можно лучше) выравнивать рабочую нагрузку на каждый узел в кластере, чтобы избежать "горячих точек".

Вы хотите избежать использования конструкции ведущий/ведомый для репликации и масштабирования (нет единой точки отказа). Система полностью избегает записи на диск и поддерживает структуры данных в памяти.

Поскольку это должна быть некая очередь, система должна иметь возможность использовать различные алгоритмы планирования (FIFO, Earliest deadline, round robin и т.д.), чтобы определить, какое сообщение должно быть возвращено при следующем запросе, независимо от того, на какой узел кластера сделан запрос.

Мои первоначальные мысли. Я могу представить, как это будет работать на одной машине, но когда я начинаю думать о том, как вы будете распространять нечто подобное, возникают следующие вопросы:

Как я буду хэшировать каждое сообщение?

Как я узнаю, на какой узел было отправлено сообщение?

Как я буду планировать каждый элемент, чтобы определить, какое сообщение и с какого узла должно быть возвращено следующим?

Я начал читать о распределенных хэш-таблицах и о том, как такие проекты, как Apache Cassandra, используют своего рода последовательное хэширование для распределения данных, но потом я подумал, что поскольку запрос не предоставляет ключ, мне нужно знать, где находится следующий элемент, и просто предоставить его... Это привело к чтению о протоколах peer to peer и о том, как они решают проблему синхронизации между узлами.

Итак, мой вопрос в том, как бы вы подошли к проблеме, подобной описанной выше, или это слишком надуманная и просто глупая идея...?

Просто обзор, указатели, различные подходы, подводные камни и преимущества каждого. Технологии/концепции/дизайн/теория, которые могут подойти. В общем, все, что может быть полезно для понимания того, как что-то подобное может работать.

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

UPDATE

Еще один интересный момент, который может стать проблемой - распределенные удаления. Я знаю, что такие системы, как Cassandra, решили эту проблему, реализовав HintedHandoff, Read Repair и AntiEntropy, и кажется, что они работают хорошо, но есть ли другие (жизнеспособные и эффективные) способы решения этой проблемы?

9
задан zcourts 6 October 2011 в 06:22
поделиться