Недавно я наткнулся на старый пост Майкла Бли об известности DivShot и нынешнем члене команды Firebase. В посте Майкл описывает мою любимую архитектуру Firebase и дает ей имя:

🔥🔥🔥 FIRE Stack 🔥🔥🔥 [добавлен смайлик]

FIRE = (F) irebase + (I) nterface + (Re) субъекты

Firebase: база данных Firebase в реальном времени, в которой хранятся ваши данные.

Интерфейс: любое клиентское приложение - Android, iOS, Angular, React, Polymer и т. д.

Реакторы: серверные функции, которые реагируют на изменения в вашей базе данных Firebase.

Я использую эту архитектуру уже больше года, не называя ее. У других архитектур шикарные названия, почему не FIRE? Тем не менее, это фантастическая архитектура, которая может заставить вас навсегда отказаться от HTTP API. Конечно, мы будем использовать HTTP какое-то время, пока HTTP / 2 не возьмет верх, но нам больше не нужно писать HTTP.

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

Почему именно FIRE stack?

WebSockets: стек FIRE использует WebSockets. Самый быстрый HTTP-сервер не может превзойти WebSockets в тестах производительности. Конечно, HTTP / 2 поможет, если ваш сервер его поддерживает.

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

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

Возможность тестирования: функции Reactor являются дискретными и принимают в качестве входных данных снимки состояния Firebase. Написать интеграционные тесты так же просто, как отправить фиктивные объекты в очереди Firebase. И вы даже можете издеваться над своими снимками Firebase и писать невероятно быстрые модульные тесты, если хотите.

Время для примера!

Давайте запрограммируем и посмотрим, насколько на самом деле проста эта архитектура.

Следующая суть состоит из трех файлов. Я расскажу о каждом файле отдельно.

fires-stack.js

Это серверный процесс Node.js, в котором будет размещаться наша (RE) актор-функция. Он инициализирует Firebase, а затем начинает прослушивание конечной точки / queues-test / pressses с событием child_added. Обратный вызов - это функция реактора, которая будет обрабатывать элементы очереди по мере их добавления в конечную точку.

В этом примере есть простая функция реактора. Он устанавливает / queues-test / press / ‹uid› / response или … / error в зависимости от того, больше или меньше click.random чем 0,5. Затем функция реактора удаляет элемент очереди.

index.html

Это наше клиентское приложение или (я) интерфейс. Сначала он принудительно выполняет анонимную аутентификацию в целях безопасности, а затем добавляет задания в очередь к конечной точке / queues-test / press / ‹uid›. Одновременно с добавлением задания в очередь он прослушивает события child_added на той же конечной точке. Это позволит клиентскому приложению получать результаты … / response или … / error функции реактора. Обратите внимание, что функция реактора удаляет элемент очереди немедленно, поэтому вам нужно будет прослушивать события child_added, прежде чем функция реактора сможет удалить элемент очереди.

security-rules.json

Это основная ошибка в этой архитектуре. Помните, как index.html принудительно запускал анонимную аутентификацию в строке 26? Также помните, как index.html использовал firebase.auth (). CurrentUser.uid в строке 34?

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

В наших правилах безопасности есть два символа подстановки в пути: $ queue и $ uid. Каждый подстановочный знак будет применяться ко всем совпадающим путям, поэтому мы можем создать новый список очередей в / queues-test / clicks, и к этому узлу будут применяться те же правила, что и для / queues-test / прессы. Следующим и наиболее важным шагом является подстановочный знак $ uid, потому что он соответствует всем значениям currentUser.uid, которые наше клиентское приложение использует в строке 37 index .html.

Теперь, когда на нашем пути есть $ uid, мы получаем доступ к $ uid в наших правилах безопасности. В нашем клиентском приложении также есть сеанс анонимной аутентификации с Firebase, который дает нам доступ к auth.uid в наших правилах безопасности. Теперь мы предоставляем доступ для чтения и записи на основе простого теста на равенство.

«.Read»: «auth.uid == $ uid»,

«.Write»: «auth.uid == $ uid»

Суммируя

Непостижимая цель Firebase - создавать бессерверные статические приложения для Интернета, iOS и Android. Реальность большинства разработок такова, что вам понадобится сервер для чего-то, будь то разветвление данных, отправка электронной почты, завершение финансовых транзакций или что-то еще, требующее безопасной работы.

Но у нас уже есть база данных в реальном времени с невероятно быстрым соединением WebSockets, так почему бы не использовать ее вместо HTTP? Архитектура стека FIRE упрощает это, давая нам скорость WebSockets, безопасность Firebase и модульную архитектуру микросервисов для функций реактора Node.js.

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

Видео

Я опубликовал небольшое пошаговое руководство на YouTube, если вы хотите увидеть это в действии :)

Подпишитесь на мои обновления на Medium и / или YouTube, чтобы получать больше руководств по Firebase по мере их публикации.

Еще лучше, подпишитесь на мою БЕСПЛАТНУЮ Новостную рассылку Firebase 📬, чтобы получать все эти БЕСПЛАТНЫЕ подарки на свой почтовый ящик! Я уже упоминал, что это БЕСПЛАТНО ??? 💵 💵 💵 Это должно быть не менее 5000 долларов США. Вы же не хотите быть старым и седым, думая… Если бы я только подписался на« Новостную рассылку Firebase , когда у меня была возможность…»