Hola gente!
Alejandro, primer idea rapida:
- Un thread que lea los registros y los coloque en una cola en memoria
- n threads, cada uno consumiendo de esa cola en memoria
Asi no tenes que tener n threads compitiendo por la base, sino por algo mas manejado por vos como la cola en memoria.
Seria un caso del patro consumer-producer. Con un producer, y varios consumer.
Eso solo sirve para procesar en una maquina, en principio.
Grabaria en el registro que se toma y coloca en la cola en memoria, un time de cuando se tomo de la base. Y un time de cuando se termino de procesar.
Los registros con time de finalizacion en nulo, y digamos, time de inicio de proceso mayor a 30 minutos, los reprocesaria.
Hmmm... pero lo bloqueante sera que hay una sola maquina procesando. No se que tiene que hacer cada thread con el registro. Depende de eso, puede que no sea eficiente poner threads: llega un momento en que van a competir por los recursos compartidos. Se podra enviar la tarea a otra maquina? Y hacer escalamiento horizontal: agregar mas maquinas y ya esta.
No recuerdo bien la implementacion, pero el Queue channel del ejemplo
http://msmvps.com/blogs/lopez/archive/2010/01/29/queue_2D00_channels_2D00_in_2D00_ajsharp.aspx
deberia servir como ejemplo de cola en memoria, thread safe, con tamanio maximo, para que el productor se pare automaticamente si coloca algo en la cola-canal y este esta "lleno". Tendria que probarlo mejor con varios consumidores al mismo tiempo.
Una idea mas rara es usar agentes, cada uno con una cola de tareas:
http://msmvps.com/blogs/lopez/archive/2010/02/13/agents_2D00_in_2D00_ajsharp_2D00_part_2D00_1.aspx
el problema ahi es que si un agente se cae, los elementos de su cola se pierden. En el caso de Queue channel, la cola es una sola, y si se cae un consumidor, solo se pierde el elemento en proceso de ese consumidor.
Nos leemos!
Angel "Java" Lopez
http://www.ajlopez.comhttp://twitter.com/ajlopez