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.