Proceso con manejo de threads y SQL Server 2008

687 views
Skip to first unread message

Alejandro Ivan Fraenkel

unread,
Sep 14, 2010, 6:00:26 PM9/14/10
to altnet-...@googlegroups.com
Buenas tarde gente, extiendo el asunto del mail... Estoy diseñando un proceso que debera tomar y actualizar bloques de n cantidad de registros de una tabla y realizar sobre los mismos una serie de comprobaciones en codigo .net y luego actualizar los registros en base de datos. Se espera que en esta tabla se esten ingresando 2.5 millones de registros diarios que deberan ser procesados. Mi idea es manejarlo con un proceso que levantara n cantidad de hilos, cada uno de esos hilos marcara los registros que toma mediante un GUID o el threadId, de manera que otro hilo no tome el mismo registro procesara cada registro y luego lo desmarca. Estoy analizando si realmente esta es una opcion con "final feliz", si gestiono yo mi propio pool de hilos o uso el propio del fwk 3.5 (ThreadPool Class) y los problemas de concurrencia que pueda tener en la base de datos.

Alguna fuente con buen material para leer? Experiencias para comentar? o algun comentario interesante? Realmente no tengo mucha experiencia con este tipo de proceso y me gustaria escuchar en que puede hacer ruido esta idea para encararlo o experiencias para compartir...

Desde ya muchas gracias!!!


Saludos!

Alejandro 


Angel Java Lopez

unread,
Sep 14, 2010, 6:17:24 PM9/14/10
to altnet-...@googlegroups.com
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.com
http://twitter.com/ajlopez


2010/9/14 Alejandro Ivan Fraenkel <aifra...@gmail.com>
--
Has recibido este mensaje porque estás suscrito al grupo "AltNet-Hispano" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a altnet-...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a altnet-hispan...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/altnet-hispano?hl=es.

Angel Java Lopez

unread,
Sep 14, 2010, 6:19:42 PM9/14/10
to altnet-...@googlegroups.com
Ah! otras opciones, supongo que @cprieto tendras mas para comentar:

- Armar una tarea y enviarla a un Windows Workflow.
- Armar una tarea y enviarla a un Enterprise Service Bus

Y me imagino: armar una tarea, y enviarla a un worker de Azure, creo que @fabiomaulo estuvo con eso..

Walter Poch

unread,
Sep 14, 2010, 9:36:26 PM9/14/10
to altnet-...@googlegroups.com
Disculpen mi ignorancia, pero no aplicaría un paquete SSIS de SQL Server?

Saludos,

--
Has recibido este mensaje porque estás suscrito al grupo "AltNet-Hispano" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a altnet-...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a altnet-hispan...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/altnet-hispano?hl=es.



--
Saludos,

Walter G. Poch
Sr. .Net Developer
--------------------------------------------
Cell: +54 (9 341) 3353273
walte...@gmail.com

Cristian Prieto

unread,
Sep 14, 2010, 11:03:37 PM9/14/10
to altnet-...@googlegroups.com
+1 para SSIS o tu propio proceso de  ETL (por ejemplo, Rhino-ETL http://www.codeproject.com/KB/cs/ETLWithCSharp.aspx o Fluent-ETL http://fluentetl.codeplex.com/) para qué complicarse? el usar threads agregaría una porción más de complejidad (y bastante) además de varios puntos extras de falla...

Saludos!


Cristian Prieto


2010/9/14 Walter Poch <walte...@gmail.com>

Martín Salías

unread,
Sep 16, 2010, 8:56:08 AM9/16/10
to altnet-...@googlegroups.com
Adhiero a la propuesta de SSIS de los colegas.

Si esto te queda fuera de alcance por algún motivo, lo que deberías tener en cuenta en estos casos es tratar siempre de evitar la concurrencia, aplicando una estrategia de particionamiento.

Para eso, tenés que tener una fila sobre la que puedas aplicar tu algoritmo. Suponiendo lo más simple, que es tener una columna con un entero, deberías hacer que según la cantidad (n) de procesos que tengas atendiendo (podrías usar también Tasks en .NET 4), y usando módulo n hacés que cada uno tome sólo los registros que le tocan. Esto es una manera de no tener que "marcar" nada.

Claro, esto supone que la distribución de la columna sobre la que particionás tiene una distribución uniforme. Si no es así, podrías poner un router en memoria o en una cola, como mencionaba el Maestro @ajlopez.

Saludos,
---
Martín Salías
http://blog.Salias.com.ar



2010/9/15 Cristian Prieto <keme...@gmail.com>

Alejandro Ivan Fraenkel

unread,
Sep 23, 2010, 4:00:59 PM9/23/10
to altnet-...@googlegroups.com
Muchas gracias por todas las respuestas, ya estoy realizando pruebas sobre un prototipo :), la parte entretenida diria.
 
Debido a que ya tuvimos experiencias presentando la opcion de SSIS para otros requerimientos que no convencieron a quien aprobaria este diseño opte por el esquema productor-n consumidores, y tambien me di cuenta que de esta forma logro particionar sin tener que marcar los registros. Una solucion bastante Feliz, si rinde como espero.
 
Ahora, estoy buscando herramientas que me ayuden a probar este prototipo y quiza si el tiempo lo permite generar los escenarios y prototipar sobre estos. La busqueda de las herramientas la estoy realizando buscando algo que se parezca al "top" o "ps" de linux, como no tengo experiencia usando contadores del SO y el tiempo para aprender a usarlos es medio escaso opte por ese tipo de herramientas.
 
Alguna recomendacion sobre herramientas, links o bibliografia que me de buena info sobre esto?
 
 
 
Nuevamente muchas gracias y saludos!

Alejandro
Alejandro I. Fraenkel
.Net Software Developer

Cristian Prieto

unread,
Sep 23, 2010, 4:24:58 PM9/23/10
to altnet-...@googlegroups.com
Una sola herramienta: Sysinternal's ProcessExplorer.... Ahora si tienes Windows 2008/7 puedes probar con Windows Performance y Resource Monitor, mejor ayuda no creo que puedas conseguir :) [El Performance y Resource Monitor de Windows literalmente apalea al pobre ps y top, de hecho ProcessExplorer es lo que quiere ser Top y Task Manager cuando crezcan]

:)

(Ahora, para ver internamente como esta pasando todo en SSIS, recuerda que SSIS tiene contadores y visualizadores de datos, te aconsejo que te des una vuelta por ellos, asi puedes ver internamente todo lo que esta pasando, además, también hay performance counters para SSIS, los cuales obviamente puedes ver con el Performance Explorer...

Un poco más sobre .NET Performance Counters http://www.codeproject.com/KB/dotnet/perfcounter.aspx

Acerca de SSIS Performance Counters

Acerca de monitorear la Data Flow Engine de SSIS

Un poco acerca de Performance en SSIS


Espero que te sea de ayuda, Saludos!

--
Cristian

Cristian Prieto


2010/9/23 Alejandro Ivan Fraenkel <aifra...@gmail.com>

Alejandro Ivan Fraenkel

unread,
Sep 23, 2010, 5:06:06 PM9/23/10
to altnet-...@googlegroups.com
Genial! muchas gracias Cristian ya estoy jugando con Process Monitor de Sysinternals.
 
 
 
Saludos!
 
Alejandro

Angel Java Lopez

unread,
Sep 24, 2010, 3:23:33 PM9/24/10
to altnet-...@googlegroups.com
Hola gente!

Alejandro, sobre herramientas no sabria decirte.

Sobre concurrencia en general:
http://msdn.microsoft.com/concurrency
Me temo que casi todo es sobre .NET 4, pero es interesante, y supongo que se pueden sacar ideas:
http://msdn.microsoft.com/es-ar/concurrency/ee851578%28en-us%29.aspx
Sobre consumidor-productor
http://channel9.msdn.com/blogs/philpenn/blockingcollectiont-demonstration-in-producer-consumer-scenarios

Lastima que MS removio/desaparecio Parallel Task Library que venia antes para .NET 3.x.
2010/9/23 Alejandro Ivan Fraenkel <aifra...@gmail.com>
Muchas gracias por todas las respuestas, ya estoy realizando pruebas sobre un prototipo :), la parte entretenida diria.

Angel Java Lopez

unread,
Sep 24, 2010, 3:29:23 PM9/24/10
to altnet-...@googlegroups.com
Hola gente!

Encontre la Parallel Extensions para .NET 3.5 SP 1:

http://msdn.microsoft.com/en-us/concurrency/bb896007.aspx
Las palabras de busqueda es justo "Paralell Extensions" hay varios blogs que escribian sobre esa version.
2010/9/24 Angel Java Lopez <ajlop...@gmail.com>

Carlos Admirador

unread,
Mar 14, 2018, 4:14:15 PM3/14/18
to AltNet-Hispano
2.5 millones de registros diarios que deberan ser procesados, con SSIS finalmente ? Experiencias real world al manejar tal volumen de registros...?

Carlos Admirador

unread,
Mar 14, 2018, 4:17:54 PM3/14/18
to AltNet-Hispano
Cristian, proceso de  ETL (por ejemplo, Rhino-ETL http://www.codeproject.com/KB/cs/ETLWithCSharp.aspx o Fluent-ETL http://fluentetl.codeplex.com/) para manejar 2.5 millones de registros ? sería grandioso sin SSIS, y con Fluent-ETL. No sé la evolución que ha tenido Rhino-ETL, Fluent-ETL estos años, ni la monitorización de SSIS. Todo evoluciona con lecciones aprendidas, y sólo la experiencia real world de quién lo comparta

PD: ps, top ???



El jueves, 23 de septiembre de 2010, 22:24:58 (UTC+2), Cristian Prieto escribió:

Carlos Admirador

unread,
Jan 31, 2020, 7:35:37 AM1/31/20
to AltNet-Hispano
Experiencias real world para compartir?

Ariel Piñeiro

unread,
Feb 25, 2020, 10:21:28 AM2/25/20
to altnet-...@googlegroups.com
En la mayoría de casos las operaciones de escritura en la base de datos están limitadas, por lo cual no podemos escribir masivamente, no así para las lecturas que las hacemos en la réplica que tiene 24hs de delay, y por lo general podemos soportar la inconsistencia debido a que se usa para métricas/atribución de productos.

Esto último lo hacemos particionando en los algoritmos de ETL y lo pasamos a las tablas OLAP.

Slds,
Ari.


On Fri, Jan 31, 2020 at 9:35 AM Carlos Admirador <admirado...@gmail.com> wrote:
Experiencias real world para compartir?

--
Has recibido este mensaje porque estás suscrito al grupo "AltNet-Hispano" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a altnet-hispan...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/altnet-hispano/6b1bb388-3aee-43f4-9eae-fbbd9ebe96e7%40googlegroups.com.
Reply all
Reply to author
Forward
0 new messages