

door Piet van Agtmaal en Mark Moes
Op de vooravond van de conferentie vond een pre-conference meetup plaats. Onderdeel daarvan was een live podcast van de “Londen Gophers” met als organisatoren Mat Ryer en Mark Bates, twee bekende gezichten van de Go community, die ook de rest van de conferentie aan elkaar zouden praten.
Met drie andere gasten bespraken ze kortstondig diverse onderwerpen over Go, en door de nodige humor was het leuk om te volgen. Voor en na de meetup was er tijd voor een biertje en een praatje met andere conferentiegangers. Een erg geslaagd begin van de conferentie!
A Go Security Journey
In elke taal is security misschien niet het leukste, maar wel een heel belangrijk facet. Daarom was het interessant te horen hoe Adrian Hesketh bij het britse National Health Service heeft gewerkt aan het omzetten van diverse backend systemen naar Go. Het voornaamste doel was zo goed mogelijk privacy van gebruikers te beschermen door hun persoonlijke en medische gegevens veilig te verwerken.
Hiervoor passen ze veel verschillende technieken toe. Met de secure middleware krijg je als ontwikkelaar veel quick wins door bijvoorbeeld automatisch de juiste HTTP headers te zetten, zonder dat dit een obstakel wordt tijdens development. Voor authenticatie gebruiken ze onder andere jwt-go. Dit package biedt een Go implementatie van JSON Web Tokens, een simpele doch effectieve manier voor stateless authenticatie en authorisatie. Met de gosec package kun je static analysis doen op code, om te voorkomen dat bijvoorbeeld files met te brede permissies worden aanmaakt, er sockets open staan op alle netwerk interfaces, deprecated cryptografische standaarden worden gebruikt, en diverse andere dingen. Daarnaast maken ze gebruik van Quay, een RedHat product voor container distributie. Dit biedt container image opslag met uitgebreide access control, kan de images builden, maar is voornamelijk handig om images te scannen op security vulnerabilities. Dit zorgt ervoor dat ze altijd compliant zijn met de laatste security patches. Een andere vulnerability bron is https://nvd.nist.gov waarvoor Adrian een slackbot notifier schreef die draait in AWS Lambda, en laat weten wanneer er CVE’s bekend zijn voor Go of Node.JS.
De presentatie van Adrian was erg goed te volgen en gaf genoeg stof tot nadenken. Alle andere tools en resources die hij aanraad staan in deze gist voor wie er meer over wilt lezen.
Going Infinite: Handling 1 Million Websocket Connections in Go
Behalve security is performance ook een belangrijk aspect van een programmeertaal. Omdat Go zo dicht bij C zit, is het behoorlijk snel. Maar een snelle taal betekent niet dat je tijdens het programmeren niet meer hoeft te letten op hoe efficiënt je je algoritmes implementeert. Eran Yanay van Twistlock liet aan de hand van een uitgebreide demo zien dat de implementatie van websockets in Go (websocket) met weinig code best prima werk levert, maar eigenlijk teveel resources gebruikt. Voor 1 miljoen open websockets zou maar liefst 20GB werkgeheugen nodig zijn.
Dit laatste bevestigde hij met behulp van de ingebouwde performance tool van Go (pprof). Uit de gegenereerde SVG bleek dat er drie grootgebruikers waren van werkgeheugen: het aantal goroutines, het aantal net/http objecten en het aanmaken van nieuwe buffers om data naar weg te schrijven. Werk aan de winkel dus!
Om het aantal aangemaakte goroutines terug te dringen, raadde Eran aan om epolll te gebruiken om zo het aantal file descriptors (en daarmee ook goroutines) terug te dringen. In feite checkt epoll of er file descriptors ongebruikt zijn en dus hergebruikt kunnen worden. Op die manier hoef je niet voor elke socket een nieuwe file descriptor te maken, maar gebruik je een bestaande maar idle file descriptor op het moment dat er data binnenkomt op de socket. Hiermee bracht hij het gebruikte werkgeheugen met 30% terug.
Het aantal net/http objecten en de nieuwe buffers zijn nauw aan elkaar verbonden. De websocket package houdt voor elke socket een reference naar de buffer, waardoor deze niet opgeruimt wordt en dus geheugen blijft gebruiken. Met de ws package toonde Eran aan controle te hebben over deze buffers en ze te hergebruiken. Daarnaast gebruikt die library copy by reference in plaats van copy by value voor het upgraden van een verbinding van HTTP naar WebSocket. Na deze optimalisatie bleef er van de 20GB werkgeheugen nog maar 600MB over. Dat is een afname van maar liefst 97%.
Een leuk detail is dat hij alles op zijn eigen laptop draaide. De oplettende lezer zal dan denken: hoe open je nou weer 1 miljoen sockets op 1 laptop, dat kan toch helemaal niet? Wel dus, met behulp van Docker containers. Hierbij worden virtuele netwerken gebruikt en kon hij dus alles aan elkaar knopen. Dit is te vergelijken met hoe een LAN met een WAN werkt: door een intern netwerk te creëren kan een enkel extern IP-adres gebruikt worden voor meerdere apparaten.
Eran gaf al met al een presentatie die goed in elkaar stak. Alle gebruikte code is te vinden op zijn GitHub.
Gio: Cross Platform GUI Programming for Mobile, Desktop, WebAssembly
Van de afsluitende keynote van de conferentie kreeg de hele zaal het op de heupen. Onder luid applaus liet Elias Naur zien hoe hij met zijn Gio binnen een kwartier een applicatie op zijn laptop, in zijn browser, op een Android telefoon én op een iPhone kon draaien, met een minieme hoeveelheid code (die hier te vinden is).
User Interfaces zijn iets wat tot voor kort nog niet zo makkelijk was in Go. De laatste jaren is Elias bezig geweest om daar verandering in te brengen, en naar nu blijkt is dat aardig gelukt. De library is vlot, cross-platform en bovenal makkelijk in gebruik. Voor elk platform is er een ingebakken command om je applicatie te compileren, waarna je het op de manier die gebruikelijk is voor dat platform kunt draaien. Voor Android is dat bijvoorbeeld adb.
Omdat Gio behoorlijk nieuw is en pas een paar maanden geleden uitgebracht is, zijn er nog flink wat punten waar te verbeteren valt. Zo is het nu nog niet mogelijk om styling van de applicatie buiten de Go code te doen. In het ideale geval zou je daar een gestandaardiseerde manier voor hebben, zoals (S)CSS.
Zijn praatje is terug te vinden op YouTube.
GopherConUK 2019: een geslaagde trip
Tot onze spijt moeten we zeggen dat we bijzonder weinig van Londen meegekregen hebben. Dat zegt natuurlijk veel over de conferentie: die was goed georganiseerd en bovendien ook interessant. Londen moeten we dus maar op een ander moment goed gaan bekijken!
