На мой взгляд, должны быть определенные предварительные условия для написания кода для разработки приложений. Вы должны знать все входные данные для своего кода.

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

Вы не на самом деле понимаете, как работает ваш код. Вы думаете, что знаете, но это не так.

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

Это большой пробел в культуре разработки приложений. Этот разрыв существует потому, что трудно «успеть все». Но вам действительно не следует разрабатывать функцию, если вы не знаете, как она работает. И если вы хотя бы не сравнили лучшие и худшие сценарии, вы определенно не знаете, как это работает.

Во-первых, мы проходим этап исследования: что находится в нашей базе данных и что делают наши пользователи? Затем

Что есть в вашей базе данных?

Вы должны знать, как запрашивать вашу базу данных, и вы должны быть действительно хороши в этом.

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

Наконец, вы должны иметь возможность создавать эти данные, потому что это важная часть работы вашей функции.

Что делают ваши пользователи?

Вы должны знать, что ваши пользователи делают чаще всего и реже всего.

Вы должны быть в состоянии произвести взаимодействия, которые они делают. По крайней мере, вы должны иметь возможность выполнять curl команды, которые имитируют то, что они делают. В конечном итоге вы сможете использовать инструмент нагрузочного тестирования, чтобы имитировать то, что они делают.

Будь проще

Прежде всего, мы должны признать факты: мы никогда не делали этого раньше и не знаем, что делаем.

Давайте не будем делать это причудливым и сложным. Помните, что это еще одна причина, по которой мы здесь: мы ломаем шаблон преждевременной оптимизации разработчиков приложений. Мы признаем, что не знаем, как работает наш код. Мы переформулируем наш подход, чтобы исходить из первых принципов.

Мы находимся в процессе открытия: 1. мы узнаем, как работает наш код, и 2. мы узнаем, как раздавать и тестировать

Это подводит нас к нашей методологии посева и сравнительного анализа.

Методика посева

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

Вот некоторые вещи, которые обязательно должен делать ваш код заполнения:

он должен иметь возможность удалять данные

Если вы испортите свой посев, вы должны иметь возможность легко удалить эти данные, не создавая себе запястного канала. Это также облегчит повторное заполнение с другой конфигурацией.

данные из сеанса заполнения должны быть идентифицируемыми

Часто вам нужно различать группы данных для разных сценариев заполнения. Вам нужно будет знать размер данных, как они выглядят, и вы захотите удалить только их, не нарушая другие данные в вашем развертывании.

этот код должен быть работоспособным

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

  • Напишите код, который собирает большие массивы мусора как можно скорее. Не стоит недооценивать силу сборки мусора. Никогда не позволяйте создавать несколько массивов в одной и той же области действия функции.
  • Никогда не делайте много операций ввода-вывода подряд. Всегда выполняйте массовые запросы к базе данных для создания/удаления данных. Отправляйте свои данные партиями в свою базу данных.
  • Внедрите параллельную обработку.
  • Если вы хотите добиться ДЕЙСТВИТЕЛЬНО больших результатов при раздаче, подумайте о том, чтобы записать свои данные в файл, а затем загрузить эти файлы в свою базу данных. Таким образом НАМНОГО быстрее загружать миллионы объектов вместо того, чтобы иметь клиентский фрагмент базы данных через этот гигантский массив внутри вашей программы заполнения. Всегда записывайте эти файлы в каталог /tmp , чтобы, если вы заполните свой диск и ваша машина выйдет из строя, данные исчезнут при запуске. Например, если вы используете mongodb, для этого вы должны использовать mongoimport.

этот код должен быть простым и понятным

Вы должны понимать, что находится в вашем развертывании, иначе ваши результаты бенчмаркинга будут бессмысленными. Написание сводных функций данных также будет чрезвычайно полезным.

будь проще

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

Например, у всех веб-приложений есть запросы API, которые получают много вещей, а затем другие, которые получают только одну вещь. Имея это в виду, вы можете подумать о хороших и плохих сценариях производительности, которые создают такие шаблоны запросов.

Получить один

В сценарии «получить один» элемент плохие вещи случаются, когда этот один элемент связан со многими другими элементами, и все они извлекаются для создания ответа API.

Получите много

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

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

Почему бы просто не использовать исходную информацию из существующей базы данных?

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

По-прежнему полезно делать посев самостоятельно, потому что тогда вы полностью поймете, что «там».

Инструменты

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

Будьте готовы попробовать что-то другое, если ваш первый выбор не сработал. Каждый раз, когда я думаю про себя: «Ну и дела, это как-то сложно» или «О нет, только не это снова», это снижает оценку подхода или инструментов, которые я использую. В конце концов, пришло время попробовать что-то другое. Инструменты должны быть просты в использовании.

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

Инструменты для обработки и анализа данных

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

Инструменты для удаленной работы

Используйте scp для копирования данных на удаленную машину, чтобы вы могли запускать раздачу и тестирование без помех со стороны домашней сети, vpns и т. д., а затем ssh для фактического запуска.

Если есть вариант kubectl или docker, это делает жизнь еще проще: отправьте код раздачи/бенчмаркинга в качестве развертывания в свой кластер k8s или запустите его в контейнере докеров.

Инструменты для посева

Вы можете довольно быстро приступить к работе с bash и curl, так как они повсюду. Запуститеcurl в цикле for в bash. Перейдите непосредственно в командную строку для вашей базы данных и продублируйте объекты, добавьте немного другие параметры и снова вставьте их. В mongodb синтаксис командной строки — JavaScript. Вы можете сохранять данные, полученные из базы данных, в переменные и манипулировать ими с помощью JavaScript. Это делает создание большего количества данных в mongodb очень простым.

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