DEV Community

Carlos Arturo Castaño G.
Carlos Arturo Castaño G.

Posted on

Arquitectura de integración entre Web 2 y blockchain: un enfoque desacoplado

Arquitectura de integración entre Web 2 y blockchain: un enfoque desacoplado

En el desarrollo de aplicaciones que combinan la web tradicional (Web 2) con funcionalidades blockchain, es común enfrentar la necesidad de generar contratos inteligentes o NFTs desde una plataforma de gestión centralizada.

Inicialmente, este tipo de procesos se manejaba de forma convencional: invocando un servidor externo (por ejemplo, con Python o Node.js), ejecutando el proceso y esperando los resultados de manera síncrona.

# Ejemplo típico de llamada síncrona
python deploy_contract.py --network ethereum --params contract_data.json
Enter fullscreen mode Exit fullscreen mode

Si bien este enfoque puede funcionar en entornos controlados, presenta limitaciones importantes cuando se trabaja con blockchain:

  • Tiempos de confirmación variables
  • Posibilidad de fallos en cualquiera de las múltiples etapas del proceso
  • Necesidad de implementar mecanismos robustos de recuperación de errores

Problema clave: la gestión del control se vuelve más compleja que el propio objetivo de publicar información en la cadena de bloques.


El problema del acoplamiento directo

En una arquitectura típica, coexisten dos sistemas fundamentalmente independientes:

Sistema Características
Web 2 Servidores, bases de datos, lenguajes convencionales, arquitectura backend/frontend completa
Blockchain Protocolos propios, tiempos de confirmación variables, modelos de consenso, ejecución de contratos inteligentes

Cuando se intenta conectar ambos sistemas mediante llamadas directas (es decir, invocando funciones blockchain desde la aplicación Web 2), se genera un acoplamiento estrecho que obliga al sistema principal a gestionar:

  1. Reintentos automáticos
  2. Manejo de excepciones específicas de blockchain
  3. Sincronización de estados
  4. Validación de transacciones

La solución: desacoplamiento mediante un patrón de cola (spooler)

La mejor práctica en este tipo de escenarios es desacoplar los procesos. Para ello, se propone una arquitectura basada en tres componentes clave:

1. Definición clara de procesos blockchain

Se identifican y documentan los procesos que requieren interacción con la blockchain:

  • Creación de contratos inteligentes
  • Emisión de NFTs
  • Actualización de estados en la cadena

Cada proceso se diseña para responder de manera uniforme a operaciones CRUD (crear, leer, actualizar, borrar), siguiendo patrones convencionales de desarrollo.

# Ejemplo de definición de proceso
class BlockchainProcess:
    def create(self, params): pass
    def read(self, id): pass
    def update(self, id, params): pass
    def delete(self, id): pass
Enter fullscreen mode Exit fullscreen mode

2. Gestor independiente de contratos y NFTs

Se desarrolla un módulo especializado, completamente desacoplado del sistema Web 2, encargado de gestionar la lógica blockchain.

# Gestor independiente con pruebas unitarias
class ContractManager:
    def deploy_contract(self, contract_data):
        # Lógica específica de blockchain
        return contract_id

    def mint_nft(self, nft_data):
        # Lógica específica de NFT
        return nft_id
Enter fullscreen mode Exit fullscreen mode

Este módulo incluye:

  • ✅ Pruebas unitarias
  • ✅ Pruebas de integración
  • ✅ Validación con variables de prueba conocidas

3. Spooler (cola de mensajes)

Se implementa una cola o spooler donde la aplicación Web 2 deposita las solicitudes de procesamiento blockchain.

{
  "request_id": "uuid-12345",
  "process_type": "deploy_contract",
  "payload": { ... },
  "status": "pending",
  "created_at": "2026-08-01T10:00:00Z"
}
Enter fullscreen mode Exit fullscreen mode

Una vez que la solicitud se almacena en el spooler, la aplicación Web 2 queda liberada de cualquier responsabilidad sobre el proceso.


Flujo de procesamiento asíncrono

El sistema completo opera mediante los siguientes pasos:

sequenceDiagram
    participant Web2 as Aplicación Web 2
    participant Spooler as Cola (Spooler)
    participant Worker as Microservicio Blockchain
    participant Chain as Blockchain

    Web2->>Spooler: 1. Deposita solicitud
    Web2-->>Web2: 2. Continúa su ejecución
    Worker->>Spooler: 3. Monitorea nuevas solicitudes
    Worker->>Chain: 4. Procesa en la blockchain
    Chain-->>Worker: 5. Retorna resultado (ID, estado)
    Worker->>Spooler: 6. Actualiza estado
    Worker->>Web2: 7. Notifica resultado
    Web2->>Web2: 8. Actualiza procesos en espera
Enter fullscreen mode Exit fullscreen mode

4. Servicio de procesamiento asíncrono

Un microservicio monitorea el spooler y, al detectar nuevas solicitudes, las procesa utilizando la lógica blockchain correspondiente.

# Worker que procesa la cola
async def process_queue():
    while True:
        requests = await spooler.get_pending_requests()
        for req in requests:
            result = await contract_manager.process(req)
            await spooler.update_status(req.id, result)
            await notify_web2(req.id, result)
Enter fullscreen mode Exit fullscreen mode

Este servicio opera en los tiempos y condiciones propios de la blockchain, sin afectar el rendimiento del sistema principal.

5. Actualización de estados y notificación

El microservicio actualiza el spooler con los resultados del procesamiento:

  • ID del contrato o NFT creado
  • Variables de control
  • Estado de la transacción (pending, confirmed, failed)

Posteriormente, notifica a la aplicación Web 2, que actualiza los procesos que habían quedado en espera.


Beneficios de esta arquitectura

Este enfoque, que puede considerarse una API asíncrona entre Web 2 y DApp (blockchain), ofrece varias ventajas:

Beneficio Descripción
Desacoplamiento Cada sistema se ocupa de lo suyo: Web 2 gestiona la interfaz y lógica de negocio; blockchain se encarga de contratos e inmutabilidad
Resiliencia Los fallos en la blockchain no afectan la disponibilidad del sistema principal. Las solicitudes pueden reintentarse automáticamente
Escalabilidad El microservicio de procesamiento puede escalarse independientemente según la demanda
Mantenibilidad Al separar responsabilidades, el código es más fácil de entender, probar y mantener
Trazabilidad El spooler permite auditar todas las solicitudes y sus estados en cualquier momento

Consideraciones adicionales

Manejo de errores

try:
    result = await contract_manager.deploy_contract(data)
    await spooler.update_status(request_id, {"status": "success", "result": result})
except BlockchainError as e:
    await spooler.update_status(request_id, {"status": "failed", "error": str(e)})
    # El worker puede reintentar automáticamente según política definida
Enter fullscreen mode Exit fullscreen mode

Monitoreo y alertas

  • Implementar logs estructurados para cada solicitud
  • Configurar alertas cuando el spooler acumule muchas solicitudes pendientes
  • Monitorear tiempos de procesamiento promedio

Seguridad

  • Validar y sanitizar todos los datos antes de enviarlos a la blockchain
  • Implementar autenticación entre el microservicio y la aplicación Web 2
  • Usar variables de entorno para credenciales y claves privadas

Conclusión

La arquitectura propuesta sigue un patrón similar al de las API tradicionales (frontend → API → backend), pero adaptado a la integración entre Web 2 y blockchain.

Top comments (0)