PHP JavaScript

Manejo de Tenant en Segundo Plano para Trabajos en devlog-ist/landing

Introducción

En el proyecto devlog-ist/landing, un sistema [descripción del proyecto, si estuviera disponible], nos encontramos con un problema al ejecutar trabajos en segundo plano relacionados con los tenants (inquilinos). Los trabajos fallaban debido a la falta del search_path del tenant durante la deserialización. Este post describe cómo abordamos y solucionamos este problema.

El Problema

Los trabajos en segundo plano, específicamente SendFirstPostEmailJob y AuditPostJob, requerían acceso a la información del tenant. El problema surgía porque la deserialización de los modelos ocurría antes de que se estableciera el search_path correcto para el tenant en la base de datos. Esto provocaba que las consultas a las tablas del tenant fallaran, interrumpiendo la ejecución del trabajo.

La Solución

Para resolver este problema, se modificó la forma en que se pasaba la información del tenant a los trabajos. En lugar de pasar instancias de TenantModel, se pasaron los IDs de tipo string. Dentro del método handle() de cada trabajo, se resolvió el tenant y los modelos correspondientes. Este cambio aseguró que el search_path del tenant estuviera configurado correctamente antes de acceder a las tablas del tenant.

// Antes:
class SendFirstPostEmailJob implements ShouldQueue
{
    public function __construct(TenantModel $tenant, Post $post)
    {
        $this->tenant = $tenant;
        $this->post = $post;
    }

    public function handle()
    {
        // Posible fallo: search_path no configurado
        // ...
    }
}

// Después:
class SendFirstPostEmailJob implements ShouldQueue
{
    public function __construct(string $tenantId, string $postId)
    {
        $this->tenantId = $tenantId;
        $this->postId = $postId;
    }

    public function handle()
    {
        $tenant = TenantModel::find($this->tenantId);
        $post = Post::find($this->postId);
        // search_path configurado al resolver el tenant
        // ...
    }
}

Beneficios

  • Robustez: Los trabajos en segundo plano ahora se ejecutan de manera confiable, incluso cuando involucran datos específicos del tenant.
  • Claridad: El código es más claro y fácil de entender, ya que la lógica de resolución del tenant está encapsulada dentro de los trabajos.
  • Mantenibilidad: Facilita el mantenimiento y la depuración, ya que el punto de acceso a los datos del tenant está bien definido.

Conclusión

Este cambio mejoró la estabilidad y confiabilidad de los trabajos en segundo plano en devlog-ist/landing. Al pasar los IDs en lugar de las instancias de los modelos y resolverlos dentro del handle(), evitamos los problemas de deserialización relacionados con la configuración del search_path del tenant. Esta solución simple pero efectiva resolvió un problema crítico y mejoró la experiencia general de la aplicación.

Manejo de Tenant en Segundo Plano para Trabajos en devlog-ist/landing
Gerardo Ruiz

Gerardo Ruiz

Author

Share: