Победить

Топ-3 сложных боев с эликсиром | Отладка в производстве | 2020 г.

Все дело в пространстве

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

По поводу статьи это не так: -

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

Это для коллег-программистов, которым важны скорость и память :-)

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

Я не лучший рассказчик, но стараюсь заставить вас жить в этой истории.

1 - Незабываемая ошибка - забудьте очистить состояние процесса

Ага! Это не просто ошибка, это грубая ошибка. Мы все знаем, что Elixir / Erlang - это все о процессах, и процесс может взаимодействовать через сообщения, и у него есть стек, куча и очередь сообщений (почтовый ящик) в качестве пространство для сохранения состояния.

Начальное состояние тонкого процесса

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

Прибытие спойлеров

Помните, что если вы (какой-то другой процесс) что-то даете процессу, и этот процесс не имеет ничего, что могло бы вам вернуть, тогда он определенно поглощает ваши сообщения и становится смелее.

Помидор 🍅 в томатный сок 🍷 Обработка

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

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

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

Личный опыт

Sub: Поиск отелей от нескольких поставщиков

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

2. Перенаселение (переполнение спавна) может привести к нехватке еды (ресурсов).

Все мы знаем очаровательную детскую забавную сказку Том и Джерри, в которой Том всегда пытается ударить Джерри и Джерри - умный парень. Главный принцип сказки - Скорость против Умного. Том быстр, но не контролирует, а Джерри имеет и скорость, и контроль над ситуации.

Скорость - это хорошо, но без единообразия в коде - хуже.

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

Время подумать, порождая процесс

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

Проблематическая ситуация;)

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

Enum.map(rates, fn rate ->
... 
spawn(RateModule, :process_rate, [rate])
...
end)

Последствия скольжения

Не имея представления о будущих последствиях LOC (строчки кода) spawn(RateModule, :process_rate, [rate]), ее написал один из моих со-программистов.

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

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

Количество одновременных процессов в BEAM ограничено. Значение по умолчанию - 262144. При достижении лимита вы получите сообщение [ошибка] Слишком много процессов. Конечно, мы можем увеличить лимит на iex --erl '-P <num>'

Исторические эффекты

Это напомнило мне исторические эффекты, такие как эффект кобры и крысы во Вьетнаме.

Эффект кобры:
Когда есть много змей (кобра), правительство объявляет награду за убитую змею. Люди начали убивать змей за деньги.

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

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

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

Это также напомнило мне о великом высказывании

Думайте, прежде чем действовать.

Итак, чтобы порождать ребенка, скорость должна сочетаться с постоянством :-) LOL

3. Лучше лениться, чем никогда - потоки данных [Enum Vs Stream]

Enum - мой любимый модуль в Elixir. Он может сделать невозможное возможным независимо от сложности. Это помогает вам писать исчерпывающие строки кода.

Когда Enum хорош?

Enum хорош, когда у вас маленький размер (размер памяти). Я так рада помочь вам. Когда вы начали набирать вес (Память), он продолжает тянуться вниз. Чем больше памяти, тем медленнее работает Enum.

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

Поведение и концепции

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

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

Потоки удобны, когда вы имеете дело с файлами большего размера.

Личный опыт

Мне нужно загрузить hotel_images из файла, который содержит URL-адреса всех изображений отелей. Размер файла указан в гигабайтах.

Действия по уходу

Мы делали что-то вроде

"some file path"
|> File.read!()
|> String.split("\n")
|> Enum.map(&validate_image_url/1)
|> Enum.filter(&filter_invalid_images/1)
|> Enum.map(&download_image/1)
|> Enum.take(5)

Здесь мы проверяем URL-адрес изображения с помощью validating_image_url/1, он возвращает URL-адрес со статусом, а затем на основе статуса, который мы фильтруем filter_invalid_images/1 после загрузки с помощью download_image/1, и нас интересуют только 5 изображений.

Проблема с кодом

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

История строительства отца и двух сыновей

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

1. Bring down the Paves from roof of the other building.
2. Clean them by removing dust and excess.
3. Bring me 5 bricks.

Дети должны делать то, что велел его отец.

Старший сын был шустрее. Как только он прочитал первую инструкцию, он начал валить всю брусчатку из другого дома. На это у него ушло 30 минут. Прочитал вторую инструкцию по чистке. Он сел на землю и начал мыть тротуар. На уборку у него ушло еще 15 минут. Он увидел третью инструкцию, выбрал 5 брусчатки и пошел к своему отцу, и, к своему удивлению, отец уже завершил стену брусчаткой, принесенной младшим.

Младший некоторое время читал все инструкции перед тем, как приступить к работе. Прочитав все инструкции, он сообразил, что его отцу нужны 5 асфальтов. Итак, он просто обрушил 5 брусчаток, почистил и принес их отцу. Таким образом, он сэкономил время и силы.

В конце концов отец передумал.

Удачного кодирования !!

Присоединяйтесь к нашему каналу Telegram

Блэкодеры



«Blackoders
EAT 🍕 - CODE🐞 - SLEEP😴 Код, мысли и идеи Ресурсы по кодированию, советы, видео, статьи и новости Мы следим и собираем… t .меня"



Посетите репозиторий GitHub в разделе Советы по Killer Elixir

Рад, если вы внесете свой вклад в ★