Всегда нужно уметь признавать свои ошибки. Вот и я недавно жутко оплашался. Так сильно, что аж стыдно было. Именно поэтому и появился данный пост.
Итак, сегодня не будет разглагольствования, просто сразу перейдем к делу. У меня была простая задача по обработке потока данных. Задачу можно сформировать так — есть датчики. Они генерируют упорядоченный набор событий. Нужно разработать горизонтально масштабируемую систему, которая будет обрабатывать события, сохраняя исходный порядок. Усложнение — каждый сигнал нужно обработать один раз.
Рассмотрим пример. Пускай в системе есть два датчика — А и B. Тогда эти датчики будут генерировать события A1, A2, A3, … , AN и B1, B2, … BN. Мы не имеем право обработать, например, сначала событие А2, а затем А1. Или, сначала B3, а затем B1. При этом, порядок обработки событий от разных датчиков не важен. То есть, можно сначала обработать, событие B2, а затем событие А1.
Какое наивное решение у этой задачи? Давайте обрабатывать поток событий в один поток на одном сервере приложения. Тогда порядок не будет нарушен, так как обработка данных происходит сериализованно. Конечно же, это решение не подходит под требование — горизонтальной масштабируемой системы. Поэтому идем дальше.
Мне почему-то в голову пришла идея, за которую мне стыдно и по сей день.
Извините, вам это ничего не напоминает? Мне — да. Мой возбужденный мозг просто украл практически полностью принципиальную схему работы Кафки. При этом, релеазиация моего решения супер дорогая, а еще там можно наделать кучу ошибок.
К счастью, моё решение было благополучно выкинуто, и была использована Кафка, которая замечательно решает мою задачу.
Второе решение бьёт моё просто по всем фронтам. Оно стоит в миллион раз дешевле. Оно в десятки раз надежнее. Оно пишется в 10 строк на любом популярных языке.
Говорят, что неопытные собеседующие часто задают кандидатам те вопросы, ответы на которые сами прочитали недавно. Мой ли это случай? Действительно ли я, читая некоторое время про реализацию консенсусов, а также разработку распределенных систем, не увидел самого простого и правильного решения? Не знаю, выглядит, что так. Что же, это был отличный урок. Не всегда стоит бежать строить свои велосипеды, как бы здорово и увлекательно это не было.
Категории: Программирование