Saltar a contenido

Rosgan Meili Sync

Worker Python que mantiene el índice de Meilisearch sincronizado con MySQL en tiempo casi real, sin polling agresivo y sin dependencias externas más allá de la propia base de datos.

El problema que resuelve

Rosgan necesita búsqueda full-text de lotes (certificados) con filtros por categoría, provincia, consignatario, raza, peso, precio, y ordenamiento flexible. MySQL no escala bien para eso. Meilisearch sí, pero hay que mantenerlo actualizado cuando cambia cualquier dato relevante de un lote — y un lote está compuesto por datos de ocho tablas distintas.

La solución

flowchart LR
    A[MySQL\nTriggers] -->|INSERT IGNORE| B[(meilisearch_sync_queue)]
    B -->|cada 10s| C[sync_worker.py]
    C -->|upsert / delete| D[Meilisearch]
    E[ATRIBUTOS\nupdated_at] -->|chequeo cada ciclo| C
    C -->|PUT settings| D

Los triggers en MySQL detectan cualquier cambio en las tablas involucradas y escriben el certificado_id en una cola. El worker drena esa cola en cada ciclo, corre la query completa de lotes y hace upsert en Meilisearch. La tabla de cola es simple: un registro por certificado (PRIMARY KEY), así que si se editan 20 atributos del mismo lote en un segundo, solo se indexa una vez.

Características

  • Sin polling de tablas de negocio — los triggers hacen el trabajo sucio
  • Deduplicación automáticaINSERT IGNORE + PK garantizan una sola indexación por lote
  • Soporte upsert y delete — columna is_delete distingue ambos casos
  • Sync de atributos dinámicos — detecta cambios en ATRIBUTOS.updated_at y actualiza los settings del índice automáticamente
  • Dos modos de ejecución — daemon (loop infinito) o cron (una sola pasada)
  • Configuración por .env — cero hardcodeo

Inicio rápido

# 1. Configurar
cp .env.example .env
vi .env

# 2. Aplicar triggers y tabla de cola en MySQL
mysql -u root -p rosgan < meilisearch_triggers.sql

# 3. Correr
docker run -d \
  --name rosgan_meili_sync \
  --restart always \
  --env-file .env \
  mundoit/meilisearch-sync:latest