0.1.0 • Published 8 months ago

@kiz8/inngest-service v0.1.0

Weekly downloads
-
License
MIT
Repository
github
Last release
8 months ago

@reputation-management/inngest-service

Сервис для обработки событий с использованием Inngest в системе управления репутацией.

Установка

npm install @reputation-management/inngest-service

или

yarn add @reputation-management/inngest-service

Использование

Этот пакет предоставляет сервис для обработки событий с использованием Inngest. Он может быть развернут как отдельное приложение или интегрирован в существующее приложение Next.js.

Запуск как отдельное приложение

# Установка зависимостей
npm install

# Запуск в режиме разработки
npm run dev

# Сборка для продакшена
npm run build

# Запуск в продакшене
npm start

Синхронизация функций Inngest

# Локальная синхронизация
npm run sync

# Синхронизация в продакшене
npm run sync:prod

Структура проекта

  • app/ - Код приложения Next.js
  • functions/ - Функции Inngest для обработки событий
  • events/ - Определения событий

Лицензия

MIT

Inngest Service для Reputation Management

Выделенный микросервис для обработки Inngest событий и задач в приложении Reputation Management.

Обзор

Этот микросервис обеспечивает:

  • Единый API endpoint для Inngest (/api/inngest)
  • Изолированную обработку фоновых и асинхронных задач
  • Чистую интеграцию с Inngest Cloud
  • Работу с базой данных через Prisma ORM

Схема взаимодействия

┌───────────────┐         ┌──────────────────┐         ┌────────────────┐
│               │         │                  │         │                │
│  Web/Admin    │─────────▶ inngest-client   │─────────▶  Inngest Cloud │
│  Приложения   │         │  (общий пакет)   │         │                │
│               │         │                  │         │                │
└───────────────┘         └──────────────────┘         └────────┬───────┘
                                                              │
                                                              │
                                                              ▼
┌───────────────┐         ┌──────────────────┐         ┌────────────────┐
│               │         │                  │         │                │
│    Worker     │◀────────│  inngest-service │◀────────│  Триггеры и    │
│  (обработка   │         │  (микросервис)   │         │   события      │
│   данных)     │         │                  │         │                │
│               │         │                  │         │                │
└───────────────┘         └──────────────────┘         └────────────────┘
         │                         │
         │                         │
         ▼                         ▼
┌───────────────────────────────────────────────┐
│                                               │
│             Базы данных и API                 │
│             (PostgreSQL/Neon)                 │
│                                               │
└───────────────────────────────────────────────┘

Поток данных

  1. Отправка событий:

    • Фронтенд-приложения (Web/Admin) или серверные компоненты используют @reputation-management/inngest-client для отправки событий в Inngest
    • События включают: создание отзывов, запросы на анализ, запросы отчетов и т.д.
  2. Обработка событий:

    • Inngest Cloud доставляет события микросервису inngest-service
    • Микросервис запускает соответствующие функции для обработки каждого события
    • Функции обрабатывают данные асинхронно и независимо от основного приложения
  3. Интеграция с Worker:

    • Для сложной обработки данных используется Worker сервис
    • Worker может быть вызван через Inngest или напрямую
  4. Результаты обработки:

    • После обработки события, микросервис может:
      • Отправить новые события в Inngest для дальнейшей обработки
      • Сохранить результаты в базу данных
      • Вызвать внешние API

Функции

  • Анализ отзывов - анализ текста отзывов, определение тональности и ключевых слов
  • Генерация отчетов - создание отчетов по заведениям на основе собранных данных
  • Скрапинг данных - сбор отзывов и информации о заведениях из различных источников

Основные типы событий

Название событияОписаниеИнициаторОбработчик
review/createdСоздание нового отзываWeb/Adminanalyze-review.ts
review/analyze-requestedЗапрос на анализ отзываWeb/Adminanalyze-review.ts
review/analyzedОтзыв проанализированInngest SvcClient apps
venue/scrape-requestedЗапрос на скрапинг данных заведенияWeb/Adminscrape-venue.ts
venue/scrapedДанные заведения собраныInngest SvcClient apps
report/requestedЗапрос на генерацию отчетаWeb/Admingenerate-report.ts
report/generatedОтчет сгенерированInngest SvcClient apps
test/eventТестовое событиеWeb/AdminЛюбой обработчик

Разработка

# Запуск в режиме разработки
pnpm dev

# Сборка
pnpm build

# Запуск тестов
pnpm test

# Проверка типов
pnpm typecheck

Интеграция Prisma с Vercel

Для правильной работы Prisma в Vercel serverless-окружении внесены специальные настройки:

  1. Автоматическая генерация Prisma клиента при каждом деплое:

    "scripts": {
      "vercel-build": "prisma generate && next build",
      "postinstall": "prisma generate"
    }
  2. Плагин для монорепозитория, который решает проблемы с отсутствием файлов Prisma engine:

    // next.config.js
    import { PrismaPlugin } from "@prisma/nextjs-monorepo-workaround-plugin";
    
    const nextConfig = {
      // ...
      webpack: (config, { isServer }) => {
        if (isServer) {
          config.plugins = [...config.plugins, new PrismaPlugin()];
        }
        return config;
      },
    };
  3. Connection pooling для эффективной работы в serverless-среде:

    • Используется NEONDB_URL_POOLING для пула соединений
    • Предотвращает исчерпание лимита соединений с базой данных

Деплой

Сервис настроен для деплоя на Vercel. Переменные окружения в vercel.json:

{
  "buildCommand": "pnpm run vercel-build",
  "env": {
    "INNGEST_SIGNING_KEY": "${INNGEST_SIGNING_KEY}",
    "INNGEST_EVENT_KEY": "${INNGEST_EVENT_KEY}",
    "NEXT_PUBLIC_VERCEL_URL": "${VERCEL_URL}",
    "NEONDB_URL": "${NEONDB_URL}",
    "DIRECT_DATABASE_URL": "${DIRECT_DATABASE_URL}",
    "NEONDB_URL_POOLING": "${NEONDB_URL_POOLING}"
  }
}

Переменные окружения для базы данных

  • NEONDB_URL - основное соединение с базой данных
  • DIRECT_DATABASE_URL - для миграций и прямого доступа
  • NEONDB_URL_POOLING - URL с пулом соединений для serverless-среды

Синхронизация с Inngest Cloud

После деплоя на Vercel необходимо выполнить синхронизацию с Inngest Cloud:

# Локальная синхронизация
pnpm sync

# Синхронизация продакшн версии
pnpm sync:prod

Интеграция с другими сервисами

Другие сервисы могут отправлять события в Inngest через общий клиент из пакета @reputation-management/inngest-client. Преимущества такого подхода:

  • Единые типы событий и интерфейсы между всеми сервисами
  • Централизованное управление событиями
  • Типобезопасность при отправке и обработке событий
  • Избегание дублирования кода

Пример использования

import { reviewEvents } from "@reputation-management/inngest-client";

// Отправка события
await reviewEvents.analyzeRequested({
  reviewId: "123",
  venueId: "456",
  text: "Отличное место, рекомендую!",
});

Структура проекта

apps/inngest-service/
├── app/                   # Next.js приложение
│   ├── api/               # API endpoints
│   │   └── inngest/       # Основной Inngest endpoint
│   │       └── route.ts
├── client.ts              # Реэкспорт клиента из общего пакета
├── events/                # Реэкспорт событий из общего пакета
│   └── index.ts
├── functions/             # Inngest функции
│   ├── analyze-review.ts  # Анализ отзывов
│   ├── generate-report.ts # Генерация отчетов
│   ├── scrape-venue.ts    # Скрапинг данных заведений
│   └── index.ts           # Экспорт всех функций
├── types.ts               # Реэкспорт типов из общего пакета
├── next.config.js         # Конфигурация Next.js с Prisma плагином
├── vercel.json            # Конфигурация Vercel
└── package.json           # Зависимости и скрипты

Зависимости

Основные зависимости:

  • @reputation-management/inngest-client: workspace:* - общий клиент для Inngest
  • @repo/database: workspace:* - пакет для работы с базой данных
  • @prisma/client: ^5.10.2 - клиент Prisma ORM
  • prisma: ^5.10.2 - инструменты Prisma CLI
  • @prisma/nextjs-monorepo-workaround-plugin: ^5.10.2 - плагин для корректной работы в монорепозитории
  • inngest: ^3.3.1 - библиотека для работы с Inngest
  • next: ^14.0.4 - фреймворк для приложения