domingo, 12 de enero de 2014

Workflows síncronos para auto numeración

Hola a todos, antes que nada….FELIZ 2014!
Imagino que todos están al día de que CRM 2013, tenemos la posibilidad de ejecutar los workflows de forma síncrona, sino ver por favor aquí: http://www.demianrasko.com/2013/10/workflows-sincronos-en-crm-2013.html
Los workflows de ejecución síncrona, nos abren una nueva ventana de posibilidades, que hasta ahora solamente eran posibles por medio de plugins, por ejemplo:
  • Auto numeraciones
  • Concatenaciones de campos
  • Validaciones
  • Cálculos
  • etc.
Uno de los plugins mas comunes que casi todos los implementadores han creado, es un plugin para gestionar auto numeraciones. Si bien Dynamics CRM contiene auto numeraciones para determinadas entidades como pedidos, casos, etc., esta numeración no es muy personalizable, y como parte de este código, el número que se incrementa no es 100% seguro que será único.
Ahora mismo hay varias publicaciones, que nos aportan ideas de como crear un workflow síncrono para aplicar auto numeraciones, en particular destaco los posts de dos colegas MVPs:
Por un lado, Shan nos proporciona una solución basada en dos entidades y un workflow síncrono, que nos permite de forma sencilla y sin tirar ni una sola línea de código, de disponer de un autonumerador basado en estos workflows síncronos.
Por otro lado, Jukka plantea la diferencia de realizar algo así con un workflow síncrono y otro igual pero asíncrono, explicando que si es asíncrono, nos generaría códigos duplicados ya que los procesos asíncronos se ejecutan de forma paralela (threads) y no podemos controlar el orden en que se ejecutan.
Recomiendo si les interesa el tema, leer estos dos posts, muy interesantes y rápidos de leer.
De todos, a mi me gusta ir un paso mas. He intentado confirmar si una solución de este tipo puede funcionar en un entorno real, o planteando que limitaciones podemos encontrar.
Me basé en la solución creada por Shan, en donde voy a numerar en el campo “Fax”, las cuentas que voy creando. Lo he realizado, y creando algunos registros de forma manual, funciona perfectamente:
image
Ahora bien, que pasa si creamos de forma masiva miles de registros? influye en algo la forma de crearlos? si los creamos como registros relacionados o “related” o utilizando ExecuteMultiple?
Bien, he creado un ejemplo de creación de miles de registros uno a uno llamando al CreateRequest, luego hice ejemplos con registros “related” (si alguién quiere mas información sobre esto, ir a la sdk: http://msdn.microsoft.com/en-us/library/gg309282.aspx) y por último con el ExecuteRequest.
Mis resultados no podían ser mejores y podía ver como a pesar de haber creado varios miles de registros, no encontraba duplicados:
image
De todos modos, esto no era un ejemplo de todo “estresado” y estaba seguro que si ejecutaba esos mismos códigos en paralelo en diferentes “Threads”, me crearía duplicados.
Entonces, me lancé la creación de estos registros con hasta tres hilos de ejecución:
image
Y encontré que efectivamente me generaba números repetidos hasta tres veces:
image
Está bien, esto tiene sentido, los workflows son síncronos, pero es posible que se intenten crear unos registros exactamente al mismo tiempo, y por lo tanto los numera iguales, no los ejecuta en orden sino en paralelo.
Por lo tanto, he de dar algunas conclusiones como finalización de mi estudio de este tema:
  1. Es una forma sencilla, rápida y sin tirar ni una sola línea de código para auto numerar registros con Dynamics CRM.
  2. Esta forma funciona correctamente (100% seguro) para cargas de datos automáticas que se ejecuten en un solo hilo o thread. No generando duplicados nunca.
  3. En caso de los registros a numerar se creen de forma manual, este tipo de soluciones es prácticamente al 99% seguro de que no habrá duplicados. Reproducir un ejemplo en el cual dos usuarios creen el mismo tipo de registros en el mismo milisegundo, es posible pero casi improbable. Ojo, tener en cuenta que puede ocurrir, en especial en entornos con muchos usuarios.
  4. Si hay procesos por ejemplos de cargas, que se ejecuten en varios hilos de ejecución, esta solución no es viable, ya que los códigos auto numéricos se duplicarán.
Por favor tener en cuenta estos temas, espero que les sirva.
un abrazo

2 comentarios: