#azure
#azure
Вопрос:
В прошлом мы создавали нашу систему с использованием инфраструктуры обслуживания без состояния, где, поскольку у нас есть интерфейс API, который помещает элементы в очередь Azure, тогда были рабочие роли, обрабатывающие эти очереди. На бумаге это выглядело великолепно, как и то, как должно работать облако. По мере роста нашей очереди будет запускаться все больше экземпляров нашего приложения, которое является однопоточным, и каждый из них обрабатывает пакет из 30 элементов. По мере сокращения очереди они будут сокращаться.
Однако в итоге это сработало не так, как ожидалось. Azure автоматически масштабирует рабочий процесс только на основе элементов в очереди, а не ожидающих элементов. И поскольку элементы могли быть помещены в нашу очередь за 5 дней вперед, это оставило нас с кучей масштабируемых экземпляров, которые нам не были нужны. В качестве решения мы просто сохранили масштабирование наших экземпляров до максимального уровня, в котором мы нуждались, что в некотором роде отвлекло от всего облачного интерфейса. Кроме того, когда мы получали пакеты данных, иногда создавались резервные копии. В идеале мы хотим, чтобы наши данные обрабатывались за считанные секунды, но это занимало минуты, поскольку с помощью этой методологии можно было обрабатывать только столько данных одновременно.
Из-за особенностей работы облачных сервисов с ускорением и замедлением это было не только дорогостоящим, но и когда нам действительно нужно было добавить ресурсы, нам приходилось ждать более 10 минут, пока наши экземпляры запустятся. То есть мы вручную просматриваем очереди и настраиваем экземпляры в Azure. Я знаю, что мы можем разработать стороннее приложение для автоматического запуска вверх и вниз, но реальная проблема заключается в том, сколько времени требуется, чтобы просто добавить или удалить один экземпляр.
Из-за всех ограничений, с которыми мы столкнулись при работе с облачными сервисами, мы в конечном итоге вернулись к единому приложению, которое может обрабатывать добавление более 150 отдельных потоков, и каждый отчет о ходе выполнения возвращается к основному пользовательскому интерфейсу. За небольшую часть затрат и практически без использования системных ресурсов мы перешли от 40 экземпляров, постоянно работающих в облачных сервисах, к 150 потокам, работающим в любое время, с автоматическим масштабированием вверх и вниз по мере необходимости. Мы просто смотрим на то, что произойдет в ближайшие 3 минуты, и масштабируем наши потоки на основе этого.
Это одно приложение, масштабируемое вверх и вниз, работает отлично, как я и хотел бы, чтобы это происходило в облаке. Мы наблюдаем производительность, как никогда раньше, я могу видеть состояние всех потоков одновременно, и это очень низкие накладные расходы, поскольку каждый поток обрабатывает пакет из 30 элементов очереди, и каждая задача занимает около 2-3 секунд.
Теперь очевидным недостатком является то, что мы в основном возвращаемся к старому образу мышления, а используемая нами облачная инфраструктура — это не что иное, как виртуальная машина. Что, если это одно приложение выйдет из строя или компьютер перезагрузится? Что происходит, когда нам требуется больше вычислительной мощности? Как нам легко развернуть одно запущенное приложение WinForm? (Мы используем развертывание octopus, и оно выполняет только службы Windows) Как мы справляемся с 8 различными EXE-файлами, запущенными на рабочем столе?
Мы знаем, что должен быть лучший способ, при котором мы можем автоматически масштабировать один поток на основе нашей текущей рабочей нагрузки. Также, когда это выполняется в облаке, поэтому мы не ограничены управлением виртуальными машинами.
Я потратил добрых 6 часов на чтение service fabric, и это кажется отличным шагом в правильном направлении, однако я все еще не могу найти ни одного документа, который описывает наш вариант использования и лучший способ его настройки.
Как мне создать систему, которая автоматически масштабирует экземпляры одной задачи (потока) по мере необходимости, и когда каждая задача выполнена, решает, следует ли ее сворачивать, поскольку она больше не нужна? Я знаю, что мне понадобится родительский работник, который запускает эти экземпляры и сообщает каждому, нужно ли ему завершать работу по завершении. Однако я не могу найти никаких примеров кодирования / документов подобного проекта, который использует Azure.
Отличным вариантом использования был бы отправитель электронной почты:
— У нас есть приложение, которое помещает электронные письма в очередь с расписанием выхода.
— У нас есть второе однопоточное приложение, которое извлекает следующие 30 готовых к работе элементов из очереди и отправляет их.
— Что происходит, когда кто-то добавляет 25 000 элементов в очередь прямо сейчас? Мы хотим, чтобы электронные письма отправлялись, когда они должны, но как нам масштабировать это единственное приложение с 1 потоком, чтобы иметь несколько экземпляров. Как нам затем уменьшить количество потоков, которые больше не нужны после завершения?
Спасибо
Комментарии:
1. Вы смотрели
Azure Functions
? Насколько я понимаю, вам не нужно беспокоиться о масштабировании инфраструктуры самостоятельно.2. Я начал на этой неделе, точно так же, как я сделал service fabric. Я все еще нахожусь в основной проблеме: как мне масштабировать отдельные экземпляры в зависимости от моей рабочей нагрузки (очереди)? Масштабировать виртуальную машину в зависимости от использования легко, но как мы автоматически запускаем / затем закрываем ненужные задачи?
3. Я кратко прочитал о функциях Azure, и из того, что я понял, вам не нужно беспокоиться об этом. По сути, он предоставляет инфраструктуру без сервера (очень похожую на Amazon Lambda), которая автоматически масштабируется в зависимости от рабочей нагрузки. Если вам не нужен доступ к базовой виртуальной машине, я бы настоятельно рекомендовал взглянуть на нее и посмотреть, можно ли это использовать: azure.microsoft.com/en-us/blog/introducing-azure-functions .
4. Теперь я помню, почему я перестал смотреть на это. Во всех документах говорится, что триггер может возникать при добавлении элемента в очередь, и мне нужно, чтобы он запускался по истечении времени в очереди, а не только при добавлении. Я бы предположил, что это то, что они имеют в виду, но также было бы, если бы веб-службы Azure автоматически масштабировались на основе элементов, готовых к отправке в очереди, а не общего количества элементов в очереди, независимо от того, готовы ли они к отправке еще в течение 5 дней. Рассмотрим это подробнее. Спасибо!
Ответ №1:
Ваша проблема заключается не в том, как масштабировать инфраструктуру, а в том, как вы создаете свой рабочий процесс activity. Если вы хотите, чтобы очередь обрабатывалась только в определенное время (по истечении срока ее действия), а не при ее добавлении, вы думали о добавлении вторичной очереди, которая является вашей текущей рабочей нагрузкой, в отличие от будущей рабочей нагрузки в очереди?
Затем просто переместите элементы из очереди ожидания в «активную» очередь, когда вы хотите, чтобы они были использованы. На этом этапе вы можете рассчитывать на масштабирование экземпляра для использования рабочей нагрузки из активной очереди. Платформа, которую вы используете для выполнения рабочей нагрузки, является вашим выбором — функции, веб-задания, пакет и т.д.; Однако вы могли бы использовать приложения logic, чтобы помочь координировать часть рабочего потока и перемещать сообщения между очередями.
Комментарии:
1. Рассел, мы на самом деле делаем это сейчас, поскольку нам постоянно нужны материалы для работы в далеком будущем, и существует ограничение, я полагаю, в 7 дней в очередях Azure. Однако проблема с масштабированием очереди все еще возникала. Использование облачных сервисов просто не сработало, потому что масштабирование одного экземпляра заняло слишком много времени. Когда сообщение должно отправляться сейчас (иначе говоря, оно готово к отправке в очередь), мне нужно отправить его сейчас, а не через 5-10 минут, когда оно, наконец, масштабирует новые экземпляры. В идеале, хотя новые функции, такие как Functions, будут выполняться намного быстрее.
2. Мне все еще нужна рабочая настройка только для обработки очередей, но перемещение данных из одной в другую, вероятно, происходит очень быстро, поэтому для этого, вероятно, подойдет отдельное приложение. Но правильно, это именно то, что я ищу. Способ надежного масштабирования экземпляра. Собираюсь продолжить исследование функций, и, надеюсь, это работает намного лучше, чем облачные сервисы. Спасибо.
3. Службы и функции приложений будут масштабироваться намного быстрее, чем облачные сервисы да, поскольку контейнеры уже созданы и готовы к работе, с помощью CS ваша виртуальная машина должна быть подготовлена, развернута и развернута. Хотя это становится быстрее, это не будет так быстро, как службы / функции приложений.
4. ps. вы также можете посмотреть на ServiceBus вместо очередей хранения. ServiceBus может выступать в качестве посредника сообщений — это дороже, чем очереди хранения, но не имеет 7-дневного ограничения ttl.
5. Да, мы изучали это раньше и не переходили к ним просто из-за того, что работник, который переходит из длинной очереди ожидания в реальную очередь, был довольно простым дополнением. Спасибо за все отзывы!