SlideShare une entreprise Scribd logo
1  sur  77
@psluaces
Cómo migrar un producto
multiplataforma a .NET Core,
un caso práctico.
@psluaces
ORGANIZATION
PLATINUM SPONSORS
Thank you!
COLLABORATORS
@psluaces
@psluaces
pablo@plasticscm.com
Poco después de tener mi primer ordenador descubrí que me gustaba
más programar que jugar. Tenía 13 o 14 años y era un Amstrad PCW.
Para poder seguir programando monté una empresa en 2005.
Desarrollamos un control de versiones para competir con Perforce, IBM,
Microsoft, Subversion… y lo mejor vino luego: competir también con
Git.
Y todo lo desarrollamos en C# porque… ¿para qué complicarnos
menos?
Pablo Santos Luaces
Fundador y CTO (y también escribo posts y barro si hace falta)
@psluaces
Objetivo
Compartir nuestra experiencia
desarrollando multi-plataforma con
.NET/Mono/.NET Core
@psluaces
¿Quiénes somos,
qué es Plastic
y por qué está hecho
en .NET?
@psluaces
https://www.plasticscm.com/company/team
@psluaces
Desarrollamos productos de “version control”
@psluaces
Mandad una foto de vuestro badge a
@semanticmerge
@psluaces
Tenemos clientes muy variados
@psluaces
+3000 users +1200 users +500 users
@psluaces
¿Qué es Plastic?
Un control de versiones
muy bueno para trabajar en tareas,
muy potente con branches y merges,
que soporta grandes ficheros y grandes repos,
y muy visual
y fácil de usar (o eso intentamos).
@psluaces
14 años de evolución y +1.4M SLOC
93% C#
@psluaces
Componentes principales: servidor y clientes
• Cliente
• CLI
• GUI (Mac, Linux, Windows)
• Gluon – GUI simplificada para artistas en game development
• Merge tools + SemanticMerge
• Web interface (ASP.NET Core)
• Servidor
• Escalable y configurable
• Soporte de 7 bases de datos
• + Plastic Cloud (Azure)
http://blog.plasticscm.com/2018/10/all-software-we-write.html
@psluaces
Si queréis saber más de Plastic como producto
https://www.plasticscm.com/documentation
@psluaces
¿Qué pinta tiene?
@psluaces
@psluaces
@psluaces
@psluaces
@psluaces
@psluaces
SemanticMerge
@psluaces
@psluaces
Desarrollo
multiplataforma
desde 2005
@psluaces
Nos decidimos por .NET porque existía Mono
• Un control de versiones solo es serio si es multi-plataforma.
• En ningún momento nos planteamos solo-Windows.
• Existía Mono, así que nos decidimos por .NET/Mono/C#.
@psluaces
No fue un camino fácil
• El IDE era un dolor.
• Intentamos con otros IDEs (compramos uno X-Develop,
que no iba tampoco bien).
• Pequeñas incompatibilidades y limitaciones => hacían que
no subiéramos de framework rápidamente.
• Nos sentíamos un poco solos desarrollando “server side”.
• ¿Era realmente .NET un “system level framework”?
@psluaces
Llegamos a ser maintainers
de Mono en Solaris
• Tuvimos problemas con el Garbage
Collector.
• Montamos un setup para el equipo de
Mono (Mark Probst) para probar sgen.
• Hasta intentamos un port a HP-UX .
• Fixeamos bugs con big-endian :-D
@psluaces
Muchos de nuestros mayores servidores son
Linux
Delphi Automotive: +3000 usuarios (Global).
Pantech (2011): +1000 usuarios (Corea del Sur).
@psluaces
Siempre deseamos un .NET multiplataforma con
foco en rendimiento y “server workloads”
@psluaces
Situación de partida
@psluaces
Windows
.NET (4.x)
Linux
Mono 4.6 custom
macOS
Xamarin
@psluaces
Windows
.NET (4.x)
Linux
Mono 4.6 custom
macOS
Xamarin
@psluaces
Windows
.NET (4.x)
Linux
Mono 4.6 custom
macOS
Xamarin
Servidores
@psluaces
Windows Linux macOS
.NET 5
Objetivo ideal: todo (GUIs + Server) en .NET 5
@psluaces
Windows Linux macOS
Viabilidad / estado actual
Server OK / OK
WinForms OK / OK
WPF OK / OK
Server OK / KO
GTKSharp OK / ??
Server OK / ??
Xam.Mac KO / KO
@psluaces
Windows Linux macOS
Viabilidad / actual
Server OK / OK
WinForms OK / OK
WPF OK / OK
Server OK / KO
GTKSharp OK / ??
Server OK / ??
Xam.Mac KO / KO
@psluaces
Qué nos interesaba de .NET Core para servidor?
• GC más estable – el mismo de .NET
• Simplificar los builds
• Idealmente: build nativo (CoreRT)
• Lateralmente: mejoras de velocidad + Pipelines
@psluaces
Y simplificar los Linux builds …
@psluaces
Empieza la migración
@psluaces
Version Control Logic
[.NET assemblies]
Network layer
[.NET assemblies]
Data Layer
[.NET assemblies]
Converts requests in
method calls
Reads and writes
data and metadata
@psluaces
SQL Server MySQL SQLite Firebird Postgres Oracle
SQL Server
Embedded
Version Control Logic
[.NET assemblies]
Network layer
Data Layer
[.NET assemblies] Jet
.NET Remoting
[.NET assemblies]
Sockets
[.NET assemblies]
SQL Server MySQL SQLite Firebird Postgres Oracle
SQL Server
Embedded
Version Control Logic
[.NET assemblies]
Network layer
Data Layer
[.NET assemblies] Jet
.NET Remoting
[.NET assemblies]
Sockets
[.NET assemblies]
@psluaces
SQL Server MySQL SQLite Firebird Postgres Oracle
SQL Server
Embedded
Version Control Logic
[.NET assemblies]
Network layer
Data Layer
[.NET assemblies] Jet
.NET Remoting
[.NET assemblies]
Sockets
[.NET assemblies]
SQL Server MySQL SQLite Firebird Postgres Oracle
SQL Server
Embedded
Version Control Logic
[.NET assemblies]
Network layer
Data Layer
[.NET assemblies] Jet
.NET Remoting
[.NET assemblies]
Sockets
[.NET assemblies]
@psluaces
Nota: estoy intentando usar c4 model (más o menos) https://c4model.com
@psluaces
SQL Server MySQL SQLite Firebird Postgres Oracle
SQL Server
Embedded
Version Control Logic
[.NET assemblies]
Network layer
Data Layer
[.NET assemblies] Jet
.NET Remoting
[.NET assemblies]
Sockets
[.NET assemblies]
@psluaces
SQL Server MySQL SQLite Firebird Postgres Oracle
SQL Server
Embedded
Version Control Logic
[.NET assemblies]
Network layer
Data Layer
[.NET assemblies] Jet
.NET Remoting
[.NET assemblies]
Sockets
[.NET assemblies]
@psluaces
SQL Server MySQL SQLite Firebird Postgres Oracle
SQL Server
Embedded
Version Control Logic
[.NET assemblies]
Network layer
Data Layer
[.NET assemblies] Jet
.NET Remoting
[.NET assemblies]
Sockets
[.NET assemblies]
Todo esto fuera
@psluaces
SQL Server MySQL SQLite Firebird Postgres Oracle
SQL Server
Embedded
Version Control Logic
[.NET assemblies]
Network layer
Data Layer
[.NET assemblies] Jet
.NET Remoting
[.NET assemblies]
Sockets
[.NET assemblies]
Todo esto fuera
También quitamos LDAP
Que fuera un Linux
Daemon (procesar
signals)
GitServer
Y alguna cosa más
@psluaces
@psluaces
Paso 1 -> convertirlo en un build
monolítico => 1 único “assembly”
@psluaces
Primer intento => diciembre 2016 (.NET Core 1)
Creamos un build en .NET Core recortando todo lo posible y eliminando funcionalidades.
Con el objetivo de probar en Linux.
Y comparar en tests de carga con Mono.
Nos llevó unas 30 horas de trabajo (durante un hack-week).
@psluaces
Primer intento => diciembre 2016 (.NET Core 1)
Preparar un build sin Remoting (unos cuantos cambios).
Eliminar log4net (modificado).
Eliminar ciertos cambios para un build que tenemos convirtiendo código a bytecode Java (para HP-UX! Cliente).
PlatformId no funcionaba.
Eliminar la capa de “datalayer” SQL. (Dataset, etc, etc).
ReaderWriterLock => ReaderWriterLockSlim.
Eliminar ICloneable interfaces.
Eliminar [MethodImpl(MethodImplOptions.Synchronized)].
Usamos nuestro propio PlasticBinaryReader/Writer en lugar del standard (no soportado).
@psluaces
Y lanzamos pruebas de carga
@psluaces
Pero los resultados iniciales no fueron muy
buenos 
Linux + Mono
25 s
Linux + net Core
48 s
@psluaces
Y empezamos a contactar al equipo de .NET
Core
Martin Woordward => Mono 4.6 2x faster than .NET Core 1.1 => Valentin Isac => Jose Rivero => Brian Robbins
Montamos un setup para que el equipo usase Plastic para ejecutar algún benchmark
Finalmente, en Febrero de 2017, encontraron una diferencia en cómo .NET Core implementaba
MemoryMappedView de forma diferente a .NET y Mono.
@psluaces
Un fix de una línea ;-)
@psluaces
Y seguimos con pruebas
• Pequeño problema en TcpListener: https://github.com/dotnet/corefx/issues/26034
• El equipo usó Plastic para benchmark tras ver que .NET Core seguía siendo algo más lento con nuestro
workload (incluso en .NET Core 2.0)
@psluaces
Contexto: ¿por qué
nos preocupa tanto el
rendimiento?
@psluaces
Un control de versiones siempre tiene que
probar que es rápido
https://www.plasticscm.com/games/performance/performance-results-of-plastic-scm
Small repo (68mil ficheros y directorios, 775 MB)
Optime (sec) Plastic Git Perforce
Add 2 91 16
Checkin / Commit 15 7 118
Add + Checkin 17 98 134
5.7 times slower 8 times slower
@psluaces
Recordad que todo esto es en .NET, que luego
nos dicen que para “system level” mejor C ;-)
@psluaces
ci carnage - 50 concurrent bots - 100 ci each
configplatform Mono (sec) .NET Core 2 (sec)
cachedTrees = 50 50 125
cachedTrees = 5000 35 50
@psluaces
.NET Core era más rápido en ciertas operaciones
=== netcore ===
0 CheckInChangedTree | calls: 5000 | ms/call: 461 | proc(m): 38.5
1 TryCheckIn | calls: 5000 | ms/call: 160 | proc(m): 13.4
2 SetObjectsData | calls: 5000 | ms/call: 10 | proc(m): 0.9
=== mono ===
0 CheckInChangedTree | calls: 5000 | ms/call: 220 | proc(m): 18.4
1 TryCheckIn | calls: 5000 | ms/call: 45 | proc(m): 3.8
2 SetObjectsData | calls: 5000 | ms/call 15 | proc(m): 1.3
@psluaces
Un obstáculo en el
camino
@psluaces
Random crashes en uno de nuestros servidores
más importantes
Era nuestra mayor pesadilla con Mono, que algo así pudiera ocurrir.
Y comenzó a pasar.
Nuestro plan era migrar al cliente a .NET Core lo antes posible…
Tras consultar con Microsoft (Mono) y compartir core dumps => fallo en código de SGEN no fixeado en releases
posteriores a 4.6.
@psluaces
Pero no fue como
pensábamos
Cambiar de framework se percibía como un riesgo adicional

Y no les faltaba razón
@psluaces
Implementamos una solución alternativa:
watchdogs + Mono server
http://blog.plasticscm.com/2019/03/multi-instance-fault-tolerant-on-premise-server.html
Load
Balancer
WatchDog
Monitors the Plastic
server processes
Jet storage
[Container: Jet]
Storage shared by all
plasticd processes
Plastic
user
Legend
Config fileExisting systemJet
storage
New System
User
Plastic Server
process
Plastic Server
process
Plastic Server
process
@psluaces
Load Balancer
[nginx]
Distributes connections
among available plasticd
processes
plasticwatchdogd
[Container: .Net Core]
Starts up and monitors the
plasticd processes
Jet storage
[Container: Jet]
Storage shared by all
plasticd processes
x3
plasticd
[Container: Mono]
Each of the plastic servers
attending requests
Plastic
user
Does things Connects to Plastic
through the load
balancer (single
open external port)
Redirects connections
to the available processes
Writes to and reads from
Operating System
[Linux / Windows / macOS]
Starts up
the
watchdog
daemon on
OS startup
Starts up
nginx if
needed
plasticwatchdog.conf
[config file]
Stores configuration of the
entire setup: nodes, ports,
communication files
Reads
config
from
1. Starts up plasticd processes
2. Monitors process is still running
3. Ask process to stop periodically
or if something goes wrong
Warns watchdog
if something
is going wrong
SysAdmin
Configures
Configures and
monitors
Legend
Config fileExisting systemJet
storage
New System
User
@psluaces
Pero .NET Core server
ya estaba en el ciclo
de build
@psluaces
Acierto: habíamos metido el server .NET Core en
el ciclo de build
De modo que nos aseguramos de que sigue compilando
Y comenzamos a pasar “smoke tests”
@psluaces
Smoke tests
+900 tests de caja negra que automatizan cliente y servidor.
Es lo que usamos cada vez que migramos a una nueva base de datos, nuevo OS (raspberry!), nuevo Mono, etc,
etc (además de pasarse en cada release).
Encontramos numerosos pequeños problemas, algunos de configuración, otros auténticos problemas por
pequeños cambios en el build (no LDAP, por ejemplo).
Los smoke son tests que automatizan la línea de comandos (usamos PNUnit para ello).
@psluaces
Nuevas pruebas de rendimiento .NET Core 3
100 clients - 70K items repository
Mono .Net Core 2.2 .NET Core 3.0
preview
Initial 38s 50s 68s
+BufferedStream 39s 45s 52s
@psluaces
Telltale test – 20 min run
Mono 4.6 .NET Core 2.2
Operations in 20 min 1.6 M requests 3.5 M requests
@psluaces
Trabajo pendiente
@psluaces
Puntos pendientes
• Linux Daemon.
• LDAP.
• Resource localization.
• Windows Service.
• Check there is enough size on disk on Linux
(MonoPosix thing that we can probably pinvoke).
• GitServer.
• WebAdmin => .NET Core, shouldn’t be a problem.
• Self Signed Certificate for SSL.
• MySQL.
• Tray.
• SQL Server.
• Name.
• NameID.
• No Tube.
• WebTriggers.
• GZipLib disabled.
• configureserver CLI not available – package multiple
exes together.
@psluaces
Futuro
Todos los servidores en .NET Core y release oficial en
producción
Usar ese mismo server para Plastic Cloud
Migrar Linux GUI a GTK Sharp + .NET Core => full Core
Esperar a .NET 5 para GUI Mac
Migrar Windows GUIs a .NET Core / XXX?
@psluaces
Conclusiones
@psluaces
Conclusiones
Migrar es fácil => trabajo más bien rutinario para compilar
Es importante meterlo en el ciclo de release cuanto antes para no dejarlo abandonado
Los tests son clave (como siempre)
Es más fácil ahora con .NET Core 3.0 que hace 2 años (hay código para todo ya)
.NET Core tiene “buena prensa”. Gente horrorizada por Mono mira bien Core
@psluaces
Questions & Answers
@psluaces
Thanks and …
See you soon!
Thanks also to the sponsors.
Without whom this would not have been posible.

Contenu connexe

Tendances

SQL Server 2017 soporte en Linux
SQL Server 2017 soporte en LinuxSQL Server 2017 soporte en Linux
SQL Server 2017 soporte en LinuxEduardo Castro
 
SecondNug Febrero 2012 - Automatización de despliegues
SecondNug Febrero 2012 - Automatización de desplieguesSecondNug Febrero 2012 - Automatización de despliegues
SecondNug Febrero 2012 - Automatización de desplieguesJose Luis Soria
 
Un recorrido por las herramientas de software libre que uso cada día, en los ...
Un recorrido por las herramientas de software libre que uso cada día, en los ...Un recorrido por las herramientas de software libre que uso cada día, en los ...
Un recorrido por las herramientas de software libre que uso cada día, en los ...Christian Rodriguez
 
Congreso del mediterraneo_xen_server_v010
Congreso del mediterraneo_xen_server_v010Congreso del mediterraneo_xen_server_v010
Congreso del mediterraneo_xen_server_v010Javier Sanchez Alcazar
 
Construccion de proyectos con gradle
Construccion de proyectos con gradleConstruccion de proyectos con gradle
Construccion de proyectos con gradleDavid Gómez García
 
Interconexión entre sistemas operativos
Interconexión entre sistemas operativosInterconexión entre sistemas operativos
Interconexión entre sistemas operativosPol Grandes
 
Proyecto XenServer
Proyecto XenServerProyecto XenServer
Proyecto XenServerPol Grandes
 
Veeam Agents para Linux y Microsoft Windows
Veeam Agents para Linux y Microsoft Windows Veeam Agents para Linux y Microsoft Windows
Veeam Agents para Linux y Microsoft Windows Jorge de la Cruz
 
After tests marzo 2017: Pruebas de Integración Automatizadas con Docker
After tests marzo 2017: Pruebas de Integración Automatizadas con DockerAfter tests marzo 2017: Pruebas de Integración Automatizadas con Docker
After tests marzo 2017: Pruebas de Integración Automatizadas con DockerFernando Llaca Romero
 

Tendances (13)

Introduccion A Docker
Introduccion A DockerIntroduccion A Docker
Introduccion A Docker
 
SQL Server 2017 soporte en Linux
SQL Server 2017 soporte en LinuxSQL Server 2017 soporte en Linux
SQL Server 2017 soporte en Linux
 
Mercurial
MercurialMercurial
Mercurial
 
SecondNug Febrero 2012 - Automatización de despliegues
SecondNug Febrero 2012 - Automatización de desplieguesSecondNug Febrero 2012 - Automatización de despliegues
SecondNug Febrero 2012 - Automatización de despliegues
 
Un recorrido por las herramientas de software libre que uso cada día, en los ...
Un recorrido por las herramientas de software libre que uso cada día, en los ...Un recorrido por las herramientas de software libre que uso cada día, en los ...
Un recorrido por las herramientas de software libre que uso cada día, en los ...
 
Congreso del mediterraneo_xen_server_v010
Congreso del mediterraneo_xen_server_v010Congreso del mediterraneo_xen_server_v010
Congreso del mediterraneo_xen_server_v010
 
Construccion de proyectos con gradle
Construccion de proyectos con gradleConstruccion de proyectos con gradle
Construccion de proyectos con gradle
 
Interconexión entre sistemas operativos
Interconexión entre sistemas operativosInterconexión entre sistemas operativos
Interconexión entre sistemas operativos
 
Proyecto XenServer
Proyecto XenServerProyecto XenServer
Proyecto XenServer
 
Git
GitGit
Git
 
Veeam Agents para Linux y Microsoft Windows
Veeam Agents para Linux y Microsoft Windows Veeam Agents para Linux y Microsoft Windows
Veeam Agents para Linux y Microsoft Windows
 
Implantación de xen server
Implantación de xen serverImplantación de xen server
Implantación de xen server
 
After tests marzo 2017: Pruebas de Integración Automatizadas con Docker
After tests marzo 2017: Pruebas de Integración Automatizadas con DockerAfter tests marzo 2017: Pruebas de Integración Automatizadas con Docker
After tests marzo 2017: Pruebas de Integración Automatizadas con Docker
 

Similaire à DotNet 2019 | Pablo Santos Luaces - Como migrar un producto multiplataforma a .NET Core, un caso práctico.

dockerize.it
dockerize.itdockerize.it
dockerize.itbetabeers
 
Construyendo las aplicaciones del futuro con visual studio 11 y .net framewor...
Construyendo las aplicaciones del futuro con visual studio 11 y .net framewor...Construyendo las aplicaciones del futuro con visual studio 11 y .net framewor...
Construyendo las aplicaciones del futuro con visual studio 11 y .net framewor...Andrés Iturralde
 
Infrastructure as Code
Infrastructure as CodeInfrastructure as Code
Infrastructure as CodeAngel Nuñez
 
Introducción a SharePoint Framework
Introducción a SharePoint FrameworkIntroducción a SharePoint Framework
Introducción a SharePoint FrameworkHaaron Gonzalez
 
ReConnect 2015 - ASP.NET 5: MVC 6 y EF 7
ReConnect 2015  - ASP.NET 5: MVC 6 y EF 7ReConnect 2015  - ASP.NET 5: MVC 6 y EF 7
ReConnect 2015 - ASP.NET 5: MVC 6 y EF 7Luis Ruiz Pavón
 
Docker: la revolución en virtualización
Docker: la revolución en virtualizaciónDocker: la revolución en virtualización
Docker: la revolución en virtualizaciónMarcelo Ochoa
 
Instalacion de Postrgre sql en ubuntu
Instalacion de Postrgre sql en ubuntuInstalacion de Postrgre sql en ubuntu
Instalacion de Postrgre sql en ubuntuDavid Vevelas
 
Cross development - React para desarrolladores de asp.net
Cross development - React para desarrolladores de asp.netCross development - React para desarrolladores de asp.net
Cross development - React para desarrolladores de asp.netAlberto Diaz Martin
 
CrossDvlpu - REACT para desarrolladores de ASP.NET
CrossDvlpu - REACT para desarrolladores de ASP.NETCrossDvlpu - REACT para desarrolladores de ASP.NET
CrossDvlpu - REACT para desarrolladores de ASP.NETAlberto Diaz Martin
 
Breve introducción práctica al DevOps - (es) 2021_03_18
Breve introducción práctica al DevOps -  (es) 2021_03_18Breve introducción práctica al DevOps -  (es) 2021_03_18
Breve introducción práctica al DevOps - (es) 2021_03_18Young Suk Ahn Park
 
Integracion y Entrega Continua con Docker para SQL Server
Integracion y Entrega Continua con Docker para SQL ServerIntegracion y Entrega Continua con Docker para SQL Server
Integracion y Entrega Continua con Docker para SQL ServerChristian Melendez
 
Introducción a ASPNET vNext
Introducción a ASPNET vNextIntroducción a ASPNET vNext
Introducción a ASPNET vNextJulito Avellaneda
 
Windows Azure SQL Databases
Windows Azure SQL DatabasesWindows Azure SQL Databases
Windows Azure SQL DatabasesSolidQ
 
Buenas prácticas de codificación para capas de acceso a datos de aplicaciones...
Buenas prácticas de codificación para capas de acceso a datos de aplicaciones...Buenas prácticas de codificación para capas de acceso a datos de aplicaciones...
Buenas prácticas de codificación para capas de acceso a datos de aplicaciones...SolidQ
 

Similaire à DotNet 2019 | Pablo Santos Luaces - Como migrar un producto multiplataforma a .NET Core, un caso práctico. (20)

dockerize.it
dockerize.itdockerize.it
dockerize.it
 
Construyendo las aplicaciones del futuro con visual studio 11 y .net framewor...
Construyendo las aplicaciones del futuro con visual studio 11 y .net framewor...Construyendo las aplicaciones del futuro con visual studio 11 y .net framewor...
Construyendo las aplicaciones del futuro con visual studio 11 y .net framewor...
 
Infrastructure as Code
Infrastructure as CodeInfrastructure as Code
Infrastructure as Code
 
Introducción a SharePoint Framework
Introducción a SharePoint FrameworkIntroducción a SharePoint Framework
Introducción a SharePoint Framework
 
ReConnect 2015 - ASP.NET 5: MVC 6 y EF 7
ReConnect 2015  - ASP.NET 5: MVC 6 y EF 7ReConnect 2015  - ASP.NET 5: MVC 6 y EF 7
ReConnect 2015 - ASP.NET 5: MVC 6 y EF 7
 
Docker: la revolución en virtualización
Docker: la revolución en virtualizaciónDocker: la revolución en virtualización
Docker: la revolución en virtualización
 
Docker y PostgreSQL
Docker y PostgreSQLDocker y PostgreSQL
Docker y PostgreSQL
 
Instalacion de Postrgre sql en ubuntu
Instalacion de Postrgre sql en ubuntuInstalacion de Postrgre sql en ubuntu
Instalacion de Postrgre sql en ubuntu
 
Cross development - React para desarrolladores de asp.net
Cross development - React para desarrolladores de asp.netCross development - React para desarrolladores de asp.net
Cross development - React para desarrolladores de asp.net
 
CrossDvlpu - REACT para desarrolladores de ASP.NET
CrossDvlpu - REACT para desarrolladores de ASP.NETCrossDvlpu - REACT para desarrolladores de ASP.NET
CrossDvlpu - REACT para desarrolladores de ASP.NET
 
Conociendo Nuestro Fua interno
Conociendo Nuestro Fua internoConociendo Nuestro Fua interno
Conociendo Nuestro Fua interno
 
Breve introducción práctica al DevOps - (es) 2021_03_18
Breve introducción práctica al DevOps -  (es) 2021_03_18Breve introducción práctica al DevOps -  (es) 2021_03_18
Breve introducción práctica al DevOps - (es) 2021_03_18
 
Vuelven los "Pelochos"
Vuelven los "Pelochos"Vuelven los "Pelochos"
Vuelven los "Pelochos"
 
Web Day Devops - Plain Concepts
Web Day Devops - Plain ConceptsWeb Day Devops - Plain Concepts
Web Day Devops - Plain Concepts
 
Offering Cloud Solutions
Offering Cloud Solutions Offering Cloud Solutions
Offering Cloud Solutions
 
Integracion y Entrega Continua con Docker para SQL Server
Integracion y Entrega Continua con Docker para SQL ServerIntegracion y Entrega Continua con Docker para SQL Server
Integracion y Entrega Continua con Docker para SQL Server
 
Introducción a ASPNET vNext
Introducción a ASPNET vNextIntroducción a ASPNET vNext
Introducción a ASPNET vNext
 
Windows Azure SQL Databases
Windows Azure SQL DatabasesWindows Azure SQL Databases
Windows Azure SQL Databases
 
Buenas prácticas de codificación para capas de acceso a datos de aplicaciones...
Buenas prácticas de codificación para capas de acceso a datos de aplicaciones...Buenas prácticas de codificación para capas de acceso a datos de aplicaciones...
Buenas prácticas de codificación para capas de acceso a datos de aplicaciones...
 
Framework Catalyst
Framework CatalystFramework Catalyst
Framework Catalyst
 

Plus de Plain Concepts

R y Python con Power BI, la ciencia y el análisis de datos, juntos
R y Python con Power BI, la ciencia y el análisis de datos, juntosR y Python con Power BI, la ciencia y el análisis de datos, juntos
R y Python con Power BI, la ciencia y el análisis de datos, juntosPlain Concepts
 
Video kills the radio star: e-mail is crap and needed disruption
 Video kills the radio star: e-mail is crap and needed disruption Video kills the radio star: e-mail is crap and needed disruption
Video kills the radio star: e-mail is crap and needed disruptionPlain Concepts
 
Cómo redefinir tu organización con IA
Cómo redefinir tu organización con IACómo redefinir tu organización con IA
Cómo redefinir tu organización con IAPlain Concepts
 
Dx29: assisting genetic disease diagnosis with physician-focused AI pipelines
Dx29: assisting genetic disease diagnosis with physician-focused AI pipelinesDx29: assisting genetic disease diagnosis with physician-focused AI pipelines
Dx29: assisting genetic disease diagnosis with physician-focused AI pipelinesPlain Concepts
 
¿Qué es real? Cuando la IA intenta engañar al ojo humano
¿Qué es real? Cuando la IA intenta engañar al ojo humano¿Qué es real? Cuando la IA intenta engañar al ojo humano
¿Qué es real? Cuando la IA intenta engañar al ojo humanoPlain Concepts
 
Inteligencia artificial para detectar el cáncer de mama
Inteligencia artificial para  detectar el cáncer de mamaInteligencia artificial para  detectar el cáncer de mama
Inteligencia artificial para detectar el cáncer de mamaPlain Concepts
 
¿Está tu compañía preparada para el reto de la Inteligencia Artificial?
¿Está tu compañía preparada para el reto de la Inteligencia Artificial?¿Está tu compañía preparada para el reto de la Inteligencia Artificial?
¿Está tu compañía preparada para el reto de la Inteligencia Artificial?Plain Concepts
 
Cognitive Services en acción
Cognitive Services en acciónCognitive Services en acción
Cognitive Services en acciónPlain Concepts
 
El Hogar Inteligente. De los datos de IoT a los hábitos de una familia a trav...
El Hogar Inteligente. De los datos de IoT a los hábitos de una familia a trav...El Hogar Inteligente. De los datos de IoT a los hábitos de una familia a trav...
El Hogar Inteligente. De los datos de IoT a los hábitos de una familia a trav...Plain Concepts
 
What if AI was your daughter?
What if AI was your daughter?What if AI was your daughter?
What if AI was your daughter?Plain Concepts
 
Recomendación Basada en Contenidos con Deep Learning: Qué queríamos hacer, Qu...
Recomendación Basada en Contenidos con Deep Learning: Qué queríamos hacer, Qu...Recomendación Basada en Contenidos con Deep Learning: Qué queríamos hacer, Qu...
Recomendación Basada en Contenidos con Deep Learning: Qué queríamos hacer, Qu...Plain Concepts
 
Revolucionando la experiencia de cliente con Big Data e IA
Revolucionando la experiencia de cliente con Big Data e IARevolucionando la experiencia de cliente con Big Data e IA
Revolucionando la experiencia de cliente con Big Data e IAPlain Concepts
 
Recuperación de información para solicitantes de empleo
Recuperación de información para solicitantes de empleoRecuperación de información para solicitantes de empleo
Recuperación de información para solicitantes de empleoPlain Concepts
 
La nueva revolución Industrial: Inteligencia Artificial & IoT Edge
La nueva revolución Industrial: Inteligencia Artificial & IoT EdgeLa nueva revolución Industrial: Inteligencia Artificial & IoT Edge
La nueva revolución Industrial: Inteligencia Artificial & IoT EdgePlain Concepts
 
DotNet 2019 | Sherry List - Azure Cognitive Services with Native Script
DotNet 2019 | Sherry List - Azure Cognitive Services with Native ScriptDotNet 2019 | Sherry List - Azure Cognitive Services with Native Script
DotNet 2019 | Sherry List - Azure Cognitive Services with Native ScriptPlain Concepts
 
DotNet 2019 | Quique Fernández - Potenciando VUE con TypeScript, Inversify, V...
DotNet 2019 | Quique Fernández - Potenciando VUE con TypeScript, Inversify, V...DotNet 2019 | Quique Fernández - Potenciando VUE con TypeScript, Inversify, V...
DotNet 2019 | Quique Fernández - Potenciando VUE con TypeScript, Inversify, V...Plain Concepts
 
DotNet 2019 | Daniela Solís y Manuel Rodrigo Cabello - IoT, una Raspberry Pi ...
DotNet 2019 | Daniela Solís y Manuel Rodrigo Cabello - IoT, una Raspberry Pi ...DotNet 2019 | Daniela Solís y Manuel Rodrigo Cabello - IoT, una Raspberry Pi ...
DotNet 2019 | Daniela Solís y Manuel Rodrigo Cabello - IoT, una Raspberry Pi ...Plain Concepts
 
El camino a las Cloud Native Apps - Introduction
El camino a las Cloud Native Apps - IntroductionEl camino a las Cloud Native Apps - Introduction
El camino a las Cloud Native Apps - IntroductionPlain Concepts
 
El camino a las Cloud Native Apps - Azure AI
El camino a las Cloud Native Apps - Azure AIEl camino a las Cloud Native Apps - Azure AI
El camino a las Cloud Native Apps - Azure AIPlain Concepts
 

Plus de Plain Concepts (20)

R y Python con Power BI, la ciencia y el análisis de datos, juntos
R y Python con Power BI, la ciencia y el análisis de datos, juntosR y Python con Power BI, la ciencia y el análisis de datos, juntos
R y Python con Power BI, la ciencia y el análisis de datos, juntos
 
Video kills the radio star: e-mail is crap and needed disruption
 Video kills the radio star: e-mail is crap and needed disruption Video kills the radio star: e-mail is crap and needed disruption
Video kills the radio star: e-mail is crap and needed disruption
 
Cómo redefinir tu organización con IA
Cómo redefinir tu organización con IACómo redefinir tu organización con IA
Cómo redefinir tu organización con IA
 
Dx29: assisting genetic disease diagnosis with physician-focused AI pipelines
Dx29: assisting genetic disease diagnosis with physician-focused AI pipelinesDx29: assisting genetic disease diagnosis with physician-focused AI pipelines
Dx29: assisting genetic disease diagnosis with physician-focused AI pipelines
 
¿Qué es real? Cuando la IA intenta engañar al ojo humano
¿Qué es real? Cuando la IA intenta engañar al ojo humano¿Qué es real? Cuando la IA intenta engañar al ojo humano
¿Qué es real? Cuando la IA intenta engañar al ojo humano
 
Inteligencia artificial para detectar el cáncer de mama
Inteligencia artificial para  detectar el cáncer de mamaInteligencia artificial para  detectar el cáncer de mama
Inteligencia artificial para detectar el cáncer de mama
 
¿Está tu compañía preparada para el reto de la Inteligencia Artificial?
¿Está tu compañía preparada para el reto de la Inteligencia Artificial?¿Está tu compañía preparada para el reto de la Inteligencia Artificial?
¿Está tu compañía preparada para el reto de la Inteligencia Artificial?
 
Cognitive Services en acción
Cognitive Services en acciónCognitive Services en acción
Cognitive Services en acción
 
El Hogar Inteligente. De los datos de IoT a los hábitos de una familia a trav...
El Hogar Inteligente. De los datos de IoT a los hábitos de una familia a trav...El Hogar Inteligente. De los datos de IoT a los hábitos de una familia a trav...
El Hogar Inteligente. De los datos de IoT a los hábitos de una familia a trav...
 
What if AI was your daughter?
What if AI was your daughter?What if AI was your daughter?
What if AI was your daughter?
 
Recomendación Basada en Contenidos con Deep Learning: Qué queríamos hacer, Qu...
Recomendación Basada en Contenidos con Deep Learning: Qué queríamos hacer, Qu...Recomendación Basada en Contenidos con Deep Learning: Qué queríamos hacer, Qu...
Recomendación Basada en Contenidos con Deep Learning: Qué queríamos hacer, Qu...
 
Revolucionando la experiencia de cliente con Big Data e IA
Revolucionando la experiencia de cliente con Big Data e IARevolucionando la experiencia de cliente con Big Data e IA
Revolucionando la experiencia de cliente con Big Data e IA
 
IA Score en InfoJobs
IA Score en InfoJobsIA Score en InfoJobs
IA Score en InfoJobs
 
Recuperación de información para solicitantes de empleo
Recuperación de información para solicitantes de empleoRecuperación de información para solicitantes de empleo
Recuperación de información para solicitantes de empleo
 
La nueva revolución Industrial: Inteligencia Artificial & IoT Edge
La nueva revolución Industrial: Inteligencia Artificial & IoT EdgeLa nueva revolución Industrial: Inteligencia Artificial & IoT Edge
La nueva revolución Industrial: Inteligencia Artificial & IoT Edge
 
DotNet 2019 | Sherry List - Azure Cognitive Services with Native Script
DotNet 2019 | Sherry List - Azure Cognitive Services with Native ScriptDotNet 2019 | Sherry List - Azure Cognitive Services with Native Script
DotNet 2019 | Sherry List - Azure Cognitive Services with Native Script
 
DotNet 2019 | Quique Fernández - Potenciando VUE con TypeScript, Inversify, V...
DotNet 2019 | Quique Fernández - Potenciando VUE con TypeScript, Inversify, V...DotNet 2019 | Quique Fernández - Potenciando VUE con TypeScript, Inversify, V...
DotNet 2019 | Quique Fernández - Potenciando VUE con TypeScript, Inversify, V...
 
DotNet 2019 | Daniela Solís y Manuel Rodrigo Cabello - IoT, una Raspberry Pi ...
DotNet 2019 | Daniela Solís y Manuel Rodrigo Cabello - IoT, una Raspberry Pi ...DotNet 2019 | Daniela Solís y Manuel Rodrigo Cabello - IoT, una Raspberry Pi ...
DotNet 2019 | Daniela Solís y Manuel Rodrigo Cabello - IoT, una Raspberry Pi ...
 
El camino a las Cloud Native Apps - Introduction
El camino a las Cloud Native Apps - IntroductionEl camino a las Cloud Native Apps - Introduction
El camino a las Cloud Native Apps - Introduction
 
El camino a las Cloud Native Apps - Azure AI
El camino a las Cloud Native Apps - Azure AIEl camino a las Cloud Native Apps - Azure AI
El camino a las Cloud Native Apps - Azure AI
 

Dernier

trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdfIsabellaMontaomurill
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudianteAndreaHuertas24
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfsoporteupcology
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx241521559
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxLolaBunny11
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIAWilbisVega
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITMaricarmen Sánchez Ruiz
 
Herramientas de corte de alta velocidad.pptx
Herramientas de corte de alta velocidad.pptxHerramientas de corte de alta velocidad.pptx
Herramientas de corte de alta velocidad.pptxRogerPrieto3
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...silviayucra2
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesFundación YOD YOD
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 

Dernier (15)

trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdf
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdf
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptx
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
Herramientas de corte de alta velocidad.pptx
Herramientas de corte de alta velocidad.pptxHerramientas de corte de alta velocidad.pptx
Herramientas de corte de alta velocidad.pptx
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento Protégeles
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 

DotNet 2019 | Pablo Santos Luaces - Como migrar un producto multiplataforma a .NET Core, un caso práctico.

  • 1. @psluaces Cómo migrar un producto multiplataforma a .NET Core, un caso práctico.
  • 3. @psluaces @psluaces pablo@plasticscm.com Poco después de tener mi primer ordenador descubrí que me gustaba más programar que jugar. Tenía 13 o 14 años y era un Amstrad PCW. Para poder seguir programando monté una empresa en 2005. Desarrollamos un control de versiones para competir con Perforce, IBM, Microsoft, Subversion… y lo mejor vino luego: competir también con Git. Y todo lo desarrollamos en C# porque… ¿para qué complicarnos menos? Pablo Santos Luaces Fundador y CTO (y también escribo posts y barro si hace falta)
  • 4. @psluaces Objetivo Compartir nuestra experiencia desarrollando multi-plataforma con .NET/Mono/.NET Core
  • 5. @psluaces ¿Quiénes somos, qué es Plastic y por qué está hecho en .NET?
  • 7. @psluaces Desarrollamos productos de “version control”
  • 8. @psluaces Mandad una foto de vuestro badge a @semanticmerge
  • 10. @psluaces +3000 users +1200 users +500 users
  • 11. @psluaces ¿Qué es Plastic? Un control de versiones muy bueno para trabajar en tareas, muy potente con branches y merges, que soporta grandes ficheros y grandes repos, y muy visual y fácil de usar (o eso intentamos).
  • 12. @psluaces 14 años de evolución y +1.4M SLOC 93% C#
  • 13. @psluaces Componentes principales: servidor y clientes • Cliente • CLI • GUI (Mac, Linux, Windows) • Gluon – GUI simplificada para artistas en game development • Merge tools + SemanticMerge • Web interface (ASP.NET Core) • Servidor • Escalable y configurable • Soporte de 7 bases de datos • + Plastic Cloud (Azure) http://blog.plasticscm.com/2018/10/all-software-we-write.html
  • 14. @psluaces Si queréis saber más de Plastic como producto https://www.plasticscm.com/documentation
  • 24. @psluaces Nos decidimos por .NET porque existía Mono • Un control de versiones solo es serio si es multi-plataforma. • En ningún momento nos planteamos solo-Windows. • Existía Mono, así que nos decidimos por .NET/Mono/C#.
  • 25. @psluaces No fue un camino fácil • El IDE era un dolor. • Intentamos con otros IDEs (compramos uno X-Develop, que no iba tampoco bien). • Pequeñas incompatibilidades y limitaciones => hacían que no subiéramos de framework rápidamente. • Nos sentíamos un poco solos desarrollando “server side”. • ¿Era realmente .NET un “system level framework”?
  • 26. @psluaces Llegamos a ser maintainers de Mono en Solaris • Tuvimos problemas con el Garbage Collector. • Montamos un setup para el equipo de Mono (Mark Probst) para probar sgen. • Hasta intentamos un port a HP-UX . • Fixeamos bugs con big-endian :-D
  • 27. @psluaces Muchos de nuestros mayores servidores son Linux Delphi Automotive: +3000 usuarios (Global). Pantech (2011): +1000 usuarios (Corea del Sur).
  • 28. @psluaces Siempre deseamos un .NET multiplataforma con foco en rendimiento y “server workloads”
  • 32. @psluaces Windows .NET (4.x) Linux Mono 4.6 custom macOS Xamarin Servidores
  • 33. @psluaces Windows Linux macOS .NET 5 Objetivo ideal: todo (GUIs + Server) en .NET 5
  • 34. @psluaces Windows Linux macOS Viabilidad / estado actual Server OK / OK WinForms OK / OK WPF OK / OK Server OK / KO GTKSharp OK / ?? Server OK / ?? Xam.Mac KO / KO
  • 35. @psluaces Windows Linux macOS Viabilidad / actual Server OK / OK WinForms OK / OK WPF OK / OK Server OK / KO GTKSharp OK / ?? Server OK / ?? Xam.Mac KO / KO
  • 36. @psluaces Qué nos interesaba de .NET Core para servidor? • GC más estable – el mismo de .NET • Simplificar los builds • Idealmente: build nativo (CoreRT) • Lateralmente: mejoras de velocidad + Pipelines
  • 37. @psluaces Y simplificar los Linux builds …
  • 39. @psluaces Version Control Logic [.NET assemblies] Network layer [.NET assemblies] Data Layer [.NET assemblies] Converts requests in method calls Reads and writes data and metadata
  • 40. @psluaces SQL Server MySQL SQLite Firebird Postgres Oracle SQL Server Embedded Version Control Logic [.NET assemblies] Network layer Data Layer [.NET assemblies] Jet .NET Remoting [.NET assemblies] Sockets [.NET assemblies] SQL Server MySQL SQLite Firebird Postgres Oracle SQL Server Embedded Version Control Logic [.NET assemblies] Network layer Data Layer [.NET assemblies] Jet .NET Remoting [.NET assemblies] Sockets [.NET assemblies]
  • 41. @psluaces SQL Server MySQL SQLite Firebird Postgres Oracle SQL Server Embedded Version Control Logic [.NET assemblies] Network layer Data Layer [.NET assemblies] Jet .NET Remoting [.NET assemblies] Sockets [.NET assemblies] SQL Server MySQL SQLite Firebird Postgres Oracle SQL Server Embedded Version Control Logic [.NET assemblies] Network layer Data Layer [.NET assemblies] Jet .NET Remoting [.NET assemblies] Sockets [.NET assemblies]
  • 42. @psluaces Nota: estoy intentando usar c4 model (más o menos) https://c4model.com
  • 43. @psluaces SQL Server MySQL SQLite Firebird Postgres Oracle SQL Server Embedded Version Control Logic [.NET assemblies] Network layer Data Layer [.NET assemblies] Jet .NET Remoting [.NET assemblies] Sockets [.NET assemblies]
  • 44. @psluaces SQL Server MySQL SQLite Firebird Postgres Oracle SQL Server Embedded Version Control Logic [.NET assemblies] Network layer Data Layer [.NET assemblies] Jet .NET Remoting [.NET assemblies] Sockets [.NET assemblies]
  • 45. @psluaces SQL Server MySQL SQLite Firebird Postgres Oracle SQL Server Embedded Version Control Logic [.NET assemblies] Network layer Data Layer [.NET assemblies] Jet .NET Remoting [.NET assemblies] Sockets [.NET assemblies] Todo esto fuera
  • 46. @psluaces SQL Server MySQL SQLite Firebird Postgres Oracle SQL Server Embedded Version Control Logic [.NET assemblies] Network layer Data Layer [.NET assemblies] Jet .NET Remoting [.NET assemblies] Sockets [.NET assemblies] Todo esto fuera También quitamos LDAP Que fuera un Linux Daemon (procesar signals) GitServer Y alguna cosa más
  • 48. @psluaces Paso 1 -> convertirlo en un build monolítico => 1 único “assembly”
  • 49. @psluaces Primer intento => diciembre 2016 (.NET Core 1) Creamos un build en .NET Core recortando todo lo posible y eliminando funcionalidades. Con el objetivo de probar en Linux. Y comparar en tests de carga con Mono. Nos llevó unas 30 horas de trabajo (durante un hack-week).
  • 50. @psluaces Primer intento => diciembre 2016 (.NET Core 1) Preparar un build sin Remoting (unos cuantos cambios). Eliminar log4net (modificado). Eliminar ciertos cambios para un build que tenemos convirtiendo código a bytecode Java (para HP-UX! Cliente). PlatformId no funcionaba. Eliminar la capa de “datalayer” SQL. (Dataset, etc, etc). ReaderWriterLock => ReaderWriterLockSlim. Eliminar ICloneable interfaces. Eliminar [MethodImpl(MethodImplOptions.Synchronized)]. Usamos nuestro propio PlasticBinaryReader/Writer en lugar del standard (no soportado).
  • 52. @psluaces Pero los resultados iniciales no fueron muy buenos  Linux + Mono 25 s Linux + net Core 48 s
  • 53. @psluaces Y empezamos a contactar al equipo de .NET Core Martin Woordward => Mono 4.6 2x faster than .NET Core 1.1 => Valentin Isac => Jose Rivero => Brian Robbins Montamos un setup para que el equipo usase Plastic para ejecutar algún benchmark Finalmente, en Febrero de 2017, encontraron una diferencia en cómo .NET Core implementaba MemoryMappedView de forma diferente a .NET y Mono.
  • 54. @psluaces Un fix de una línea ;-)
  • 55. @psluaces Y seguimos con pruebas • Pequeño problema en TcpListener: https://github.com/dotnet/corefx/issues/26034 • El equipo usó Plastic para benchmark tras ver que .NET Core seguía siendo algo más lento con nuestro workload (incluso en .NET Core 2.0)
  • 56. @psluaces Contexto: ¿por qué nos preocupa tanto el rendimiento?
  • 57. @psluaces Un control de versiones siempre tiene que probar que es rápido https://www.plasticscm.com/games/performance/performance-results-of-plastic-scm Small repo (68mil ficheros y directorios, 775 MB) Optime (sec) Plastic Git Perforce Add 2 91 16 Checkin / Commit 15 7 118 Add + Checkin 17 98 134 5.7 times slower 8 times slower
  • 58. @psluaces Recordad que todo esto es en .NET, que luego nos dicen que para “system level” mejor C ;-)
  • 59. @psluaces ci carnage - 50 concurrent bots - 100 ci each configplatform Mono (sec) .NET Core 2 (sec) cachedTrees = 50 50 125 cachedTrees = 5000 35 50
  • 60. @psluaces .NET Core era más rápido en ciertas operaciones === netcore === 0 CheckInChangedTree | calls: 5000 | ms/call: 461 | proc(m): 38.5 1 TryCheckIn | calls: 5000 | ms/call: 160 | proc(m): 13.4 2 SetObjectsData | calls: 5000 | ms/call: 10 | proc(m): 0.9 === mono === 0 CheckInChangedTree | calls: 5000 | ms/call: 220 | proc(m): 18.4 1 TryCheckIn | calls: 5000 | ms/call: 45 | proc(m): 3.8 2 SetObjectsData | calls: 5000 | ms/call 15 | proc(m): 1.3
  • 62. @psluaces Random crashes en uno de nuestros servidores más importantes Era nuestra mayor pesadilla con Mono, que algo así pudiera ocurrir. Y comenzó a pasar. Nuestro plan era migrar al cliente a .NET Core lo antes posible… Tras consultar con Microsoft (Mono) y compartir core dumps => fallo en código de SGEN no fixeado en releases posteriores a 4.6.
  • 63. @psluaces Pero no fue como pensábamos Cambiar de framework se percibía como un riesgo adicional  Y no les faltaba razón
  • 64. @psluaces Implementamos una solución alternativa: watchdogs + Mono server http://blog.plasticscm.com/2019/03/multi-instance-fault-tolerant-on-premise-server.html Load Balancer WatchDog Monitors the Plastic server processes Jet storage [Container: Jet] Storage shared by all plasticd processes Plastic user Legend Config fileExisting systemJet storage New System User Plastic Server process Plastic Server process Plastic Server process
  • 65. @psluaces Load Balancer [nginx] Distributes connections among available plasticd processes plasticwatchdogd [Container: .Net Core] Starts up and monitors the plasticd processes Jet storage [Container: Jet] Storage shared by all plasticd processes x3 plasticd [Container: Mono] Each of the plastic servers attending requests Plastic user Does things Connects to Plastic through the load balancer (single open external port) Redirects connections to the available processes Writes to and reads from Operating System [Linux / Windows / macOS] Starts up the watchdog daemon on OS startup Starts up nginx if needed plasticwatchdog.conf [config file] Stores configuration of the entire setup: nodes, ports, communication files Reads config from 1. Starts up plasticd processes 2. Monitors process is still running 3. Ask process to stop periodically or if something goes wrong Warns watchdog if something is going wrong SysAdmin Configures Configures and monitors Legend Config fileExisting systemJet storage New System User
  • 66. @psluaces Pero .NET Core server ya estaba en el ciclo de build
  • 67. @psluaces Acierto: habíamos metido el server .NET Core en el ciclo de build De modo que nos aseguramos de que sigue compilando Y comenzamos a pasar “smoke tests”
  • 68. @psluaces Smoke tests +900 tests de caja negra que automatizan cliente y servidor. Es lo que usamos cada vez que migramos a una nueva base de datos, nuevo OS (raspberry!), nuevo Mono, etc, etc (además de pasarse en cada release). Encontramos numerosos pequeños problemas, algunos de configuración, otros auténticos problemas por pequeños cambios en el build (no LDAP, por ejemplo). Los smoke son tests que automatizan la línea de comandos (usamos PNUnit para ello).
  • 69. @psluaces Nuevas pruebas de rendimiento .NET Core 3 100 clients - 70K items repository Mono .Net Core 2.2 .NET Core 3.0 preview Initial 38s 50s 68s +BufferedStream 39s 45s 52s
  • 70. @psluaces Telltale test – 20 min run Mono 4.6 .NET Core 2.2 Operations in 20 min 1.6 M requests 3.5 M requests
  • 72. @psluaces Puntos pendientes • Linux Daemon. • LDAP. • Resource localization. • Windows Service. • Check there is enough size on disk on Linux (MonoPosix thing that we can probably pinvoke). • GitServer. • WebAdmin => .NET Core, shouldn’t be a problem. • Self Signed Certificate for SSL. • MySQL. • Tray. • SQL Server. • Name. • NameID. • No Tube. • WebTriggers. • GZipLib disabled. • configureserver CLI not available – package multiple exes together.
  • 73. @psluaces Futuro Todos los servidores en .NET Core y release oficial en producción Usar ese mismo server para Plastic Cloud Migrar Linux GUI a GTK Sharp + .NET Core => full Core Esperar a .NET 5 para GUI Mac Migrar Windows GUIs a .NET Core / XXX?
  • 75. @psluaces Conclusiones Migrar es fácil => trabajo más bien rutinario para compilar Es importante meterlo en el ciclo de release cuanto antes para no dejarlo abandonado Los tests son clave (como siempre) Es más fácil ahora con .NET Core 3.0 que hace 2 años (hay código para todo ya) .NET Core tiene “buena prensa”. Gente horrorizada por Mono mira bien Core
  • 77. @psluaces Thanks and … See you soon! Thanks also to the sponsors. Without whom this would not have been posible.