Какой самый эффективный способ создать интерактивную панель управления для больших данных с помощью .Net в Azure?

Гипотетический упрощенный сценарий:

У меня есть API Asp.Net Core 3, который принимает заказы на пиццу из Javascript. Заказана пицца, десериализую объект в C # API. У меня появился объект «Пицца»:

{
   "name": "Margherita",
   "date": "20201502",
   "amount": "10"
   "ingredients": ["tomato", "mozzarella"]
}

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

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

Каков наиболее современный и эффективный способ использования Microsoft Azure и C # для достижения такого результата?

Слишком много очередей, фабрик данных, озер, хранилищ, потоков и т. Д. Аналитических сервисов на выбор.

Я могу думать о двух способах:

1)

  • Отправляйте каждый заказ пиццы в очередь, такую ​​как очереди Service Fabric, очередь AzureStorage или концентраторы событий.
  • Удалите объекты из очереди, временно сохраняя их в памяти
  • После того, как в памяти окажется 10 тыс. Или более элементов, объедините их таким образом, чтобы удовлетворить будущие запросы, и сохраните их в CosmosDB вместо сохранения каждого отдельного заказа.
  • Это неэффективно для ЦП и ограничено в будущих запросах, но позволяет сэкономить на хранении, поскольку не хранится ни один объект, а только агрегированные данные.

2)

  • Отправляйте каждую пиццу в очередь, например в Центры событий или Stream Analytics.
  • Сохраните каждый отдельный объект в хранилище для «больших данных».
  • Используйте Apache Spark в Azure или аналогичный для запроса данных
  • Создайте рабочую роль, которая ежеминутно запрашивает набор данных и создает отдельные агрегированные записи, используя, например, «дату» в качестве ключа PartitionKey для отображения на панели управления.
  • Не уверены, имеет ли смысл удалять данные, чтобы сэкономить на хранении

Я думаю, что путь №2 - это лучший вариант, но я еще не определился с тем, какой «стек» лучше всего подходит для простой и рентабельной задачи.


person Francesco Cristallo    schedule 15.02.2020    source источник
comment
Можете ли вы описать, какие метрики и запросы вам нужны на панели инструментов? Например, Stream Analytics не подходит для выполнения запроса «покажите мне все заказы от Фреда за последний месяц», но отлично подходит для возврата постоянного потока обновленного «количества заказов в скользящем 5-минутном окне». В основном запрос фиксирован, и данные передаются в потоковом режиме (своего рода противоположность типичных запросов к базе данных, где данные довольно статичны, а запросы могут меняться)   -  person GregGalloway    schedule 16.02.2020
comment
Показатели / запросы похожи на «Покажи мне, сколько пицц было заказано вчера пользователем X» или «Покажи мне наиболее используемые ингредиенты в прошлом месяце» для всех заказов из города ХХ.   -  person Francesco Cristallo    schedule 16.02.2020


Ответы (1)


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

Если у вас есть постоянные запросы, такие как «количество пицц, заказанных в скользящем 5-минутном окне», то Azure Stream Analytics может выводить постоянный поток этих агрегатов.

Затем события заказа пиццы можно также заархивировать в хранилище BLOB-объектов для использования в какой-либо пакетной технологии. Например, выполняйте ежедневную или ежечасную загрузку в хранилище данных SQL Azure (недавно был произведен ребрендинг Azure Synapse Analytics). Затем ваше приложение может запускать запросы типа «самые популярные начинки для пиццы за последний месяц» в специальной манере. Комбинация этих технологий горячего и холодного путей должна работать лучше, чем попытки заставить все делать один инструмент.

Другой вариант - Spark. Я бы порекомендовал посмотреть потоковую передачу Spark в Azure Databricks. Вы должны иметь возможность выполнять агрегирование потоковой передачи, а также загружать дельта-таблицы для пакетных запросов для более старых периодов времени. Эта статья может дать вам пример.

person GregGalloway    schedule 16.02.2020