go: mongo connection pool

Píšu celkem jednoduchou aplikaci pro práci nad Git repozitáři v GitHubu. Jedním z požadavků je perzistování nagrebovaných meta informací do MongoDB pro další analytické zpracování.

Úzkým hrdlem je práce se samotnou databázi, kde paralelně (ok, konkurenčně) asynchronní zpracování získaných dat pak brzí samotná sdílená konektivita. Aby se mi jednotlivé gorutiny neblokovaly na sdílené globální konektivitě, napsal jsem si jednoduchý connection pool, který mi vytváří a poskytuje nezávislé fyzické konektivity, které pak předávám gorutinám, a tak odblokovávám špunt na globální konektivitě.

Díky connection poolu pak můžu paralelně spouštět jednotlive funkce bez toho, že by si mi v rámci konektivity navzájem brzdily.

GitHub

Svoji implementaci connection poolu jsem zveřejnil pod MIT licencí na Githubu. Repo najdete zde.

main.go

Asi nejzajímavější je funkce Create, která vytváří samotný connection pool, a pak z něj pomocí funkce GetRandom získávám jednotlovou konektivitu, která je pak už klasicky použitelná jako běžný MongoDB kient. Vedle funce GetRandom modul disponuje funkcemi GetRoundRobin, která vrací z poolu konektivity stále dokola dle pořadí, a pak funkci Get, která umí parametrem určit, ktetá konkrétní konektivita z poolu se má použít.

mcp.go

Výsledek

Pak může vypadat takto:

PS

Dobré podotknout, že technika, vzor, connection poolu je přenosný na jakýkoliv jiný programovací jazyk. Na implementaci v Go je hezké to, že se dá práce s databází pěkně paralelizovat a tak velice jednoduše performance nafukovat.