Создание отказоустойчивого мягкого веб-приложения в реальном времени с Erlang/OTP

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

В этих целях нет ничего необычного, но я хотел бы сделать сервис доступным 24/7, то есть сделать его отказоустойчивым. Более того, я бы хотел, чтобы он работал очень быстро и был очень отзывчивым.

Ниже приведен очень простой вид архитектуры для такого приложения.

система заказов магазина доставки пиццы

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

Вот мои вопросы:

  1. Какие элементы системы должны быть реплицированы для обеспечения отказоустойчивости и как мне это сделать? Я знаю, что могу хранить статус каждого транспортного средства (координаты, назначенные заказы и т. Д.) В реплицированной базе данных Mnesia. Это правильный путь?
  2. Какие службы хранения данных должны быть обычными на основе SQL (например, на основе boss_db), а какие должны быть сделаны в Mnesia, чтобы обеспечить очень быстрый ответ? Можно ли использовать обычную базу данных SQL для хранения записей и истории клиентов в таком отказоустойчивом и быстродействующем приложении?
  3. Должен ли я попытаться сохранить все данные обо всех службах (клиенты, состояние транспортных средств и т. Д.) В оперативной памяти, чтобы обеспечить высокую чувствительность приложения?
  4. Должен ли я хранить постоянные данные транспортного средства (идентификатор, емкость и т. Д.) В обычной базе данных SQL и хранить данные в реальном времени (координаты, назначенные заказы, заказы в магистрали и т. Д.) В базе данных Mnesia, чтобы сделать приложение более в режиме реального времени реагировать?

2 ответа

Решение

Прежде всего, это большой вопрос, но я постараюсь разбить его. Давайте сначала посмотрим на факты. Это веб-сервис. Это означает, что у нас есть эти слои: Web Server, Middle ware application а потом Data Storage, В большинстве приложений с высокой доступностью уровень хранения данных должен иметь избыточность через replication и нагрузка управляется через Distribution, В большинстве реальных приложений вам не нужно ничего хранить в ОЗУ, если только приложение не имеет реального характера в реальном времени, например Multi-player Game Server или же A telecom Switch, Таким образом, ваше приложение, в данном случае, действительно, не нуждается в оперативной памяти (может быть, какое-то caching здесь и там, как мы увидим.)

Теперь этот тип приложения включает в себя данные различного типа, информацию, которая не может иметь одинаковую форму одновременно, следовательно, использование RDMS заставит вас все упорядочить одинаково. Я предлагаю вам научиться использовать любые document oriented database, NoSQL DB или же key-value system потому что они хорошо смоделированы для реальных сложностей. Более подробную информацию о любом виде хранилища можно найти в этом файле PDF. Я предлагаю вам использовать базовый сервер Couch, на котором ваши данные будут просто JSON documents, schemaless и может развиваться по мере роста вашего приложения. Он поставляется с распространением и репликацией, так же, как это требовалось любому приложению. Вы можете добавлять или удалять серверы во время выполнения, и вся система просто продолжает балансировать себя. Это также идет с memcached встроенный для кеширования, поэтому для той части IN-Memory, о которой вы говорили, кеширование все сделает за вас.

После хранения давайте поговорим о промежуточном программном обеспечении. я хочу поговорить о веб-сервере как о промежуточном продукте. Вам понадобится очень стабильный веб-сервер, в зависимости от нагрузки и того, что вы хотите использовать Erlang, я предлагаю веб-сервер yaws и научиться работать с ним с помощью RESTFUL, используя appmods, Использование прокси Sunch как Nginx Infront кластера веб-серверов может помочь в управлении нагрузкой. По крайней мере, существует несколько способов балансировки нагрузки между веб-серверами. После этого вам потребуется приложение OTP. Приложение OTP не обязательно должно иметь gen_servers, Но, как вы узнаете, вы действительно обнаружите, где вам нужно распараллеливание или где вам нужен последовательный код. Однако беспокоиться о том, что вы хотите использовать то, что вы еще не освоили. Пожалуйста, следуйте этой веб-книге и этой книге Ориелли, чтобы помочь вам освоить все об Эрланге. Вы можете найти полезным попробовать Chicago Boss а также Mochiweb или же Misultin Http сервер библиотеки.

Еще одна вещь, которую я должен упомянуть о выполнении этого в Erlang, заключается в том, что вам необходимо освоить свои структуры данных и эффективный способ работы с ними. Плохой выбор структур данных может вызвать проблемы. Тестируйте и тестируйте все на каждом этапе. использование records везде, где это возможно, и проверьте потребление памяти на каждом этапе. Об этом вопросе есть что сказать, но, надеюсь, другие тоже отправят свои мысли.

Взломайте эту игру: https://github.com/synrc/games все вопросы в режиме реального времени, с малой задержкой, паб / саб, базы данных, вопросы архитектуры, написанные как современное программное обеспечение. Я предлагаю использовать gen_fsm для управления состояниями в вашем приложении, как это сделано в "нормальных" супервизорах. riak интегрирован с библиотекой kvs, которая также поддерживает социальные обновления. n2o выбрал ковбойский сервер, на мой взгляд, лучший сервер вокруг. http://www.ostinelli.net/a-comparison-between-misultin-mochiweb-cowboy-nodejs-and-tornadoweb/

Другие вопросы по тегам