Я бы сказал, что это больше вопрос экономики. Тем не менее, это призыв к суждению, который должен сделать инженер. Следовательно, я отвечаю.
Я делю свой ответ на четыре части:
- Управление рисками
- Стратегии
- Расходы
- Интуиция
Управление рисками
Таким образом, иногда ваш клиент не может получить ответ от сервера. Я предполагаю, что это не из-за программной ошибки (в противном случае решение состоит в том, чтобы исправить это, так что иди и сделай это). Вместо этого, это должно быть из-за случайной ситуации вне вашего контроля ...
Но не за пределами ваших знаний. Ты должен знать:
- Как часто это случается.
- Какое влияние это имеет.
Например, если сбой и повторная попытка происходят только около 2% времени, вероятно, не стоит их устранять. Если это происходит в 80% случаев, хорошо ... зависит ...
Сколько времени клиент должен ждать? И как это приводит к затратам ... вы видите, у вас небольшая задержка в обычном приложении, это, вероятно, не имеет большого значения. Если это важно, и у вас есть приложение в реальном времени или онлайн-видеоигра, это отвлечет пользователей, и вам, вероятно, лучше инвестировать в большее или большее количество серверов. В противном случае вы, вероятно, можете поместить сообщение «загрузка» или «ожидание сервера». Если задержка действительно велика (порядка десятков секунд), то она может быть слишком большой даже для обычного применения.
Стратегии
Как я уже говорил выше, есть несколько способов решения этой проблемы. Я предполагаю, что у вас уже есть реализация цикла try-fail-retry. Итак, давайте посмотрим ...
- Поместите загрузочное сообщение. Это дешево, помогает удерживать пользователей.
- Запрос параллельно. Может быть быстрее, все еще может потерпеть неудачу. Потребуется резервный сервер (может быть дорогим), будет тратить время сервера и сетевой трафик.
- Выполните параллельный запрос, чтобы стабилизировать работу более быстрого сервера и использовать его оттуда. Может быть быстрее, все еще может потерпеть неудачу. Потребуется резервный сервер (может быть дорогим), не будет тратить столько времени сервера и сетевого трафика.
Теперь обратите внимание, я говорю, что они все еще могут потерпеть неудачу. Если предположить, что запрос к серверу имеет 80% вероятности сбоя, то параллельный запрос к двум серверам имеет 64% вероятности сбоя. Таким образом, вам все равно придется повторить попытку.
Дополнительным преимуществом выбора более быстрого сервера и его дальнейшего использования является то, что более быстрый сервер также менее подвержен сбоям из-за проблем с сетью.
Что напоминает мне, если вы можете выяснить, почему запрос не выполнен, сделайте это. Это может помочь вам лучше управлять ситуацией, даже если вы не можете предотвратить сбои. Например, вам нужна большая скорость передачи на стороне сервера?
Еще немного:
- Разверните несколько серверов по всему миру и выберите сервер по геолокации.
- Выполните балансировку нагрузки на стороне сервера (выделенный компьютер будет принимать все запросы и перенаправлять их на ваши серверы, у вас может быть там параллелизм или лучшая стратегия балансировки).
И кто сказал, что вы должны сделать только один из них? Вы можете поместить сообщение о загрузке, запросить несколько серверов, которые распределены по всему миру, чтобы выбрать более быстрый и использовать его только после этого, при повторной попытке сбоя в цикле, и чтобы каждый из этих серверов был кластером машин с балансировкой нагрузки , Почему нет? Ну, стоит ...
Расходы
Есть четыре стоимости:
- Стоимость разработки (обычно очень дешевая)
- Стоимость развертывания (обычно высокая)
- Стоимость времени выполнения (зависит от типа приложения и бизнес-модели)
- Стоимость отказа (вероятно, низкая, но не обязательно)
Вы должны сбалансировать их.
Например, допустим, вы зарабатываете около доллара на одного довольного пользователя. Это у вас 3000 пользователей в день. То, что запросы терпят неудачу около 50% времени. И это 2% пользователей уходят без оплаты, когда запрос не удается. Это означает, что вы теряете (3000 * 50% * 2%) 30 долларов в день. Теперь предположим, что разработка новой функции обойдется вам в 100 долларов, а развертывание серверов обойдется вам в 800 долларов, а игнорирование затрат времени выполнения означает, что вы получите возврат инвестиций в ((100 + 800) / 30. ) 30 дней. Теперь вы можете проверить свой бюджет и принять решение.
Не считайте эти ценности представительными для реальности, я выбрал их для удобства математики.
Дополнения:
- Помните, что я также игнорирую детали. Например, у вас может быть небольшая стоимость развертывания, но вы платите за процессорное время, и вам нужно учитывать это.
- Некоторые клиенты могут оценить, если вы не тратите их пакет данных на избыточные запросы.
- Улучшение вашего продукта может помочь привнести естественную рекламу.
- Не забывайте альтернативные издержки. Должны ли вы разрабатывать что-то еще?
Дело в том, что если вы рассматриваете проблему с точки зрения балансирования затрат, вы можете оценить стоимость стратегий, которые вы рассматриваете, и использовать этот анализ для принятия решения.
Интуиция
Интуиция, если воспитывается на опыте. Я не предлагаю проводить такой анализ каждый раз. Некоторые люди делают, и это нормально. Я предлагаю вам иметь некоторое понимание этого и выработать интуицию для этого.
Кроме того, в области машиностроения, помимо знаний, которые мы получаем от реальной науки, мы также учимся на практике и собираем рекомендации о том, что работает, а что нет. Поэтому часто бывает мудро увидеть, в каком состоянии находится искусство ... хотя иногда вам нужно видеть за пределами своего района.
В этом случае я бы посмотрел на онлайн видеоигры. У них есть экраны загрузки, у них есть несколько серверов, они выбирают сервер в зависимости от времени ожидания, и они могут даже позволить пользователю переключать серверы. Мы знаем, что работает.
Я бы предложил сделать это вместо того, чтобы тратить сетевой трафик и серверное время на каждый запрос, а также помнить, что даже с резервным сервером может произойти сбой.