Upgrade to Pro — share decks privately, control downloads, hide ads and more …

5 años de producción con Scala

Nando Sola
November 23, 2016

5 años de producción con Scala

En GrapheneDB fuimos de los primeros en apostar por Scala y Akka para manejar (casi) toda nuestra infraestructura, hace más de cinco años. Por si fuera poco, nos dedicamos a proporcionar bases de datos neo4j como servicio, así que preparaos para un viaje que nos llevará a integrarnos con AWS, Docker, servicios de pago, sistemas de reporte de incidencias, seguridad, monitorización... Todo ello mientras intentamos mantener la cordura entre la JVM, UN*X, APIs Java bastante feas.

El objetivo de la charla es compartir con la Comunidad nuestras experiencias creando y manteniendo toda una plataforma cloud.

Charla de Noviembre de 2016 para Madrid Scala Meetup

https://www.meetup.com/Scala-Programming-Madrid/events/235570280/

Nando Sola

November 23, 2016
Tweet

More Decks by Nando Sola

Other Decks in Programming

Transcript

  1. 2012 Primeras pruebas de concepto 02/2013 Beta, early access a

    bases de datos sandbox 10/2013 Primeras instancias dedicadas para producción 06/2014 GA planes compartidos & dedicados de producción Presente HA clusters, métricas de rendimiento, ...
  2. Root Foo Bar a b c d e f g

    h Supervisión Jerarquía • Desacoplar • Convivir con los fallos • Reaccionar • Distribución • Estado
  3. API Web Conductor Scheduler Station SQS Neo4j EventConsumer Backups Overseer

    QueryProcessor Billing Http Monitoring Public Ops API
  4. • Modelo desconocido • Nuevo lenguaje • Nueva forma de

    afrontar los problemas • Pocas o ninguna best practice • Período de adaptación vs. inversión
  5. Station Overseer ConfigurationProvider Config DB • WorkerActor (modo Robert DeNiro

    = on) ◦ Lanza un binario que ejecuta neo4j en un container ◦ Monitoriza el proceso • Overseer implementa casi todas las operaciones de servicio: ◦ Reiniciar JVM, backups, ... neo4j LXC container WorkerActor Core services Akka Remote https://en.wikipedia.org/wiki/Docker_(software)#History http://www.haifux.org/lectures/299/netLec7.pdf
  6. Problemas con Akka • akka-remote es muy sensible a las

    condiciones de red • Desconexiones en el servidor remoto: ◦ Pausas de GC, microcortes de AWS ◦ cualquier conexión nueva desde ConfigurationProvider será rechazada ◦ Reiniciar el proceso JVM para eliminar el la IP remota de la lista de cuarentena. • Las conexiones son gestionadas por Akka ◦ No había una manera fácil de remediar el problema. https://groups.google.com/forum/#!topic/akka-user/QCYVY-dJlM8
  7. Problemas con Akka • Dificultad de mantener la compatibilidad entre

    versiones del servicio ◦ Deserialización a POJOs por defecto ◦ Si la definición de la clase se actualiza, el deserializador lanza un error. • Soluciones: ◦ Definir una nueva case class por cada versión del mensaje ◦ Usar Protocol Buffers, CBOR, … ◦ Akka 2.4.11 ▪ Estamos en Scala 2.10.6 y es primavera de 2015 ▪ Project Artery (Aeron + CBOR + mejoras en manejo de latencia) http://doc.akka.io/docs/akka/2.4/java/remoting-artery.html
  8. Problemas con Akka • Los clientes del servicio están restringidos

    a usar Akka. ◦ Cambios del protocolo binario entre versiones de Akka ◦ No puedo escribir clientes en otros lenguajes non-JVM • Maldita hemeroteca ◦ Tutoriales e intentos de establecer prácticas usando akka-remote
  9. Problemas con la JVM “Scala tiene una sintaxis excelente para

    hacer scripts, pero tan pronto como los estás escribiendo, descubres que hay interactuar con UN*X” http://www.scala-lang.org/old/node/8812.html
  10. Problemas con la JVM • No es posible enviar de

    señales distintas a Process.destroy a procesos hijo. • Tampoco puedes acabar con una JVM si tiene procesos hijo ◦ Reiniciar en caso de OOM • Compatibilidad Scala y JNA: nop • Solución: Sigar ▪ OK para monitorización ▪ Muy rudimentario para poder manejar procesos ▪ Poca documentación
  11. Station Overseer Conductor Config DB Chisel neo4j Docker container Core

    services hammer Performer HTTP • Overseer implementa operaciones sobre containers: ◦ stop, start, manejo de certificados para la API, ... • Chisel ejecuta comandos en el host: ◦ Docker: logs, manejo de volúmenes, ... ◦ Recursos libres • hammer lanza y monitoriza el proceso Neo y su entorno ◦ Rust: lenguaje de sistemas moderno y TIPADO ◦ OOM, SIGTERM, SIGKILL,sistema de ficheros
  12. FSM

  13. Session Types From Data Types to Session Types Session Types

    for Me and You and Everyone We Know! - Zeeshan Lakhani LChannels
  14. "Why have I never encountered the need of these monad

    transformers? [...] If everything is an actor, you already have decoupled your different concerns in your system. And you don't have to mix different effects from different backends." Distributed Systems vs Compositionality Dr. Roland Kuhn, #ScalaForThePeople
  15. +

  16. Bolt Value: INIT "MyClient/1.0" { "scheme": "basic", "principal": "neo4j", "credentials":

    "secret"} B1 01 8C 4D 79 43 6C 69 65 6E 74 2F 31 2E 30 A3 86 73 63 68 65 6D 65 85 62 61 73 69 63 89 70 72 69 6E 63 69 70 61 6C 85 6E 65 6F 34 6A 8B 63 72 65 64 65 6E 74 69 61 6C 73 86 73 65 63 72 65 74