Что такое клиент серверное приложение

Android архитектура клиент-серверного приложения

Клиент-серверные приложения являются самыми распространенными и в то же время самыми сложными в разработке. Проблемы возникают на любом этапе, от выбора средств для выполнения запросов до методов кэширования результата. Если вы хотите узнать, как можно грамотно организовать сложную архитектуру, которая обеспечит стабильную работу вашего приложения, прошу под кат.

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

Конечно, сейчас уже не 2010 год, когда разработчикам приходилось использовать знаменитые паттерны A/B/C или вообще запускать AsyncTask-и и сильно бить в бубен. Появилось большое количество различных библиотек, которые позволяют вам без особых усилий выполнять запросы, в том числе и асинхронно. Эти библиотеки весьма интересны, и нам тоже стоит начать с выбора подходящей. Но для начала давайте немного вспомним, что у нас уже есть.

Раньше в Android единственным доступным средством для выполнения сетевых запросов был клиент Apache, который на самом деле далек от идеала, и не зря сейчас Google усиленно старается избавиться от него в новых приложениях. Позже плодом стараний разработчиков Google стал класс HttpUrlConnection. Он ситуацию исправил не сильно. По-прежнему не хватало возможности выполнять асинхронные запросы, хотя модель HttpUrlConnection + Loaders уже является более-менее работоспособной.

2013 год стал в этом плане весьма эффективным. Появились замечательные библиотеки Volley и Retrofit. Volley — библиотека более общего плана, предназначенная для работы с сетью, в то время как Retrofit специально создана для работы с REST Api. И именно последняя библиотека стала общепризнанным стандартом при разработке клиент-серверных приложений.

У Retrofit, по сравнению с другими средствами, можно выделить несколько основных преимуществ:
1) Крайне удобный и простой интерфейс, который предоставляет полный функционал для выполнения любых запросов;
2) Гибкая настройка — можно использовать любой клиент для выполнения запроса, любую библиотеку для разбора json и т.д.;
3) Отсутствие необходимости самостоятельно выполнять парсинг json-а — эту работу выполняет библиотека Gson (и уже не только Gson);
4) Удобная обработка результата и ошибок;
5) Поддержка Rx, что тоже является немаловажным фактором сегодня.

Если вы еще не знакомы с библиотекой Retrofit, самое время изучить ее. Но я в любом случае сделаю небольшое введение, а заодно мы немного рассмотрим новые возможности версии 2.0.0 (советую также посмотреть презентацию по Retrofit 2.0.0).

В качестве примера я выбрал API для аэропортов за его максимальную простоту. И мы решаем самую банальную задачу — получение списка ближайших аэропортов.

В первую очередь нам нужно подключить все выбранные библиотеки и требуемые зависимости для Retrofit:

Мы будем получать аэропорты в виде списка объектов определенного класса.

Создаем сервис для запросов:

Примечание про Retrofit 2.0.0
Раньше для выполнения синхронных и асинхронных запросов мы должны были писать разные методы. Теперь при попытке создать сервис, который содержит void метод, вы получите ошибку. В Retrofit 2.0.0 интерфейс Call инкапсулирует запросы и позволяет выполнять их синхронно или асинхронно.

Теперь создадим вспомогательные методы:

Отлично! Подготовка завершена, и теперь мы можем выполнить запрос:

Все кажется очень простым. Мы без особых усилий создали нужные классы, и уже можем делать запросы, получать результат и обрабатывать ошибки, и все это буквально за 10 минут. Что же еще нужно?

Однако такой подход является в корне неверным. Что будет, если во время выполнения запроса пользователь повернет устройство или вообще закроет приложение? С уверенностью можно сказать только то, что нужный результат вам не гарантирован, и мы недалеко ушли от первоначальных проблем. Да и запросы в активити и фрагментах никак не добавляют красоты вашему коду. Поэтому пора, наконец, вернуться к основной теме статьи — построение архитектуры клиент-серверного приложения.

В данной ситуации у нас есть несколько вариантов. Можно воспользоваться любой библиотекой, которая обеспечивает грамотную работу с многопоточностью. Здесь идеально подходит фреймворк Rx, тем более что Retrofit его поддерживает. Однако построить архитектуру с Rx или даже просто использовать функциональное реактивное программирование — это нетривиальные задачи. Мы пойдем по более простому пути: воспользуемся средствами, которые предлагает нам Android из коробки. А именно, лоадерами.

Лоадеры появились в версии API 11 и до сих пор остаются очень мощным средством для параллельного выполнения запросов. Конечно, в лоадерах можно делать вообще что угодно, но обычно их используют либо для чтения данных с базы, либо для выполнения сетевых запросов. И самое важное преимущество лоадеров — через класс LoaderManager они связаны с жизненным циклом Activity и Fragment. Это позволяет использовать их без опасения, что данные будут утрачены при закрытии приложения или результат вернется не в тот коллбэк.

Обычно модель работы с лоадерами подразумевает следующие шаги:
1) Выполняем запрос и получаем результат;
2) Каким-то образом кэшируем результат (чаще всего в базе данных);
3) Возвращаем результат в Activity или Fragment.

Примечание
Такая модель хороша тем, что Activity или Fragment не думают, как именно получаются данные. Например, с сервера может вернуться ошибка, но при этом лоадер вернет закэшированные данные.

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

Примечание
Все лоадеры должны работать с универсальным типом данных, чтобы можно было использовать интерфейс LoaderCallbacks в одной активити или фрагменте для разных типов загружаемых данных. Первым таким типом, который приходит на ум, является Cursor.

Еще одно примечание
Все модели, связанные с лоадерами, имеют небольшой недостаток: для каждого запроса нужен отдельный лоадер. А это значит, что при изменении архитектуры или, например, переходе на другую базу данных, мы столкнемся с большим рефакторингом, что не слишком хорошо. Чтобы максимально обойти эту проблему, я буду использовать базовый класс для всех лоадеров и именно в нем хранить всю возможную общую логику.

Loader + ContentProvider + асинхронные запросы

Предусловия: есть классы для работы с базой данных SQLite через ContentProvider, есть возможность сохранять сущности в эту базу.

В контексте данной модели крайне сложно вынести какую-то общую логику в базовый класс, поэтому в данном случае это всего лишь лоадер, от которого удобно наследоваться для выполнения асинхронных запросов. Его содержание не относится непосредственно к рассматриваемой архитектуре, поэтому он в спойлере. Однако вы также можете использовать его в своих приложениях:

Тогда лоадер для загрузки аэропортов может выглядеть следующим образом:

И теперь мы наконец можем использовать его в UI классах:

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

Эта модель стабильная, достаточно удобная для использования, но все же имеет недостатки:
1) Каждый новый лоадер содержит свою логику для работы с результатом. Этот недостаток можно исправить, и частично мы сделаем это в следующей модели и полностью — в последней.
2) Второй недостаток намного серьезнее: все операции с базой данных выполняются в главном потоке приложения, а это может приводить к различным негативным последствиям, даже до остановки приложения при очень большом количестве сохраняемых данных. Да и в конце концов, мы же используем лоадеры. Давайте делать все асинхронно!

Loader + ContentProvider + синхронные запросы

Спрашивается, зачем мы выполняли запрос асинхронно с помощью Retrofit-а, когда лоадеры и так позволяют нам работать в background? Исправим это.

Эта модель упрощенная, но основное отличие заключается в том, что асинхронность запроса достигается за счет лоадеров, и работа с базой уже происходит не в основном потоке. Наследники базового класса должны лишь вернуть нам объект типа Cursor. Теперь базовый класс может выглядеть следующим образом:

И тогда реализация абстрактного метода может выглядеть следующим образом:

Работа с лоадером в UI у нас никак не изменилась.

По факту, эта модель является модификацией предыдущей, она частично устраняет ее недостатки. Но на мой взгляд, этого все равно недостаточно. Тут можно снова выделить недостатки:
1) В каждом лоадере присутствует индивидуальная логика сохранения данных.
2) Возможна работа только с базой данных SQLite.

И наконец, давайте полностью устраним эти недостатки и получим универсальную и почти идеальную модель!

Loader + любое хранилище данных + синхронные запросы

Перед рассмотрением конкретных моделей я говорил о том, что для лоадеров мы должны использовать единый тип данных. Кроме Cursor ничего на ум не приходит. Так давайте создадим такой тип! Что должно в нем быть? Естественно, он не должен быть generic-типом (иначе мы не сможем использовать коллбэки лоадера для разных типов данных в одной активити / фрагменте), но в то же время он должен быть контейнером для объекта любого типа. И вот здесь я вижу единственное слабое место в этой модели — мы должны использовать тип Object и выполнять unchecked преобразования. Но все же, это не столь существенный минус. Итоговая версия данного типа выглядит следующим образом:

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

Отлично! Теперь напишем базовый класс для лоадеров:

Этот класс лоадера является конечной целью данной статьи и, на мой взгляд, отличной, работоспособной и расширяемой моделью. Хотите перейти с SQLite, например, на Realm? Не проблема. Рассмотрим это в качестве следующего примера. Классы лоадеров не изменятся, изменится только модель, которую вы бы в любом случае редактировали. Не удалось выполнить запрос? Не проблема, доработайте в наследнике метод apiCall. Хотите очистить базу данных при ошибке? Переопределите onError и работайте — этот метод выполняется в фоновом потоке.

А любой конкретный лоадер можно представить следующим образом (опять-таки, покажу только реализацию абстрактного метода):

Примечание
При неудачно выполненном запросе будет выброшен Exception, и мы попадем в catch-ветку базового лоадера.

В итоге мы получили следующие результаты:
1) Каждый лоадер зависит исключительно от своего запроса (от параметров и результата), но при этом он не знает, что он делает с полученными данными. То есть он будет меняться только при изменении параметров конкретного запроса.
2) Базовый лоадер управляет всей логикой выполнения запросов и работы с результатами.
3) Более того, сами классы модели тоже не имеют понятия о том, как устроена работа с базой данных и прочее. Все это вынесено в отдельные классы / методы. Я этого нигде не указывал явно, но это можно посмотреть в примере на Github — ссылка в конце статьи.

Вместо заключения

Чуть выше я обещал показать еще один пример — переход с SQLite на Realm — и убедиться, что мы действительно не затронем лоадеры. Давайте сделаем это. На самом деле, кода здесь совсем чуть-чуть, ведь работа с базой у нас сейчас выполняется лишь в одном методе (я не учитываю изменения, связанные со спецификой Realm, а они есть, в частности, правила именования полей и работа с Gson; их можно посмотреть на Github).

И изменим метод save в AirportsResponse:

Вот и все! Мы элементарным образом, не затрагивая классы, которые содержат другую логику, изменили способ хранения данных.

Все-таки заключение

Хочу выделить один достаточно важный момент: мы не рассмотрели вопросы, связанные с использованием закэшированных данных, то есть при отстуствии интернета. Однако стратегия использования закэшированных данных в каждом приложении индивидуальна, и навязывать какой-то определенный подход я не считаю правильным. Да и так статья растянулась.

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

Спасибо, что дочитали до конца. Удачной разработки!

Источник

Клиент-серверная архитектура в картинках

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

Знакомая картинка? А вы ведь постоянно сталкиваетесь с этой архитектурой — когда покупаете билет в кино онлайн, бронируете путевку на море или записываетесь к врачу.

На клиент-серверной архитектуре построены все сайты и интернет-сервисы. Также ее используют десктоп-программы, которые передают данные по интернету. Поэтому ИТ-специалисту нужно понимать, что это такое и как работает.

Об этом я и расскажу в статье. Объясню на пальцах, с примерами и забавными картинками =) Если вы больше любите видео-формат, можно посмотреть мой ролик на youtube на ту же тему.

Содержание

Что это и как работает

Вот есть у нас некий Вася, который решил купить машину. Такую, как в рекламе — быструю, мощную, красивую! Только стоит она как хвост самолета, у Васи таких денег нет.

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

Конечно, Вася может подкопить несколько лет, а потом уже покупать машину. Но ведь хочется здесь и сейчас! Да и средство передвижения нужно…

А еще Вася не умеет копить — получил зарплату, закупился основным, оплатил жилье, всё! Остальное можно потратить. Для таких людей есть банки, куда можно прийти и взять деньги в кредит.

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

Конечно, потом вы будете переплачивать, возвращая их назад. Проценты-то конские. Но зато уже сейчас можете позволить купить себе что-то дорогое.

Вася подумал, прикинул и сказал:

— Да, хочу именно так! 100 рублей с зарплаты платить в банк могу, а откладывать — нет. Потрачу.

Поэтому Вася идет в банк и говорит:

— Я Василий Иванов, хочу автокредит на 1000р.

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

У Кати есть специальная программа для проверки данных по клиентам. Эта программа может быть как web, так и desktop:

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

Катя вбивает в программу «Василий Иванов» и получает информацию по клиенту — есть ли он в черных списках? Была ли кредитная история раньше? И так далее. Но что происходит в потрохах приложения?

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

Катя ввела данные на клиенте. Но когда она нажала «проверить», клиент отправил запрос на сервер:

— Дай мне информацию по Васе Иванову!

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

Сервер отправил запрос в БД, базу данных:

— Select * from clients where fio = ‘Василий Иванов’. (Дай мне всю информацию по ФИО ‘Василий Иванов’)

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

— Вот тебе все, что нашла.

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

Сервер вернул эту информацию клиенту:

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

А клиент уже отрисовал ее для Кати:

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

— Ага, кредитная история хорошая.

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

И делает предложение Васе:

— Пожалуйста, если хотите взять кредит, то мы готовы выделить 1000р на 12 лет под 80% годовых. Устроит?

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

— Да, меня всё устраивает, давайте скорее деньги, и я побежал за машиной!
Все счастливы, все довольны.

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

Катя даже не догадывается, какой путь проделали данные в программе, когда она вбила туда ФИО своего клиента. Но мы с вами должны узнать, что же это за путь такой? И к чему все эти сложности? Почему именно такая структура? Почему есть клиент, почему есть сервер?

Зачем нужен клиент

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

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

Зачем нужен сервер

Клиентов может быть много. В примере с банком у нас может быть по 10 отделений в 10 городах России, а в каждом отделении по 10 операционисток. Тысяча Катек, и у каждой отдельный компьютер.

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

А мы ведь хотим, чтобы приложение работало быстро. Чтобы оно не тупило и не зависало, нервируя операциониста и заставляя клиента ждать. Значит, машина нужна мощная. Но если делать мощным каждый компьютер операциониста, денег придется вложить очень много!

Поэтому мы выносим всю основную логику на сервер. И вот его уже делаем мощным! А клиентские машины могут быть дешевыми, потому что на них остается лишь логика в стиле «запросить информацию и красиво отрисовать».

Нет дублирования кода

Если бы у нас были только клиентские машины, на каждой из них хранился бы одинаковый код по обработке логики, лежала вся база данных, все справочники террористов и прочая. Но так как сервер и БД вынесены в отдельные звенья, с клиентской машины освобождается куча места… И кода.

Не надо дублировать код, ведь вся основная логика вынесена на более мощный сервер.

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

На сервере и в базе хранится информация, недоступная простому операционисту. Это:

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

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

Зачем нужна база

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

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

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

БД (база данных) — отдельный программный продукт, который позволяет:

Да, базы может не быть. Но когда она есть, мы уверены в сохранности данных и легко можем по ним поискать.

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

Плюсы архитектуры

Резюмируем плюсы архитектуры:

Минусы архитектуры

Упало одно звено — все отдыхают

Если упал сервер или отвалилась база, то есть испортилось 1 звено — всё, все в ступоре, все отдыхают. Сотни, тысячи, да хоть миллионы клиентов если есть — никто не может работать. Все операционистки грустно смотрят на окно «Простите, что-то пошло не так» и разводят руками перед клиентом.

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

Именно поэтому в бизнес-критичном ПО архитектуру усложняют и даже дублируют. Банк с тысячами операционистов не может позволить себе простой. Поэтому они используют кластер серверов — один упал, остальные работают.

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

Как в таком случае клиент понимает, куда ему отправлять запрос?

Перед серверами ставят балансировщик, и клиент шлет запрос туда. Сколько бы серверов не поставили в кластер, клиенту это не интересно. У него есть один URL — адрес балансировщика.

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

И вот с клиента поступает запрос:

— Дай мне всю информацию по Васе Иванову.

— Ребята, новый запрос! Кто меньше загружен?

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

— У меня 5 запросов в очереди стоит.

Балансировщик отправляет запрос второму серверу.

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

Такая схема используется для высоконагруженного приложения — когда запросов поступает так много, что один сервер с ними просто не справляется.

Facebook, amazon, google — туда заходят миллионы пользователей. Один сервер с ними не справится. Поэтому ставят кластер, а балансировщик делит между ними нагрузку. И в таком случае в кластере может быть не 2 сервера, а 10, 15, сколько нужно, столько и ставим.

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

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

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

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

При этом может быть и схема холодного резерва — когда у нас второй сервер является резервной копией «на всякий случай». Все запросы идут на первый сервер, второй отдыхает.

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

Но если с первым сервером что-то случится и он помрет, балансировщик перенаправит нагрузку на второй сервер:

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

В это время у администраторов будет время разобраться с проблемой на сервере 1.

Схема холодного резерва используется тогда, когда один сервер способен выдержать нагрузку и выдавать хорошую скорость работы. Но приложение при этом бизнес-критичное и простой неприемлем.

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

Таким образом, схемы резервирования помогают нам устранить проблему «упало 1 звено — все отдыхают». Клиент никогда не узнает, что один или несколько серверов в кластере сдохли, у него всё как работало, так и работает.

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

Высокая стоимость оборудования

Сервера стоят дорого. Туда нельзя поставить обычный SSD как для домашнего компьютера. Почему? Потому что к железу для серверов совсем другие требования по надежности + есть поддержка специфичных функций:

— у HDD это специальная микропрограмма контроллера, которая оптимизирована для работы диска в RAID, дома это не нужно.

— у SSD это наличие группы конденсаторов, которые хранят энергию на случай отключения питания, чтобы хватило времени скинуть из DDR кэша данные в энергонезависимую память и данные не побились.

SSD — быстро работающий диск, HDD — обычный. RAID — когда мы N дисков вместе соединили, а DDR кэш — это оперативная память

Плюс у серверных решений гарантия обычно гораздо дольше: 5 лет, а не год.

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

По цене отличаются в 2 раза. Например, SSD:

Вроде не сильно отличается, да? Но смысл в том, что для дома 1 тб хватает за глаза — и фоточки все влезут, и кино, и куча приложений… А для базы данных иногда и 10 тб будет мало. А если делать кластер, то умножаем стоимость на 2, если не больше. Поэтому и разница в цене кажется огромная, но при пересчете на гигабайт небольшая выходит.

Не забывайте, что дома вам просто надо свои фоточки держать, да и те обычно в облаке. А на сервере бизнес-критичный функционал, который жрет дофига ресурсов и который надо дублировать на случай «вдруг первый сдохнет».

Нужно нанять сисадмина

Нам нужно нанять сисадмина, который будет следить за всеми нашеми серверами приложения и БД. Добавляем его зарплату к стоимости оборудования!

Что тестировать

Чтобы понимать, что тестировать, надо понимать, с чем имеет дело человек.

Пользователь работает с клиентом. Это может быть web или desktop приложение, не суть. Операционистке Кате дали рабочее место, показали какую программу запускать и как с ней работать. Она знать не знает о наличии серверов и БД, она работает только с клиентом.

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

Поэтому тестировщик в первую очередь проверяет клиент! Потому что сервер может работать идеально, вы можете даже написать тесты на уровне API и они все будут зелененькие, и кажется, что все зашибись! А пользователь загрузит отчет и увидит ошибку. Ой.

Сервер работает, на клиенте ошибка. И плевать на сотни «зеленых» автотестов. У пользователя все равно ошибка. И наша задача — посмотреть с его точки зрения.

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

Однако, если у вас есть доступ к серверу приложения и его базе данных — стоит проверять и их тоже! Так мы можем увидеть «будущий баг». Например:

— Ну, наверное, их и не заполняли.

А их заполняли! Просто сохранение криво сработало. Поэтому, если у нас только черный ящик, то нужно проверять, «а реально ли сохранились данные?». Сохранили? Откройте карточку в новом окне или вызовете информацию через API-метод.

Если доступ к базе есть — просто проверьте по ней, что все хорошо. Если есть доступ к серверным логам — проверьте их на наличие ошибок.

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

Помимо простых пользователей бывают злые люди, которые пытаются встрять в наше приложение и своровать деньги / данные. Они используют не клиент или сервер — туда у них доступа нет. Они пытаются перехватить данные в пути от клиента к серверу, или от сервера к БД.

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

Ну а раз нехорошие люди могут это сделать, то тестировщик тоже должен это уметь! Потому что тестировщик предоставляет информацию о нашем продукте.

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

Тестировщик изучает уязвимости и потом рассказывает команде:

— Ребята, вот я проверил, у нас есть такие-то и такие-то потенциальные дыры. Давайте подумаем, надо нам их как-то закрывать или нет.

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

Но какие-то базовые проверки типа sql-иньекций или XSS-атак стоит изучить и проверить на своем приложении. Хотя бы чтобы понять их критичность. Ведь если атака сломает клиент — ну и пусть, сам себе буратино. А если атака положит сервер, это уже не очень хорошо. И надо хотя бы знать, от чего это бывает.

Итого

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

Клиент — та программа, с которой работает пользователь. Он знать не знает, это у него на компьютере программа целиком, или где-то за ней прячутся сервер с базой, а то и целый RAID. Он работает в браузере или с desktop-приложением. И всё, что ему нужно знать — это «куда тут тыкать».

Клиенту не нужно много памяти, места на диске и других ресурсов. Поэтому рабочие места относительно дешево стоят. А это именно то, что нам нужно, особенно если нужно закупить оборудование для тысяч операционисток банка.

Сервер — компьютер, на котором хранится само приложение. Весь код, вся логика, все дополнительные материалы и справочники. Например, справочник адресов ФИАС или справочник юр лиц ЕГРЮЛ — они тоже занимают место, как сами по себе, так и в памяти приложения.

Иногда говорят «сервер приложения» и «сервер БД». Это нормально, ведь фактически сервер — это просто машина, компьютер. А базу и сервер приложения обычно хранят на разных машинах, ради безопасности. В таком случае, если говорят «сервер приложения» — речь о втором звене нашей схемы.

Приложения бывают самые разные. Есть ресурсоемкие, им нужно много памяти и места на диске. Есть «легкие», которые можно развернуть даже на домашнем компьютере.

БД (база данных) — хранилище данных. Тут вы можете легко поискать информацию + уверены в том, что она сохранится, даже если в приложении что-то сломается. Подробнее о ней — в статье «Что такое База Данных (БД)»

Сколько места нужно под базу, зависит от количества данных. Есть огромные базы в банках, где и 1тб будет мало. А есть совсем небольшие, которые вы можете установить на своей машине. Например, XAMPP можно поставить. И врядли вы напихаете туда столько данных, что у вас не останется под них место.

Отдельной базы может не быть, тогда структура станет двузвенной: клиент-сервер. И все!

Схема условная, в реальной жизни у нас как минимум будет больше клиентов. А если приложение высоконагруженное, то будет несколько серверов и несколько баз данных:

Что такое клиент серверное приложение. Смотреть фото Что такое клиент серверное приложение. Смотреть картинку Что такое клиент серверное приложение. Картинка про Что такое клиент серверное приложение. Фото Что такое клиент серверное приложение

PS — больше полезных статей ищите в моем блоге по метке «полезное». А полезные видео — на моем youtube-канале

Источник

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *