Как написать супербыстрое сокращение ссылок с помощью Elixir, Phoenix и Mnesia

1656536051 kak napisat superbystroe sokrashhenie ssylok s pomoshhyu elixir phoenix i

Бен Черч

1*_5mxMoPtToWHgTEyslbYnA
Это наша сцена, хотя настоящее действо происходит за кулисами.

Давайте начнем учебник этого месяца с двух утверждений, которые создадут у меня проблемы:

  1. Elixir – самый продуктивный язык.
  2. Bit.ly взимает гораздо больше своего платного плана

Elixir, фреймворк Phoenix и Erlang VM позволяют нам создавать готовые к производству системы быстро, легко и очень мало движущихся частей. На этом этапе можно увидеть, куда мы идем с этим. Давайте используем то, что выходит из коробки из Elixir, чтобы создать средство сокращения ссылок и предотвратить ежемесячный счет в 500 долларов.

Давайте погрузиться!

Начальная настройка

Прежде чем начать

Пожалуйста, убедитесь, что у вас есть:

  1. Эликсир
  2. Феникс

Создайте новый проект Феникс

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

В вашем терминале тип:

mix phx.new shorten_api --no-html --no-brunch

Обновите свои зависимости

Далее мы добавим несколько зависимостей к mix.exs. Идите и обновите deps/0 функция в этом файле будет выглядеть так:

Логика!

Хорошо базовые настройки. Это означает, что мы устанавливаем логику, которая:

  1. Позвольте нам сохранять URL-адреса
  2. Ссылка на эти URL по уникальному HashId (напр. abc123)
  3. Перейдите к /abc123 и он перенаправляет на URL, на который ссылается

Сначала создайте способ хранения этих ссылок.

Давайте используем встроенные генераторы Phoenix, чтобы сделать это для нас. В вашем терминале запустите:

mix phx.gen.json Links Link links hash:string:unique url:string:unique

Это создаст

  1. Links контекст
  2. Link модель
  3. Link контроллер
  4. Миграция базы данных

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

По умолчанию в этих системах моделям предоставляется id столбец в базе данных, являющийся числом, уникальным и автоматическим увеличением: 1, 2, 3 и так далее. В нашей системе мы хотим id быть:

  1. Короткий
  2. Уникальный
  3. строка
  4. Это автоматически генерируется.

Ecto делает это очень просто.

Первое, что нужно сделать, это создать собственный тип Ecto, который справится со всем этим за нас. Создайте новый файл shorten_api/ecto/hash_id.ex и заполнить его следующим образом:

То, что мы сделали выше, по сути создали новый тип, который можно использовать так же, как мы определяем поле как a String или an Integer. Теперь мы можем определить поле как a HashId.

Вы можете узнать больше об этом в документации Ecto.

Давайте сделаем это и обновим shorten_api/links/link.ex использовать а HashId поскольку это первичный ключ вместо an Integer:

Обновите миграцию

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

Ладно, это большинство наших шагов сантехники, теперь мы собираемся перейти к основной логике всего этого проекта.

Перенаправление с идентификатора на URL-адрес

Во-первых, нам нужна функция в нашем контроллере

  1. Берет ан Id а Link
  2. Смотрит вверх Link
  3. Перенаправляет на URL привязан к этому Link

Для этого давайте добавим новую функцию к нашему контроллеру ссылок, найденному здесь: shorten_api_web/controllers/link_controller.ex

Подключите все это к нашему маршрутизатору

Теперь, когда у нас есть эта новая функция контролера, единственное, что осталось, это подключить ее. Обновите router.ex файл, чтобы отобразить следующее:

Примечание: мы также добавим маршруты к mix phx.gen предложено раньше

ТА ДА! ?

На этом этапе вы сможете запустить проект с помощью mix phx.server и все работает, как ожидалось! Однако мы не останавливаемся на этом.

Секретный соус

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

Чтобы ускорить это, средства сокращения ссылок часто выбирают использовать хранилище данных в памяти, например Redis, а не базу данных на диске, например Postgres (которую Phoenix настраивает нам по умолчанию). К счастью, поскольку Elixir построен на основе виртуальной машины Erlang, у нас уже есть встроенное хранилище данных в памяти: Mnesia!

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

Переход с Postgres на Mnesia

Этот процесс действительно очень прост. Первое обновление config.exs как показано:

Создайте свою базу данных Mnesia

Затем создайте место, где Mnesia будет создавать резервные копии данных и инициализировать базу данных через Ecto:

mkdir priv/datamkdir priv/data/mnesiamix ecto.createmix ecto.migrate

Бум готов! Теперь вы используете базу данных In-Memory для хранения информации о ссылках. Разве это было нелегко?

Запустите

Теперь вы можете

  1. начать проект (опять для многих из вас):

mix phx.server

2. Создайте сокращенную ссылку через curl:

curl --request POST \  --url  \  --header 'content-type: application/json' \  --data '{ "link": {  "url": " }}'

3. Возьмите hash возвращен в ответ

{“data”:{“url”:”,"hash":"7cJY_ckq"}}

4. И получить соответствующее перенаправление, когда вы переходите к localhost:4000/{hash}:

1*5jbpF4xVkeo2K7UIQKJWXg

Заверните

Удивительно, как легко с помощью всех этих инструментов было создать быстрое, простое в обслуживании и простое в расширении средство сокращения ссылок. Здесь велика заслуга BEAM (Erlang VM), Хосе Валима (создателя Elixir) и Криса МакКорда (создателя Phoenix). Остальные похвалы касаются того, насколько проста идея сокращения ссылок, что никоим образом не оправдывает начальную цену в 500 долларов в месяц. До сих пор смотрю на вас Bit.ly.

? Это открытый код! вы можете найти его здесь, на Github

❤️ Я пишу только о программировании и удаленной работе. Если вы подпишитесь на меня в Twitter, я не буду тратить ваше время.

Добавить комментарий

Ваш адрес email не будет опубликован.