Архітектура “Offline-First” з WatermelonDB і MongoDB

pic

Надання можливостей розробникам з GCP: безперебійне управління API для досягнення ваших цілей!
У сучасній розробці програмного забезпечення проєктування надійного та масштабованого API — лише половина справи. Важливою частиною є також розгортання цього API для користувачів і забезпечення безперебійної взаємодії з базами даних. Ось де на допомогу приходять Google Cloud Platform (GCP) та MongoDB!

У цій статті ми розглянемо, як крок за кроком реалізувати API на Go, яке взаємодіє з MongoDB на GCP. Від підключень до бази даних до процесів розгортання — ви отримаєте повне розуміння ефективного і потужного управління API. Готові дослідити цю потужну комбінацію? Тоді почнемо!

A. Створення та розробка вашого API-проєкту на Go

1- Якщо Go ще не встановлено на вашому комп’ютері, спочатку завантажте та встановіть останню версію Go. Потім, якщо у вас ще немає папки з назвою projects, створіть таку папку. Тепер створіть ваш Go-проєкт у папці projects, виконавши наступні команди.

cd projects  
mkdir example_api && cd example_api  
go mod init example_api

Результати будуть виглядати так:

pic

2- Відкрийте створену папку проєкту в IDE, яку ви використовуєте. Я рекомендую VS Code. Створіть структуру папок і файлів, як на зображенні нижче.

pic

Джерело коду цього проєкту доступне в моєму GitHub репозиторії:
https://github.com/enescerrahoglu/example_api

B. Створення проєкту MongoDB

Увійдіть в MongoDB Console.

1- Створіть проєкт. Потім створіть кластер. Ви можете вибрати потрібні налаштування при створенні кластера.

pic

2- Після процесу створення розгортання ви побачите значення імені користувача та пароля для користувача бази даних у розділі Connect to [Created Cluster]. Натисніть кнопку Create Database User. Після створення користувача бази даних перейдіть до наступного етапу, натиснувши кнопку Choose a connection method.

pic

3- На другому етапі виберіть опцію Drivers під заголовком Connect to your application.

pic

4- На третьому етапі Connect, переконайтеся, що вибрано драйвер Go. Відкрийте термінал і встановіть драйвери, перебуваючи у директорії проєкту.

go get go.mongodb.org/mongo-driver/mongo

Скопіюйте рядок підключення, вказаний на етапі 3. Переконайтеся, що ваш пароль є в connection string. Якщо Show Password вимкнено, увімкніть цей перемикач.

pic

5- Вставте connection string, який ви скопіювали, для ключа MONGO_URI у файл .env проєкту та збережіть файл.

pic

Потім завершіть процес у MongoDB Console.

6- Створіть базу даних і колекцію з назвою users для кластера, який ви створили.

Альтернативно, ви можете створити власне API.

Ось як налаштувати базову синхронізацію:

Backend API

  1. Використовуйте Node.js та Express для створення простого API.
  2. Встановіть MongoDB і підключіть його до сервера.
const express = require('express');  
const mongoose = require('mongoose');  

const app = express();  
app.use(express.json());  

// Підключення до MongoDB  
mongoose.connect('mongodb://localhost:27017/offlineFirstDB', {  
 useNewUrlParser: true,  
 useUnifiedTopology: true,  
});  

// Схема і модель  
const TaskSchema = new mongoose.Schema({  
 name: String,  
 is_completed: Boolean,  
 created_at: Date,  
 updated_at: Date,  
});  

const Task = mongoose.model('Task', TaskSchema);  

// Утиліта: Отримати записи, оновлені з певного часу  
app.get('/tasks', async (req, res) => {  
 const lastPulledAt = new Date(parseInt(req.query.lastPulledAt || '0', 10));  
 const tasks = await Task.find({ updated_at: { $gt: lastPulledAt } });  
 res.json({ tasks, timestamp: Date.now() });  
});  

// Утиліта: Застосувати вхідні зміни  
app.post('/tasks', async (req, res) => {  
 const changes = req.body;  

 // Обробити додані або оновлені завдання  
 if (changes.created) {  
 for (const task of changes.created) {  
 await Task.updateOne(  
 { _id: task.id },  
 {  
 $set: {  
 name: task.name,  
 is_completed: task.is_completed,  
 created_at: task.created_at,  
 updated_at: new Date(),  
 },  
 },  
 { upsert: true } // Додати, якщо не існує  
 );  
 }  
 }  

 // Обробити видалені завдання  
 if (changes.deleted) {  
 for (const id of changes.deleted) {  
 await Task.deleteOne({ _id: id });  
 }  
 }  

 res.status(200).send('Зміни синхронізовано успішно');  
});  

// Запустити сервер  
app.listen(3000, () => console.log('Сервер працює на порту 3000'));

Викликайте цю функцію під час запуску додатка або за певною дією користувача:

import { database } from './database';  
import { syncDatabase } from './sync';  

useEffect(() => {  
 syncDatabase(database);  
}, []);

Тестування додатка

  • Запустіть сервер backend: node server.js
  • Запустіть додаток React Native: npx react-native run-android або npx react-native run-ios.
  • Створюйте, оновлюйте та видаляйте завдання в офлайн-режимі, потім підключіться до інтернету, щоб побачити синхронізацію в дії.

Висновок

Реалізація архітектури "offline-first" з WatermelonDB і MongoDB забезпечує надійне рішення для додатків, що потребують високої продуктивності та безперебійної роботи в офлайн-режимі. Поєднуючи можливості локальної бази даних WatermelonDB з потужним бекендом MongoDB, ви можете створювати додатки, що забезпечують надійний користувацький досвід, навіть у складних умовах мережі.

Чи було це корисно?

Якщо ця стаття була корисною, будь ласка, знайдіть час, щоб прочитати деякі з моїх попередніх статей. Ваша підтримка та аплодисменти заохочують мене створювати ще більше корисного контенту, як цей. Дякую, що прочитали!
Репозиторій GitHub : https://github.com/vineetkrdixit/offlineSync

Перекладено з: Offline-First Architecture with WatermelonDB and MongoDB

Leave a Reply

Your email address will not be published. Required fields are marked *