version control - ¿Cómo gestionar múltiples clientes con reglas de negocio ligeramente diferentes?
version-control architecture (9)
Como se mencionó anteriormente, el control de la fuente no suena como una buena solución para su problema. Para mí, suena que es mejor tener una base de código única utilizando una arquitectura multiusuario. De esta manera obtendrá muchos beneficios en términos de administración de su aplicación, carga en el servicio, escalabilidad, etc.
Nuestro producto utiliza este enfoque y lo que tenemos es (mucha) funcionalidad central que es la misma para todos los clientes, módulos personalizados que son utilizados por uno o más clientes y en el núcleo una "personalización" es un simple motor de flujo de trabajo utiliza diferentes flujos de trabajo para diferentes clientes, por lo que cada cliente obtiene la funcionalidad principal, su propio flujo de trabajo y un conjunto extendido de módulos que son específicos del cliente o generalizados para más de un cliente.
Aquí hay algo para que comiences en la arquitectura multi-tenancy:
Hemos escrito un paquete de software para una industria de nicho particular. Este paquete ha sido bastante exitoso, en la medida en que hemos registrado a varios clientes diferentes en la industria, que nos utilizan como proveedor de soluciones alojadas, y muchos otros están llamando a nuestras puertas. Si logramos el tipo de éxito que buscamos, tendremos literalmente cientos de clientes, cada uno con su propio sitio web alojado en nuestros servidores.
El problema es que cada cliente viene con sus pequeñas personalizaciones y ajustes que necesita para sus propias circunstancias y circunstancias locales, a menudo (pero no siempre) en función de la legislación o burocracia local del estado o incluso del condado. Entonces, mientras que probablemente el 90-95% del sistema sea el mismo en todos los clientes, tendremos que construir y dar soporte a estas pequeñas personalizaciones.
Además, el sistema sigue siendo un trabajo en progreso. Hay mejoras y correcciones de errores que ocurren continuamente en el sistema central y deben aplicarse a todos los clientes.
Estamos escribiendo código en .NET (ASP, C #), MS-SQL 2005 es nuestro servidor DB, y estamos usando SourceGear Vault como nuestro sistema de control de fuente. He trabajado con sucursales en Vault anteriormente, y es genial si solo necesitas mantener 2 o 3 sucursales sincronizadas, pero estamos tratando de mantener cientos de sucursales, lo que es impensable.
Mi pregunta es: ¿Cómo recomienda que gestionemos todo esto?
Espero que las respuestas aborden aspectos como la arquitectura de objetos, la arquitectura del servidor web, la gestión de control de fuente, los equipos de desarrolladores, etc. Tengo algunas ideas propias, pero no tengo experiencia real en la gestión de algo como esto, y realmente lo apreciaría. Escuchar de personas que han hecho este tipo de cosas antes.
¡Gracias!
Esto no es algo que desee resolver con la administración de control de origen, sino dentro de la arquitectura de su aplicación.
Yo vendría con algún tipo de plugin como la arquitectura. Qué complementos usar para cada sitio web se convertiría en un problema de configuración y no en un problema de control de origen.
Esto le permite usar sucursales, etc. para las cosas para las que están destinados: desarrollo paralelo de código entre versiones (o tal vez incluso más). Cada complemento se convierte en un proyecto separado (o subproyecto) dentro de su sistema de código fuente. Esto también le permite combinar todos los complementos y su aplicación principal en una solución de estudio visual para ayudar con el análisis de dependencia, etc.
Acoplar sin apretar los diversos componentes en su aplicación es la mejor manera de hacerlo.
He usado algunas aplicaciones que ofrecen las siguientes personalizaciones:
- Las páginas web eran configurables: podríamos arrastrar campos fuera de la vista, ubicarlos donde queríamos con nuestro propio nombre para la etiqueta de campo.
- Agregue nuestras propias vistas o procedimientos almacenados y utilícelos en: cuadrículas de datos (junto con un proceso de actualización) e informes. Cada cliente necesitaría su propia base de datos.
- Mapeo personalizado de archivos de Excel para importar datos al sistema.
- Añade nuestros propios campos calculados.
- Capacidad para ejecutar scripts personalizados en formularios durante varios eventos.
- Identificar nuestros propios campos personalizados.
Si sus clientes son empresas más grandes, casi necesitará su propio SDK, API, etc.
Layer la aplicación. Una de esas capas contiene personalizaciones y debería poder retirarse en cualquier momento sin afectar el resto del sistema. Los "disparadores" a nivel de la aplicación y de la base de datos (citados porque pueden o no emplear los disparadores reales de la base de datos) que llaman al código específico del cliente o están parametrizados con claves del cliente) son muy útiles.
El núcleo nunca debe personalizarse, pero debe colocarlo en algún lugar, incluso si se trata de un filtrado web simple.
Lo que tenemos es una base de datos central que tiene la funcionalidad que todos los clientes obtienen. Luego, cada cliente tiene una base de datos separada que contiene las personalizaciones para ese cliente. Esto es caro en términos de mantenimiento. El otro problema es que cuando dos clientes solicitan una funcionalidad similar, a menudo se realiza de manera diferente por los dos equipos separados. Actualmente, se hace poco para compartir las custiomizaciones entre los clientes y hacer que las comunes se conviertan en parte de la aplicación central. Cada cliente tiene su propio portal de aplicaciones, por lo que no nos preocupa que un cambio en un cliente afecte a otro cliente.
En este momento estamos considerando cambiar un proceso utilizando un motor de reglas, pero existe cierta preocupación de que el rendimiento no estará allí para la cantidad de registros que necesitamos para poder procesar. Sin embargo, en sus circunstancias, esta podría ser una alternativa viable.
Nuestro software tiene requisitos muy similares y he aprendido algunas cosas a lo largo de los años.
En primer lugar, tales personalizaciones le costarán tanto a corto como a largo plazo. Si tiene control sobre él, coloque algunos controles y balances de modo que las ventas y el marketing no vendan las personalizaciones con demasiada celosidad.
Estoy de acuerdo con los otros carteles que dicen NO usar el control de código fuente para gestionar esto. Debe estar integrado en la arquitectura del proyecto siempre que sea posible. Cuando comencé a trabajar para mi empleador actual, el control de fuente estaba siendo utilizado para esto y rápidamente se convirtió en una pesadilla.
Utilizamos una base de datos separada para cada cliente, principalmente porque para muchos de nuestros clientes, la ley o el cliente lo requieren debido a cuestiones de privacidad, etc.
Yo diría que las diferencias en la lógica de negocios probablemente han sido la parte menos difícil de la experiencia para nosotros (su millaje puede variar según la naturaleza de las personalizaciones requeridas). Para nosotros, la mayoría de las variaciones en la lógica empresarial se pueden dividir en un conjunto de valores de configuración que almacenamos en un archivo xml que se modifica en el momento de la implementación (si es específico de la máquina) o se almacena en una carpeta específica del cliente y se mantiene en control de origen (se explica abajo). La lógica de negocios obtiene estos valores en tiempo de ejecución y ajusta su ejecución adecuadamente. Puede usar esto junto con varios patrones de estrategia y de fábrica, los campos de configuración pueden contener nombres de estrategias, etc. Además, las pruebas unitarias se pueden usar para verificar que no ha roto cosas para otros clientes cuando realiza cambios. Actualmente, agregar la mayoría de los clientes nuevos al sistema implica simplemente mezclar / hacer coincidir los valores de configuración apropiados (en lo que respecta a la lógica de negocios).
Más de un problema para nosotros es la administración del contenido del sitio, incluidas las páginas / hojas de estilo / cadenas de texto / imágenes, que a menudo nuestros clientes desean personalizar. El enfoque actual que he tomado para esto es crear un árbol de carpetas para cada cliente que refleje el sitio principal; este árbol se encuentra en una carpeta llamada "personalizada" que se encuentra en la carpeta del sitio principal y se implementó con el sitio. El contenido colocado en el conjunto de carpetas específico del cliente anula o se combina con el contenido predeterminado (según el tipo de archivo). En el tiempo de ejecución, el archivo correcto se elige en función del contexto actual (usuario, idioma, etc.). El sitio se puede hacer para servir a múltiples clientes de esta manera. La eficiencia también puede ser una preocupación: puede usar el almacenamiento en caché, etc. para hacerlo más rápido (yo uso un VirtualPathProvider personalizado). El mayor problema con el que nos encontramos es la carga de probar visualmente todas estas páginas cuando necesitamos realizar cambios. Básicamente, para estar 100% seguro de que no ha roto algo en la configuración personalizada de un cliente cuando ha cambiado una hoja de estilos compartida, una imagen, etc., tendría que inspeccionar visualmente cada página después de cualquier cambio significativo en el diseño. He desarrollado cierta "sensación" con el tiempo sobre qué cambios se pueden hacer cómodamente sin romper cosas, pero de todos modos no es un sistema infalible.
En mi caso, no tengo otro control que ofrecer mi opinión sobre qué personalizaciones visuales / de código se venden, por lo que se han vendido e implementado MUCHOS más de los que me gustaría.
Otro gran recurso es la serie que hizo Ayende , que busca en su blog para multi-tenancy.
Sin más información, como los tipos de personalización específicos del cliente, solo se puede adivinar qué tan profundos o superficiales son los cambios. Algunos enfoques simples / estándar a considerar:
- Si puede mantener una configuración central que especifique la unicidad de cliente a cliente
- Si puede centralizar las reglas de negocio a una clase o grupo de clases
- Si puede almacenar las reglas comerciales en la base de datos y extraerlas en función del cliente
- Si todas las reglas de negocios pueden basarse en DB / SQL (cada cliente tiene su propia base de datos).
En general, las diferencias difíciles de codificación basadas en el nombre / id del cliente son muy problemáticas, mantener costosas bases de códigos por cliente es costoso (piense en el tiempo completo de prueba / reexamen requerido para el 90% que no cambia) ... Creo que más información es requerido para responder adecuadamente (dar algunos detalles)
Yo recomendaría no mantener sucursales de código separadas por cliente . Esta es una pesadilla para mantener el código de trabajo contra su Core.
Le recomiendo que implemente el Patrón de Estrategia y cubra sus "personalizaciones de clientes" con pruebas automatizadas (por ejemplo, Unidad y Funcional) cada vez que cambie su Núcleo.
ACTUALIZAR:
Recomiendo que antes de obtener demasiados clientes, debe establecer un sistema de creación y actualización de cada uno de sus sitios web. La participación actual se verá equilibrada por su flujo de ingresos actual, por supuesto, pero debe tener un final en mente.
Por ejemplo, cuando acaba de registrar el Cliente X (ojalá todo a través de la web), su sitio web se creará en XX minutos y le enviará un correo electrónico al cliente indicando que está listo.
Definitivamente desea configurar un entorno de integración continua (CI) . TeamCity es una gran herramienta, y gratuita.
Con esto en su lugar, podrá comprobar sus actualizaciones en un entorno de prueba y luego puede aplicar esos parches en sus instancias de producción.
Conclusión: una vez que supera a un puñado de clientes, debe comenzar a pensar en automatizar sus operaciones y su implementación como otra aplicación más para sí mismo.
ACTUALIZACIÓN: Esta post destaca los efectos negativos de las sucursales por cliente.