Недавно мы начали небольшой проект по очистке того, как части наших систем взаимодействуют за кулисами в Buffer. Небольшой контекст: мы используем так называемую SQS (Amazon Simple Queue Service). Эти очереди действуют как комнаты ожидания для задач. Одна часть нашей системы отправляет сообщение, а другая забирает его позже. Думайте об этом как оставлять записку для коллеги: «Эй, когда у вас будет возможность, обработайте эти данные». Системе, которая отправляет заметку, не нужно ждать, пока ответ. Наш проект заключался в проведении планового обслуживания: обновлении инструментов, которые мы используем для локального тестирования очередей, и очистке их конфигурации. Но пока мы определяли, какие очереди мы на самом деле используем, мы обнаружили то, чего не ожидали: семь различных фоновых процессов (или заданий cron, которые представляют собой запланированные задачи, которые выполняются автоматически) и рабочие процессы, которые работали молча в течение пяти лет. Все они не делали абсолютно ничего полезного. Вот почему это важно, как мы их нашли и что мы с этим сделали. Почему это важно больше, чем вы могли бы подумать. Думаю, да, эксплуатация ненужной инфраструктуры стоит денег. Я быстро подсчитал, и за одного из этих работников мы бы заплатили ~ 360–600 долларов в течение 5 лет. Это скромная сумма в общей схеме наших финансов, но определенно пустая трата для процесса, который ничего не дает. Однако, после этой очистки, я бы сказал, что финансовые затраты на самом деле являются наименьшей частью проблемы. Каждый раз, когда к команде присоединяется новый инженер и исследует наши системы, он сталкивается с этими загадочными процессами: «Что делает этот рабочий. «делать?» становится вопросом, который съедает время адаптации и создает неопределенность. Мы все были там — смотрели на фрагмент кода, боясь прикоснуться к нему, потому что, возможно, он делает что-то важное. Даже «забытая» инфраструктура иногда требует внимания. Обновления безопасности, проблемы с зависимостями, исправления совместимости, когда что-то еще меняется. Это привело к тому, что наша команда тратила циклы обслуживания на пути кода, которые не служили никакой цели. И со временем институциональные знания исчезают. он ушел из компании много лет назад, и контекст ушел вместе с ними. Как это вообще происходит? Легко указывать пальцем, но правда в том, что это происходит естественным образом в любой долгоживущей системе. Функция устаревает, но поддерживающее ее фоновое задание продолжает работать. Кто-то «временно» запускает рабочий процесс для управления миграцией, и его никогда не срывают. Запланированная задача становится избыточной после архитектурного изменения, но никто не думает проверять. Раньше мы отправляли электронные письма о праздновании дня рождения в Buffer. Для этого мы запустили запланированное задание, которое проверило всю базу данных на наличие дней рождения, соответствующих текущей дате, и отправило клиентам персонализированное электронное письмо. Во время рефакторинга в 2020 году мы переключили наш инструмент транзакционной электронной почты, но забыли удалить этого исполнителя — он продолжал работать еще пять лет. Ничто из этого не является сбоем отдельных лиц — это сбой процесса. Без преднамеренной очистки, встроенной в нашу работу, энтропия побеждает. Как наша архитектура помогла нам найти его. Как и многие компании, Buffer использует микросервисы. Движение (популярный подход, при котором компании разделяют свой код на множество небольших независимых сервисов) много лет назад. Мы разделили наш монолит на отдельные сервисы, каждый со своим собственным репозиторием, конвейером развертывания и инфраструктурой. В то время это имело смысл: каждый сервис можно было развернуть отдельно, с четкими границами между командами. Но с годами мы обнаружили, что накладные расходы на управление десятками репозиториев перевешивают преимущества для команды нашего размера, поэтому мы объединились в единый мультисервисный репозиторий, но они все еще существуют. жить вместе в одном месте. Именно это и сделало открытие возможным. В мире микросервисов каждый репозиторий — это отдельный остров. Забытый работник в одном репозитории может никогда не быть замеченным инженерами, работающими в другом. Не существует единого места для поиска имен очередей, нет единого представления о том, что и где происходит. Собрав все в один репозиторий, мы наконец смогли увидеть полную картину. Мы могли отслеживать каждую очередь до ее потребителей и производителей. Мы могли обнаружить очереди с производителями, но не ссылающиеся на очереди. существовало дольше. Объединение не было предназначено для того, чтобы помочь нам найти зомби-инфраструктуру — но оно сделало этоОткрытие почти неизбежно. Что мы на самом деле сделали Как только мы определили бесхозные процессы, нам пришлось решить, что с ними делать. Вот как мы к этому подошли. Во-первых, мы проследили происхождение каждого из них. Мы изучили историю git и старую документацию, чтобы понять, почему каждый рабочий процесс был создан вообще. В большинстве случаев первоначальная цель была ясна: однократная миграция данных, функция, которая больше не используется, временный обходной путь, который изжил себя. Затем мы подтвердили, что они действительно не используются. Прежде чем что-либо удалять, мы добавили ведение журнала, чтобы убедиться, что эти процессы не делают незаметно что-то важное, что мы пропустили. В течение нескольких дней мы следили за тем, чтобы они вообще не вызывались, и постепенно удаляли их. Мы не удалили все сразу. Мы удалили процессы один за другим, отслеживая любые неожиданные побочные эффекты. (К счастью, их не было.) Наконец, мы задокументировали то, что узнали. Мы добавили в нашу внутреннюю документацию примечания о том, что изначально делал каждый процесс и почему он был удален, чтобы будущие инженеры не задавались вопросом, не пропало ли что-то важное. Что изменилось после очистки. Мы все еще находимся на ранней стадии измерения полного воздействия, но вот что мы уже видели. Наша инвентаризация инфраструктуры теперь точна. Когда кто-то спрашивает: «Какими работниками мы пользуемся?» мы действительно можем с уверенностью ответить на этот вопрос. Обсуждения в рамках адаптации также стали проще. Новые инженеры не сталкиваются с загадочными процессами и не задаются вопросом, не упускают ли они контекст. Кодовая база отражает то, что мы на самом деле делаем, а не то, что мы делали пять лет назад. Относитесь к рефакторингу как к археологии и предотвращению. Мой самый большой вывод из этого проекта: каждый значительный рефакторинг — это возможность для археологии. Когда вы глубоко погружены в систему и действительно понимаете, как ее части связаны между собой, вы находитесь в идеальной позиции, чтобы задаться вопросом, что еще необходимо. Эта очередь из какого-то старого проекта? Рабочий, который кто-то создал для однократной миграции данных? Запланированное задание, которое ссылается на функцию, о которой вы никогда не слышали? Они, возможно, все еще работают. Вот что мы встраиваем в наш процесс в будущем: Во время любого рефакторинга спросите: что еще касается этой системы, на что мы давно не смотрели? При объявлении устаревшей функции отслеживайте ее вплоть до ее фоновых процессов, а не только кода, работающего с пользователем. Когда кто-то покидает команду, документируйте то, за что он отвечал, особенно то, что работает в фоновом режиме. У нас все еще есть старые части нашей кодовой базы, которые не были перенесены в единый репозиторий. еще. Продолжая объединяться, мы уверены, что найдем еще больше этих скрытых реликвий. Но теперь мы настроены ловить их и предотвращать образование новых. Когда весь ваш код находится в одном месте, бесхозной инфраструктуре негде спрятаться.

You May Also Like

Enjoyed This Article?

Get weekly tips on growing your audience and monetizing your content — straight to your inbox.

No spam. Join 138,000+ creators. Unsubscribe anytime.

Create Your Free Bio Page

Join 138,000+ creators on Seemless.

Get Started Free