Noté una comparación no muy positiva de Java vs GO. Pruebas realizadas por una gran cantidad de usuarios .
Decidí comprobar si todo es tan color de rosa con Go.
Mirando hacia el futuro, diré que al almacenar en caché en la memoria y crear JSON sobre la marcha, logré obtener hasta 120,000 [# / seg] en 8 núcleos físicos.
Script de solicitud GET básico:
- Si los datos se encuentran en la memoria caché en la memoria y son válidos, entonces formamos JSON a partir de la estructura
- Si no hay datos en la memoria caché, los buscamos en Bolt DB, si los encontramos, leemos el JSON terminado
- Si no hay datos en Bolt DB, los solicitamos de la base de datos, guárdelos en la memoria caché
- Los datos en la memoria caché en memoria se acumulan en el canal del búfer, después de la acumulación de aproximadamente 10,000 elementos, se descartan como un solo guardado en Bolt DB
- Si los datos en la base de datos han cambiado (actualización / inserción), se transmite una notificación a través de pg_notify y los datos en el caché se marcan como no válidos, la próxima vez que se lea, se leerá nuevamente desde la base de datos
Debajo de los resultados de la prueba de corte y el código del banco de pruebas GitHub
Actualización 05/06/2020
Hubo una oportunidad de probar en la nube de Oracle .

- el soporte se ensambla en 3 servidores: 8 Core Intel (16 núcleos virtuales), 120 Memory (GB), Oracle Linux 7.7
- NVMe — 6.4 TB NVMe SSD Storage min 250k IOPS (4k block)
- — 8.2 Network Bandwidth (Gbps)
- PostgreSQL — 16 000 [get/sec], oncurrency 1024, 60 [ms]. Get 360 000 000 . JSON 1800 .
- — 100 000 — 120 000 [get/sec], oncurrency 1024, 2 [ms].
- PostgreSQL — 10 000 [insert/sec].
- 2 4 8 Core, .
- JSON Bolt DB 2 HDD, SSD
- PostgreSQL HDD SDD 100
- Bolt DB SDD HDD 100
- JSON " " 10 PostgreSQL SDD
- — Failed requests Concurrency 16 384
,
— GitHub. 4000 , .
, JSON encoder/decode — JSON 2 .
HTTP Get handler JSON
BenchmarkHandler_DeptGetHandler-2 1000000 41277 ns/op 4845.26 MB/s 10941 B/op 259 allocs/op
HTTP Get handler francoispqt/gojay
BenchmarkHandler_DeptGetHandler-2 1000000 13300 ns/op 15036.97 MB/s 3265 B/op 11 allocs/op
:
- PostgreSQL 11 Windows 10, — 30 .
- — 10 000 000 , 100 000 000 .
- JSON 1500 , 1 10 .
- — core i7-3770 — 4 core (8 thread), 16 , HDD (WD 2.0TB WD2000fyyz), SSD (Intel 530 Series).
- ApacheBench, concurrency level 1 4096, 1 000 000 .
- Windows, .
- RAID . .
:
Concurrency Level , ApacheBench " ".
GET PostgreSQL — HDD ( )
GET PostgreSQL — SSD ( )
GET BOLT DB — HDD (JSON BOLT DB)
GET BOLT DB — SSD (JSON BOLT DB)
GET
Oracle
Oracle 3- :
- VM.DenseIO2.8 — 8 Core Intel (16 virtual core), 120 Memory (GB), Oracle Linux 7.7
- NVMe — 6.4 TB NVMe SSD Storage (1 drives) min 250k IOPS (4k block)
- — 8.2 Network Bandwidth (Gbps)
- — PostgreSQL 12. .
- ApacheBench:
- concurrency level 4 16384
- 10 000 1 000 000 .
- 2 8 ApacheBench ( ab 1 )

GET
- JSON — 1800 . Dept 10 Emp.
- Dept — 33 000 000, Emp — 330 000 000 .
:
- GET PostgreSQL
- GET JSON BBolt ( 74 )
- GET ( map)
.
Requests per second Concurrency.

Time per req. [ms] Concurrency ( ).

99% percentile [ms] Concurrency.

99% percentile [ms] Concurrency ( ).

backend 100 000 [#/sec] BBolt (oncurrency 128).
1600% , 1464%.
/ NVMe 0,02 [ms] (500 000 IOPS).

Benchmark, HTTP Get handler 13300 ns
BenchmarkHandler_DeptGetHandler-2 1000000 13300 ns/op 15036.97 MB/s 3265 B/op 11 allocs/op
ApacheBench, mean — 0.088 ms.
0.088 — 0.013 = 0.055 ms.
—
:
- net/http.(*conn).serve — (61.85%)
- net/http.(*connReader).backgroundRead — (7.04%)
- runtime.gcBgMarkWorker — (18.30%)
HTTP server (61.85%):
- — net/http.(*conn).readRequest — (9.29%). .
- — net/http.(*response).finishRequest — (21.74%). .
- — net/http.(*ServeMux).ServeHTTP — (23.33%).

readRequest, finishRequest backgroundRead (39.66%), IO Windows — internalpoll.(ioSrv).ExecIO — (24.78%).
Veamos qué hizo nuestro controlador principal net / http. (* ServeMux) .ServeHTTP:
- Análisis de URL y procesamiento de parámetros - github.com/gorilla/mux.(*Route).Match - (2.29%)
- Generando JSON desde una estructura en memoria - github.com/francoispqt/gojay.marshal - (9.92%)
- Trabajando con el caché en memoria - (4.53%)
