TG Telegram Group Link
Channel: Golang
Back to Bottom
πŸ‘£ Sqlc-gen-go-server β€” это ΠΏΠ»Π°Π³ΠΈΠ½ для sqlc, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ автоматичСски Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΡΠ΅Ρ€Π²Π΅Ρ€Π½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Π½Π° Go (gRPC, Connect ΠΈΠ»ΠΈ HTTP) Π½Π° основС SQL-запросов.

Он позволяСт Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ типобСзопасныС API Π±Π΅Π· нСобходимости Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΈΠ»ΠΈ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρ‹.
X (formerly Twitter)

πŸ”§ ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ возмоТности
ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ²: ГСнСрация сСрвСров с использованиСм gRPC, Connect ΠΈΠ»ΠΈ стандартного HTTP.

- Гибкая настройка: Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ указания ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΎΠΏΡ†ΠΈΠΉ, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ имя ΠΏΠ°ΠΊΠ΅Ρ‚Π°, прСфиксы ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΎΠ² ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» sqlc.yaml.

- ΠŸΡ€ΠΎΡΡ‚Π°Ρ интСграция: Π›Π΅Π³ΠΊΠΎ встраиваСтся Π² ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ Π½Π° Go, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ стандартныС инструмСнты ΠΈ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ.

πŸš€ Быстрый старт
Установка sqlc:



go install github.com/sqlc-dev/sqlc/cmd/sqlc@latest


Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ»Π°Π³ΠΈΠ½Π° Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ


sqlc.yaml:

version: '2'
plugins:
- name: go-server
wasm:
url: https://github.com/walterwanderley/sqlc-gen-go-server/releases/download/v0.1.0/sqlc-gen-go-server.wasm
sha256: "<SHA256-сумма>"
sql:
- schema: schema.sql
queries: query.sql
engine: postgresql
codegen:
- plugin: go-server
out: internal/db
options:
package: db


ГСнСрация ΠΊΠΎΠ΄Π°:

sqlc generate

β–ͺ Github

@golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
πŸ‘£ Jessy β€” ΡƒΠ»ΡŒΡ‚Ρ€Π°Π±Ρ‹ΡΡ‚Ρ€Π°Ρ JSON-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для Go

Π‘Π΅Π· рСфлСксии. Π‘Π΅Π· Π°Π»Π»ΠΎΠΊΠ°Ρ†ΠΈΠΉ. Π’ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

βœ… ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π½ΠΎΠ²Ρ‹Ρ… map Π½Π° Π±Π°Π·Π΅ Swiss Table
βœ… Π’Π΅Π³ omitzero для пропуска Π½ΡƒΠ»Π΅Π²Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ
βœ… Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡ‹ TextAppender ΠΈ JsonAppender
βœ… УскорСнный Unmarshal Ρ‡Π΅Ρ€Π΅Π· jessy.UnmarshalTrusted
βœ… ΠšΠ°ΡΡ‚ΠΎΠΌΠ½Ρ‹Π΅ энкодСры: AddValueEncoder, AddUnsafeEncoder

πŸ’‘ Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚:
ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π΅ Jessy Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚ΠΈΠΏ, ΠΈ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ стСк Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ поля ΠΈ всСх Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π²Π΅Ρ‚Π²Π»Π΅Π½ΠΈΠΉ.
Π”Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠ°Ρ Ρ€Π°Π±ΠΎΡ‚Π° β€” просто прямой ΠΌΠ°Ρ€ΡˆΠ°Π»Π»ΠΈΠ½Π³ ΠΈΠ· памяти, Π±Π΅Π· лишнСй Π»ΠΎΠ³ΠΈΠΊΠΈ.

βš™οΈ ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для high-load систСм, realtime-сСрвисов ΠΈ микросСрвисной Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹.
Jessy β€” Π½Π΅ просто быстрСС. БыстрСС всСх.

πŸ”§ Π“Π»Π°Π²Π½ΠΎΠ΅ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚ΠΎΠ²:
ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π½ΠΎΠ²Ρ‹Ρ… вСрсий Go, ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ overhead, Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π°Π²Ρ‚ΠΎΠ³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ассСмблСра.

πŸ”— github.com/avpetkun/jessy-go

@golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
πŸ›  brewkit β€” инструмСнт для ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ сборки ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.

Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚ основан Π½Π° Π΄Π²ΠΈΠΆΠΊΠ΅ BuildKit ΠΈ дополняСт Π΅Π³ΠΎ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌΠΈ Ρ„ΠΈΡˆΠΊΠ°ΠΌΠΈ:
β€’ "АгрСссивноС" ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ всСх этапов сборки;
β€’ ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π² JSONNET.

Π“Π»Π°Π²Π½ΠΎΠ΅ прСимущСство brewkit Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ сборка ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ нСзависима ΠΎΡ‚ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ ΠΈ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π½Π° хостС всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ компиляторы, ΠΊΠΎΠ΄ΠΎΠ³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, Π»ΠΈΠ½Ρ‚Π΅Ρ€Ρ‹ ΠΈ Ρ‚.Π΄., вСдь всё подтягиваСтся ΠΈΠ· Docker-ΠΎΠ±Ρ€Π°Π·ΠΎΠ².

ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ β€” open-source Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ iSpring, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½ повсСмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для сборки ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° Go, ΠΊΠ°ΠΊ локально, Ρ‚Π°ΠΊ ΠΈ Π² CI/CD.

go install github.com/ispringtech/brewkit/cmd/brewkit@latest

πŸ‘©β€πŸ’» GitHub

@golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
🌠 NATS.go β€” ΠΊΠ»ΠΈΠ΅Π½Ρ‚ для ΠΎΠ±Π»Π°Ρ‡Π½ΠΎΠ³ΠΎ ΠΎΠ±ΠΌΠ΅Π½Π° сообщСниями Π½Π° Go. ΠžΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Go-ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΎΡ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ NATS.io прСдоставляСт простой интСрфСйс для Ρ€Π°Π±ΠΎΡ‚Ρ‹ β€” ΠΎΡ‚ Π±Π°Π·ΠΎΠ²ΠΎΠΉ pub/sub Π΄ΠΎ пСрсистСнтных JetStream-сообщСний.

Достаточно Ρ‚Ρ€Ρ‘Ρ… строк ΠΊΠΎΠ΄Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Ρ‚ΡŒΡΡ Π½Π° Ρ‚ΠΎΠΏΠΈΠΊ ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ сообщСния асинхронно. ΠšΠ»ΠΈΠ΅Π½Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ всС Ρ„ΠΈΡˆΠΊΠΈ NATS: wildcard-подписки, TLS-Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΈ Π΄Π°ΠΆΠ΅ сСрвисный API для создания микросСрвисов.

πŸ€– GitHub

@golang_google
πŸ•°οΈ ΠŸΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΊΠ°ΠΌΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ `time` Π² Go

ΠŸΠ°ΠΊΠ΅Ρ‚ time Π² языкС Go β€” ΠΌΠΎΡ‰Π½Ρ‹ΠΉ инструмСнт, Π½ΠΎ с рядом нюансов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, особСнно ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ кросс-ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, тСстировании ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с часовыми поясами. Π’ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ["Important Considerations When Using Go's Time Package"](https://dev.to/rezmoss/important-considerations-when-using-gos-time-package-910-3aim) Π°Π²Ρ‚ΠΎΡ€ выдСляСт ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ стоит ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Go-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ.

Π Π°Π±ΠΎΡ‚Π° со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ β€” это всСгда Π·ΠΎΠ½Π° риска: Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ ΠΈΠ·-Π·Π° смСны часового пояса ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° Π½Π° Π»Π΅Ρ‚Π½Π΅Π΅ врСмя ваша систСма Π½Π°Ρ‡Π½Ρ‘Ρ‚ вСсти сСбя нСпрСдсказуСмо. Π’ Go это особСнно ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ язык Π΄Π΅Π»Π°Π΅Ρ‚ ставку Π½Π° простоту, Π½ΠΎ прСдоставляСт Ρ‚ΠΎΠ½ΠΊΠΈΠ΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ управлСния Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ.

ΠŸΠ΅Ρ€Π΅ΠΉΠ΄Ρ‘ΠΌ ΠΊ основным идСям ΡΡ‚Π°Ρ‚ΡŒΠΈ:

- ΠœΠΎΠ½ΠΎΡ‚ΠΎΠ½Π½ΠΎΠ΅ врСмя Π² Go
Go ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΌΠΎΠ½ΠΎΡ‚ΠΎΠ½Π½Ρ‹Π΅ часы (monotonic time) ΠΏΡ€ΠΈ сравнСнии Π²Ρ€Π΅ΠΌΡ‘Π½ ΠΈ вычислСнии ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΠΎΠ². Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ€ΠΎΠ΄Π΅ time.Since(start) ΠΈΠ»ΠΈ time.Until(deadline) Π½Π΅ зависят ΠΎΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ систСмного Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Ρ‡Ρ‚ΠΎ Π·Π°Ρ‰ΠΈΡ‰Π°Π΅Ρ‚ ΠΎΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΏΡ€ΠΈ Π΅Π³ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ссли систСмноС врСмя измСнилось Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½Π° Π»Π΅Ρ‚Π½Π΅Π΅/Π·ΠΈΠΌΠ½Π΅Π΅).

Однако Π΅ΡΡ‚ΡŒ нюанс: ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΌΠΎΠ½ΠΎΡ‚ΠΎΠ½Π½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ зависит ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы. НапримСр, Π½Π° Windows ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ Linux. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ time.Time, особСнно ΠΏΡ€ΠΈ сСриализации (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, MarshalJSON`), Π½Π΅ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ монотонности. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ нСльзя ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π½Π° `time.Since() ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ экзСмплярами Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, сСриализованными ΠΈ дСсСриализованными ΠΌΠ΅ΠΆΠ΄Ρƒ процСссами ΠΈΠ»ΠΈ машинами.

Π’ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΉ
Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ€ΠΎΠ΄Π΅ time.Sleep ΠΈΠ»ΠΈ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Ρ‹ (`time.After`) Π½Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ точности Π² миллисСкундах ΠΈΠ»ΠΈ Ρ‚Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅ микросСкундах. Если Π²Π°ΠΌ Π²Π°ΠΆΠ½ΠΎ ΠΎΡ‡Π΅Π½ΡŒ Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ β€” Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² измСрСниях ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ β€” Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ с ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΎΠΉ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Ρ…ΠΎΡ‚ΡŒ это ΠΈ Π±ΠΎΠ»Π΅Π΅ Π·Π°Ρ‚Ρ€Π°Ρ‚Π½ΠΎ для CPU:


deadline := time.Now().Add(1 * time.Millisecond)
for time.Now().Before(deadline) {
// Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ busy-loop
}


Π’Π°ΠΊΠΎΠΉ способ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π΅Π½ Π² тСстах, Π³Π΄Π΅ Π½ΡƒΠΆΠ½Π° высокая Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ, Π½ΠΎ для ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½Π° Π½Π΅ рСкомСндуСтся ΠΈΠ·-Π·Π° Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ.

Π‘Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠΈΠ½Π³ ΠΈ измСрСния
МногиС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ time.Now() для измСрСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΊΠΎΠ΄Π°. Π­Ρ‚ΠΎ ошибка. ВмСсто этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚ testing ΠΈ Π΅Π³ΠΎ возмоТности Benchmark:


func BenchmarkMyFunc(b *testing.B) {
for i := 0; i < b.N; i++ {
MyFunc()
}
}


Go сам ΠΏΠΎΠ΄Π±Π΅Ρ€Ρ‘Ρ‚ количСство ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ ΠΈ обСспСчит Π½Π°Π΄Ρ‘ΠΆΠ½Ρ‹Π΅ измСрСния с ΡƒΡ‡Ρ‘Ρ‚ΠΎΠΌ ΡˆΡƒΠΌΠΎΠ² ΠΈ сборщика мусора.

ЧасовыС пояса
Π’ Go ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ time.Time всСгда содСрТит ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ часовом поясС. Π­Ρ‚ΠΎ Π²Π°ΠΆΠ½ΠΎ! НС ΠΏΡƒΡ‚Π°ΠΉΡ‚Π΅:

- UTC() β€” врСмя Π² UTC
- Local() β€” локальноС систСмноС врСмя
- In(loc *time.Location) β€” ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π·ΠΎΠ½Ρƒ

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ Π·ΠΎΠ½Π°ΠΌΠΈ Ρ‡Π΅Ρ€Π΅Π· Ρ„Π°ΠΉΠ» zoneinfo, Π½ΠΎ Π±ΡƒΠ΄ΡŒΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ β€” Π½Π΅ всС ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π½Ρ‹Π΅ ΠΎΠ±Ρ€Π°Π·Ρ‹ ΠΈΠ»ΠΈ минималистичныС ОБ содСрТат Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π·ΠΎΠ½Π°Ρ…, ΠΈ это ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹ΠΌ ошибкам.

Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΡ‘Π½
ΠŸΡ€ΠΈ сравнСнии Π²Ρ€Π΅ΠΌΡ‘Π½ Π²Π°ΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ ΠΊ ΠΎΠ΄Π½ΠΎΠΉ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π·ΠΎΠ½Π΅. Π”Π°ΠΆΠ΅ Ссли Π΄Π²Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° time.Time ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π½ΠΎ ΠΎΠ΄ΠΈΠ½ β€” Π² UTC, Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ β€” Π² Local(), t1.Equal(t2) ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ false. Для сравнСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅:


t1.UTC().Equal(t2.UTC())


Или ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Sub() ΠΈ Before/After β€” ΠΎΠ½ΠΈ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ ΠΌΠΎΠ½ΠΎΡ‚ΠΎΠ½Π½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ бСзопаснСС.

πŸ“Œ ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΡΡ‚ΠΈ
ΠŸΠΎΡΡ‚ ΠΎΠ± Π°ΡƒΠ΄ΠΈΡ‚Π΅ ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΠΈ Go ΠΎΡ‚ Trail of Bits

Π‘Ρ‚Π°Ρ‚ΡŒΡ Π½Π° [go.dev](http://go.dev/blog/tob-crypto-audit) посвящСна Π°ΡƒΠ΄ΠΈΡ‚Ρƒ бСзопасности криптографичСских Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Go, ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌΡƒ Trail of Bits. ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹:

πŸ” Высокая Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΠΈ Go: Аудит ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€Π΄ΠΈΠ» Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ криптографичСских ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Go, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ строгим ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠΌ ΠΊ бСзопасности, минимальной ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΊΠΎΠ΄Π° ΠΈ Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ тСстированиСм. Π­Ρ‚ΠΎ обСспСчиваСт Π·Π°Ρ‰ΠΈΡ‚Ρƒ ΠΎΡ‚ уязвимостСй, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, благодаря свойствам языка Go.

πŸ›  ЕдинствСнная ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ: ΠžΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π° ΠΎΠ΄Π½Π° ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ эксплуатируСмая ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° (TOB-GOCL-3) Π½ΠΈΠ·ΠΊΠΎΠΉ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΠΎΡΡ‚ΠΈ Π² ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ Go+BoringCrypto, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ Google. Π£ΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ связана с ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΈ ΡƒΠΆΠ΅ исправлСна Π² Go 1.25. Она Π½Π΅ Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°Π΅Ρ‚ стандартныС сборки Go, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Go+BoringCrypto Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

πŸ•’ Π’Π°ΠΉΠΌΠΈΠ½Π³ΠΎΠ²Ρ‹Π΅ Π°Ρ‚Π°ΠΊΠΈ: НайдСны Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ риски Ρ‚Π°ΠΉΠΌΠΈΠ½Π³ΠΎΠ²Ρ‹Ρ… ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Ρ… ΠΊΠ°Π½Π°Π»ΠΎΠ² (TOB-GOCL-1, TOB-GOCL-2, TOB-GOCL-6). Волько TOB-GOCL-2 Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с сСкрСтными Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, Π½ΠΎ лишь Π½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ… Power ISA (ppc64, ppc64le). ВсС замСчания исправлСны Π² Go 1.25.

πŸ” Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ: Аудит выявил нСсколько ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Π·Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠΉ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ риски Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ использования API (TOB-GOCL-4) ΠΈ отсутствиС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ нСдостиТимого Π»ΠΈΠΌΠΈΡ‚Π° (TOB-GOCL-5). Π­Ρ‚ΠΈ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΡ‡Ρ‚Π΅Π½Ρ‹ Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Go 1.25.

πŸš€ Π‘ΡƒΠ΄ΡƒΡ‰Π΅Π΅ ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΠΈ Go: Команда Go ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅Ρ‚ Π²Π½Π΅Π΄Ρ€ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ высокоуровнСвыС API, ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‰ΠΈΠ΅ Π²Ρ‹Π±ΠΎΡ€ бСзопасных Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ², начиная с API для Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ с автоматичСским ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠΌ Π½Π° Π½ΠΎΠ²Ρ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ развития Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ.

https://go.dev/blog/tob-crypto-audit

@golang_google
πŸ‘£ Stateless Postgres Query Router β€” это систСма ΡˆΠ°Ρ€Π΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ для PostgreSQL-кластСра, доступная с ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ исходным ΠΊΠΎΠ΄ΠΎΠΌ. Π•Ρ‘ основной ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, Ρ€ΠΎΡƒΡ‚Π΅Ρ€, Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ запросы ΠΈ опрСдСляСт, Π½Π° ΠΊΠ°ΠΊΠΎΠΌ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌ PostgreSQL-кластСрС слСдуСт Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ ΠΈΠ»ΠΈ запрос.

ΠšΠ»ΡŽΡ‡ΠΈ ΡˆΠ°Ρ€Π΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π² запросС ΠΊΠ°ΠΊ явно, Ρ‚Π°ΠΊ ΠΈ нСявно, Π² Π²ΠΈΠ΄Π΅ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π².
Π’ SPQR Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ ΠΈ сСссионного ΠΏΡƒΠ»ΠΈΠ½Π³Π°, автобалансировки ΡˆΠ°Ρ€Π΄ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Ρ‚Π°Π±Π»ΠΈΡ†, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° всСх Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ, сбора статистики ΠΈ динамичСской ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.

SPQR ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΊΠ°ΠΊ запросы ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΌΡƒ ΡˆΠ°Ρ€Π΄Ρƒ, Ρ‚Π°ΠΊ ΠΈ запросы ΠΊΠΎ всСм ΡˆΠ°Ρ€Π΄Π°ΠΌ. Π’ Π±Π»ΠΈΠΆΠ°ΠΉΡˆΠΈΡ… ΠΏΠ»Π°Π½Π°Ρ… β€” Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Π΄Π²ΡƒΡ…Ρ„Π°Π·Π½Ρ‹Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ ΠΈ рСфСрСнсных Ρ‚Π°Π±Π»ΠΈΡ†.

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ SPQR распространяСтся ΠΏΠΎΠ΄ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠ΅ΠΉ PostgreSQL Global Development Group

⚑️ Бсылки:
🟒https://github.com/pg-sharding/spqr
🟒https://pg-sharding.tech/

@golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
πŸ•ŠοΈ RoadRunner β€” Π²Ρ‹ΡΠΎΠΊΠΎΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ application server Π½Π° Go. Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ замСняСт связку Nginx+PHP-FPM, позволяя Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ PSR-7-совмСстимыС прилоТСния с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ HTTP/3, WebSockets ΠΈ Π΄Π°ΠΆΠ΅ Temporal workflow.

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Ρ‡Π΅Ρ€Π΅Π· .rr.yaml Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ docker-compose: ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ, кСш ΠΈ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ ΠΊΠ°ΠΊ ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹. Π Π°Π±ΠΎΡ‡ΠΈΠ΅ процСссы PHP ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ Π² памяти, Ρ‡Ρ‚ΠΎ Π΄Π°Ρ‘Ρ‚ Π΄ΠΎ 10x прирост скорости ΠΏΡ€ΠΎΡ‚ΠΈΠ² Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ FPM. ОсобСнно Ρ€Π°Π΄ΡƒΠ΅Ρ‚ встроСнная систСма ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° ΠΈ автоматичСскиС рСстарты ΡƒΠΏΠ°Π²ΡˆΠΈΡ… Π²ΠΎΡ€ΠΊΠ΅Ρ€ΠΎΠ².

πŸ€– GitHub

@golang_google
πŸ‘£ FFmate β€” умная автоматизация Π½Π° Π±Π°Π·Π΅ FFmpeg

FFmate β€” это соврСмСнный ΠΈ ΠΌΠΎΡ‰Π½Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ²Π΅Ρ€Ρ… FFmpeg. Он ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Π²ΠΈΠ΄Π΅ΠΎ ΠΈ Π°ΡƒΠ΄ΠΈΠΎ, прСвращая хаос транскодирования Π² чистыС, Π½Π°Π΄Ρ‘ΠΆΠ½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ :contentReference[oaicite:0]{index=0}.

✨ ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ возмоТности

- REST API β€” ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΈ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ
- Π’Π΅Π±-интСрфСйс β€” ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π±Π΅Π· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки
- Watchfolders β€” автоматичСски ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹, появившиСся Π² ΠΏΠ°ΠΏΠΊΠ΅
- Presets β€” Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ настройки для Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡
- Webhooks β€” увСдомлСния ΠΎ событиях Π·Π°Π΄Π°Ρ‡
- Wildcards β€” ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹Π΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ для имСнования ΠΈ ΠΏΠ°ΠΏΠΎΠΊ
- Hooks pre/post-processing β€” запуск скриптов Π΄ΠΎ ΠΈ послС Π·Π°Π΄Π°Ρ‡
- ВстроСнная ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ β€” ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°ΠΌΠΈ ΠΈ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ :contentReference[oaicite:1]{index=1}

βœ… ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ примСнСния

- АвтоматичСскоС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΠΈΠ΄Π΅ΠΎ, ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π°ΡƒΠ΄ΠΈΠΎ ΠΈ созданиС ΠΏΡ€Π΅Π²ΡŒΡŽ
- ΠŸΠΎΡΡ‚ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ½-ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Ρ‹ ΠΈ ΠΌΠ΅Π΄ΠΈΠ°-ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ
- Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ с MAM-систСмами Ρ‡Π΅Ρ€Π΅Π· Π²Π΅Π±Ρ…ΡƒΠΊΠΈ
- Π¦Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ΅ API-first ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ FFmpeg
- ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠ· ΠΏΠ°ΠΏΠΊΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠ°ΠΌΠ΅Ρ€Ρ‹) β€” всё Π±Π΅Π· Ρ€ΡƒΡ‡Π½ΠΎΠ³ΠΎ запуска :contentReference[oaicite:2]{index=2}

πŸ›  АрхитСктура ΠΈ запуск

FFmate написан Π½Π° Go, распространяСтся ΠΏΠΎΠ΄ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠ΅ΠΉ SSPL. Π’ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ Π΅ΡΡ‚ΡŒ:
- ΠšΠ»ΠΈΠ΅Π½Ρ‚ ΠΈ сСрвСр (REST API + Web UI)
- Dockerfile ΠΈ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ для сборки
- ДокумСнтация ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π² docs/ :contentReference[oaicite:3]{index=3}

πŸ“£ МнСниС сообщСства

Из обсуТдСний Π½Π° Reddit:
> β€œIf you've ever struggled with managing multiple FFmpeg jobs, messy filenames, or automating transcoding tasks, FFmate might be just what you need.” :contentReference[oaicite:4]{index=4}

Π­Ρ‚ΠΎ Ρ€Π΅Π·ΡŽΠΌΠΈΡ€ΡƒΠ΅Ρ‚ ΡΡƒΡ‚ΡŒ β€” ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡Ρƒ массового ΠΈ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ транскодирования.

πŸ”— ΠŸΠΎΠ»Π΅Π·Π½Ρ‹Π΅ ссылки

- GitHub: https://github.com/welovemedia/ffmate
- ДокумСнтация: https://docs.ffmate.io

@golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
πŸ› οΈ Π˜ΡΡ‚ΠΎΡ€ΠΈΡ создания β€œstorage-agnostic” message queue

ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚:
Работая Π½Π° Go, Π°Π²Ρ‚ΠΎΡ€ вдохновился инструмСнтами ΠΈΠ· Node.js экосистСмы (BullMQ, RabbitMQ) ΠΈ Π·Π°Ρ…ΠΎΡ‚Π΅Π» ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΡ…ΠΎΠΆΠ΅Π΅, Π½ΠΎ с нуля, Π±Π΅Π· зависимостСй. Π’Π°ΠΊ Ρ€ΠΎΠ΄ΠΈΠ»Π°ΡΡŒ идСя β€” сначала ΠΎΠ½ создал Gocq (Go Concurrent Queue): ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ concurrent-ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΡƒΡŽ Ρ‡Π΅Ρ€Π΅Π· ΠΊΠ°Π½Π°Π»Ρ‹.

⚑ Основная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°


Gocq ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π» Π² памяти, Π½ΠΎ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π» устойчивоС Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡.
Автор задумался: Π° ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Π½Π΅ Π·Π°Π²ΠΈΡΡΡ‰ΡƒΡŽ ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° β€” Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Ρ‘ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΊ Redis, SQLite ΠΈΠ»ΠΈ совсСм Π±Π΅Π· Π½ΠΈΡ…?

🧱 Как это Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ Π² VarMQ

ПослС Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³Π° Gocq Π±Ρ‹Π» Ρ€Π°Π·Π΄Π΅Π»Ρ‘Π½ Π½Π° Π΄Π²Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°:
1) Worker pool β€” ΠΏΡƒΠ» Π²ΠΎΡ€ΠΊΠ΅Ρ€ΠΎΠ², ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… Π·Π°Π΄Π°Ρ‡ΠΈ
2) Queue interface β€” абстракция Π½Π°Π΄ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒΡŽ, Π½Π΅ зависящая ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²ΠΎΡ€ΠΊΠ΅Ρ€ просто Π±Π΅Ρ€Ρ‘Ρ‚ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ, Π½Π΅ зная, Π³Π΄Π΅ ΠΎΠ½ΠΈ хранятся.

🧠 ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования

β€’ In-memory ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ:


w := varmq.NewVoidWorker(func(data any) {
// ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π·Π°Π΄Π°Ρ‡ΠΈ
}, 2)
q := w.BindQueue()


β€’ Π‘ SQLite-ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ:


import "github.com/goptics/sqliteq"

db := sqliteq.New("test.db")
pq, _ := db.NewQueue("orders")
q := w.WithPersistentQueue(pq)


β€’ Π‘ Redis (для распрСдСлённой ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ):


import "github.com/goptics/redisq"

rdb := redisq.New("redis://localhost:6379")
pq := rdb.NewDistributedQueue("transactions")
q := w.WithDistributedQueue(pq)


Π’ ΠΈΡ‚ΠΎΠ³Π΅ Π²ΠΎΡ€ΠΊΠ΅Ρ€ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ β€” нСзависимо ΠΎΡ‚ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°.

βœ… ΠŸΠΎΡ‡Π΅ΠΌΡƒ это ΠΊΡ€ΡƒΡ‚ΠΎ

β€’ Π“ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ: Π°Π΄Π°ΠΏΡ‚Π΅Ρ€Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π»Π΅Π³ΠΊΠΎ ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Π±Π΅Π· ΠΏΡ€Π°Π²ΠΎΠΊ Π²ΠΎΡ€ΠΊΠ΅Ρ€Π°
β€’ ΠœΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ зависимости: Π² яд

πŸ“Œ Π§ΠΈΡ‚Π°Ρ‚ΡŒ
⚑️ OneUptime β€” open-source-ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° для ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° всСго ΠΈ сразу. Π­Ρ‚ΠΎΡ‚ инструмСнт ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚: ΠΎΡ‚ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° uptime Π΄ΠΎ управлСния ΠΈΠ½Ρ†ΠΈΠ΄Π΅Π½Ρ‚Π°ΠΌΠΈ. Π Π΅Π΄ΠΊΠΈΠΉ случай, ΠΊΠΎΠ³Π΄Π° open-source-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π½Π΅ уступаСт коммСрчСским Π°Π½Π°Π»ΠΎΠ³Π°ΠΌ ΠΏΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Ρƒ.

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π² Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠΉ интСграция ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ². НапримСр, ΠΏΡ€ΠΈ ΠΏΠ°Π΄Π΅Π½ΠΈΠΈ сСрвиса систСма автоматичСски создаёт ΠΈΠ½Ρ†ΠΈΠ΄Π΅Π½Ρ‚, увСдомляСт отвСтствСнных Ρ‡Π΅Ρ€Π΅Π· ΡΡΠΊΠ°Π»Π°Ρ†ΠΈΡŽ ΠΈ обновляСт статус-страницу. Π•ΡΡ‚ΡŒ Π΄Π°ΠΆΠ΅ встроСнный APM с трСйсами ΠΈ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ°ΠΌΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π½Π° Kubernetes ΠΈΠ»ΠΈ Ρ‡Π΅Ρ€Π΅Π· Docker Compose.

πŸ€– GitHub

@golang_google
πŸ§ͺ Go synctest β€” Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ для Π½Π΅ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… (flaky) тСстов

Flaky-тСсты Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΌ Go-ΠΊΠΎΠ΄Π΅ β€” боль. Новый ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ инструмСнт synctest ΠΈΠ· Go 1.24 Ρ€Π΅ΡˆΠ°Π΅Ρ‚ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ синтСтичСского Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ контроля исполнСния goroutine.

πŸ“Œ Π§Ρ‚ΠΎ это Ρ‚Π°ΠΊΠΎΠ΅:
synctest β€” ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ, Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΠΈΠΉ тСсты Π² ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ "пСсочницС", Π³Π΄Π΅:
β€’ time.Sleep Π½Π΅ ΠΆΠ΄Ρ‘Ρ‚ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ
β€’ всС goroutine ΠΈΡΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ
β€’ Π½Π΅Ρ‚ зависимости ΠΎΡ‚ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠ° ΠΈ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ОБ

πŸ”§ ΠŸΡ€ΠΈΠΌΠ΅Ρ€:


import "testing/synctest"

func TestSharedValue(t *testing.T) {
synctest.Run(func() {
var shared atomic.Int64
go func() {
shared.Store(1)
time.Sleep(1 * time.Microsecond)
shared.Store(2)
}()
time.Sleep(5 * time.Microsecond)
if shared.Load() != 2 {
t.Errorf("shared = %d, want 2", shared.Load())
}
})
}


⏱ Π”Π°ΠΆΠ΅ с Sleep, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ всСгда стабилСн. Π‘Π΅Π· synctest Ρ‚Π°ΠΊΠΎΠΉ тСст ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ½ΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ.

βš™οΈ ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π°:
βœ… УстранСниС race-условий ΠΏΡ€ΠΈ тСстировании
βœ… НСт Π·Π°Π΄Π΅Ρ€ΠΆΠ΅ΠΊ β€” Sleep срабатываСт ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ
βœ… МоТно Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ с Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ Π΄ΠΎ микросСкунды
βœ… ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Π»ΡŽΠ±Ρ‹Ρ… atomic, mutex, select, time.After ΠΈ Π΄Ρ€.

🚫 ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ:
β€’ Пока ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎ: Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ с GOEXPERIMENT=synctest
β€’ НС ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΡΠ΅Ρ‚ΡŒΡŽ ΠΈΠ»ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ Π²Π½Π΅ "bubble"

πŸ“– ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅:
https://victoriametrics.com/blog/go-synctest/

@golang_google
πŸ“¦ Как ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ struct Π² Go: Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅, ΠΏΠ°Π΄Π΄ΠΈΠ½Π³ ΠΈ порядок ΠΏΠΎΠ»Π΅ΠΉ

Когда Ρ‚Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΡˆΡŒ с Go ΠΈ структурой Π΄Π°Π½Π½Ρ‹Ρ… (`struct`), порядок ΠΏΠΎΠ»Π΅ΠΉ β€” это Π½Π΅ просто эстСтика. Π­Ρ‚ΠΎ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ влияСт Π½Π°:
β€’ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΠΎΠΉ памяти
β€’ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ использования кэша
β€’ ΠΈ Π² ΠΈΡ‚ΠΎΠ³Π΅ β€” Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Ρ‚Π²ΠΎΠ΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Автор [buarki Π½Π° DEV.to](https://dev.to/buarki/optimizing-struct-layout-and-padding-in-practice-23p1) ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Π²Ρ‹ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ поля Π² структурах, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ лишнСго ΠΏΠ°Π΄Π΄ΠΈΠ½Π³Π° ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ struct Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹ΠΌ ΠΈ быстрым.

πŸ” Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ padding?

Go автоматичСски Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π΅Ρ‚ поля структур ΠΏΠΎ ΠΈΡ… Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ. НапримСр:

type Bad struct {
a bool // 1 Π±Π°ΠΉΡ‚
b int64 // 8 Π±Π°ΠΉΡ‚
c bool // 1 Π±Π°ΠΉΡ‚
}

ΠšΠ°ΠΆΠ΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ struct Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ 10 Π±Π°ΠΉΡ‚. Но ΠΈΠ·-Π·Π° выравнивания Go вставит ΠΏΠ°Π΄Π΄ΠΈΠ½Π³, ΠΈ ΠΈΡ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ окаТСтся 24 Π±Π°ΠΉΡ‚Π°.

βœ… Как это ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ?

МСняСм порядок ΠΏΠΎΠ»Π΅ΠΉ:

type Good struct {
b int64 // 8 Π±Π°ΠΉΡ‚
a bool // 1 Π±Π°ΠΉΡ‚
c bool // 1 Π±Π°ΠΉΡ‚
}

Π’Π΅ΠΏΠ΅Ρ€ΡŒ структура Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ 16 Π±Π°ΠΉΡ‚, Π° Π½Π΅ 24 β€” ΠΈ всё благодаря Π³Ρ€Π°ΠΌΠΎΡ‚Π½ΠΎΠΌΡƒ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΡŽ ΠΏΠΎΠ»Π΅ΠΉ.

πŸ“Œ Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ:

β€’ Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠΉ поля ΠΎΡ‚ самых ΠΊΡ€ΡƒΠΏΠ½Ρ‹Ρ… ΠΊ самым ΠΌΠ΅Π»ΠΊΠΈΠΌ
β€’ Π“Ρ€ΡƒΠΏΠΏΠΈΡ€ΡƒΠΉ ΠΎΠ΄Π½ΠΎΡ‚ΠΈΠΏΠ½Ρ‹Π΅ поля
β€’ ИзбСгай ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡˆΠΈΠ²Π°Π½ΠΈΡ bool`/`byte с int64`/`float64
β€’ Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, viztruct) для Π°Π½Π°Π»ΠΈΠ·Π° struct'ΠΎΠ²
β€’ ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ struct Ρ‡Π΅Ρ€Π΅Π· unsafe.Sizeof()

🎯 Π­Ρ‚ΠΎ особСнно Π²Π°ΠΆΠ½ΠΎ ΠΏΡ€ΠΈ:
β€’ массовом использовании struct Π² массивах ΠΈ слайсах
β€’ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ struct ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ
β€’ Ρ€Π°Π±ΠΎΡ‚Π΅ с Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°ΠΌΠΈ ΠΈΠ»ΠΈ mmap

πŸ“– ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ: https://dev.to/buarki/optimizing-struct-layout-and-padding-in-practice-23p1
πŸ‘£ Как ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ "ΠΌΠΎΠ»Ρ‡Π°Π»ΠΈΠ²ΡƒΡŽ ΡΠΌΠ΅Ρ€Ρ‚ΡŒ" Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½ Π² Go?

Π’ ΡΡ‚Π°Ρ‚ΡŒΠ΅ рассматриваСтся, ΠΊΠ°ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ "сСрдцСбиСния" (heartbeat) для Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½ Π² Go, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΠΈ своСврСмСнно ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Ρ‚ΡŒ сбои.

πŸ” Π—Π°Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ½Ρ‹ heartbeats?
Иногда Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎ Π±Π΅Π· явных ошибок ΠΈΠ»ΠΈ Π»ΠΎΠ³ΠΎΠ², Ρ‡Ρ‚ΠΎ затрудняСт диагностику. ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ heartbeats позволяСт пСриодичСски ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ сигналы ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½Π° всС Π΅Ρ‰Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½Π° ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ задания. Π­Ρ‚ΠΎ особСнно ΠΏΠΎΠ»Π΅Π·Π½ΠΎ для:

ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° состояния Ρ„ΠΎΠ½ΠΎΠ²Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡

ΠžΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΡ ΠΈ пСрСзапуска "Π·Π°Π²ΠΈΡΡˆΠΈΡ…" Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½

Π£Π»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ надСТности ΠΈ отказоустойчивости систСм

πŸ›  Как это Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ?
Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ time.Ticker, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρƒ Π½Π° ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΡƒ сигналов активности Ρ‡Π΅Ρ€Π΅Π· ΠΊΠ°Π½Π°Π». ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ dowork:


func dowork(done <-chan interface{}, pulseInterval time.Duration) (<-chan interface{}, <-chan struct{}) {
heartbeater := make(chan interface{})
result := make(chan struct{})
go func() {
defer close(result)
defer close(heartbeater)

pulse := time.NewTicker(pulseInterval)
workGen := time.NewTicker(3 * pulseInterval)

defer pulse.Stop()
defer workGen.Stop()

sendPulse := func() {
select {
case heartbeater <- struct{}{}:
default:
// Ссли Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ ΡΠ»ΡƒΡˆΠ°Π΅Ρ‚, пропускаСм
}
}

sendResult := func(res struct{}) {
for {
select {
case <-done:
return
case <-pulse.C:
sendPulse()
case result <- res:
return
}
}
}

for {
select {
case <-done:
return
case <-pulse.C:
sendPulse()
case <-workGen.C:
sendResult(struct{}{})
}
}
}()
return heartbeater, result
}


πŸ§ͺ А Π² main ΠΌΠΎΠΆΠ½ΠΎ ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° этим:


for {
select {
case <-heartbeat:
log.Println("Still alive")
case <-time.After(5 * time.Second):
log.Println("Timeout! Goroutine might be dead")
}
}
}()


🎯 Π—Π°Ρ‡Π΅ΠΌ это Π½ΡƒΠΆΠ½ΠΎ:
β€’ ΠžΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Π·Π°Π²ΠΈΡΡˆΠΈΡ…/ΡƒΠΌΠ΅Ρ€ΡˆΠΈΡ… Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½
β€’ РСализация watchdog'ΠΎΠ²
β€’ ΠΠ°Π΄Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ„ΠΎΠ½ΠΎΠ²Ρ‹Ρ… процСссов Π² ΠΏΡ€ΠΎΠ΄Π΅

πŸ”— Π‘Ρ‚Π°Ρ‚ΡŒΡ: https://blog.devgenius.io/how-to-build-heartbeats-in-go-let-your-goroutines-say-still-breathing-d047253d5c78

@golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
πŸ—ƒοΈ Stoolap β€” лёгкая ΠΈ быстрая SQL-Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° чистом Go Π±Π΅Π· зависимостСй

Stoolap β€” это соврСмСнный HTAP-Π΄Π²ΠΈΠΆΠΎΠΊ (Hybrid Transactional/Analytical Processing), ΡΠΎΡ‡Π΅Ρ‚Π°ΡŽΡ‰ΠΈΠΉ OLTP ΠΈ OLAP Π² ΠΎΠ΄Π½ΠΎΠΌ ядрС. ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊΠ°ΠΊ для Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡, Ρ‚Π°ΠΊ ΠΈ для Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠΈ.

πŸš€ ВозмоТности:
β€’ ΠŸΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ написан Π½Π° Go β€” Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π²Π½Π΅ΡˆΠ½ΠΈΡ… зависимостСй
β€’ ACID-Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Ρ‡Π΅Ρ€Π΅Π· MVCC
β€’ КолонковоС Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ с SIMD-ускорСниСм
β€’ ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° SQL: JOIN, Π°Π³Ρ€Π΅Π³Π°Ρ‚Ρ‹, ΠΎΠΊΠΎΠ½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
β€’ ВстроСнный Ρ‚ΠΈΠΏ JSON
β€’ ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° database/sql ΠΈ интСграция с GORM
β€’ CLI-Ρ€Π΅ΠΆΠΈΠΌ ΠΈ in-memory Π±Π°Π·Π°

πŸ“¦ Установка:

go get github.com/stoolap/stoolap


πŸ”₯ Быстрый старт (CLI):

stoolap -db memory://


πŸ“Ž Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ: https://github.com/stoolap/stoolap
🌐 Π‘Π°ΠΉΡ‚: https://stoolap.io


@golang_google
πŸ—οΈ Как ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ multi-tenant прилоТСния Π½Π° Go β€” ΠΎΠΏΡ‹Ρ‚ Atlas Cloud

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π° Atlas дСлится практичСскими стратСгиями ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ multi-tenant ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° Go, основанными Π½Π° ΠΎΠΏΡ‹Ρ‚Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ бэкСнда для Atlas Cloud β€” части ΠΈΡ… коммСрчСского ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°.

πŸ” Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ multi-tenancy?

Multi-tenancy β€” это Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ΄ΠΈΠ½ инстанс систСмы обслуТиваСт сразу Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² (Π°Ρ€Π΅Π½Π΄Π°Ρ‚ΠΎΡ€ΠΎΠ²).

πŸ“¦ Но Ρ‚ΡƒΡ‚ Π²Π°ΠΆΠ΅Π½ нюанс: ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ сСрвис Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ ΠΎΠ½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Π½ΠΈΡ… β€” Π±Π΅Π· ΠΏΠΎΡ‚Π΅Ρ€ΡŒ Π² скорости, надёТности ΠΈ бСзопасности.

ИмСнно поэтому Π²Ρ‹ *ΠΌΠΎΠ»Ρ‡Π°* ΠΎΠ±Π΅Ρ‰Π°Π΅Ρ‚Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ Π΄Π²Π΅ Π²Π΅Ρ‰ΠΈ:

1. Π˜Π·ΠΎΠ»ΡΡ†ΠΈΡ Π΄Π°Π½Π½Ρ‹Ρ… β€” Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π°Ρ€Π΅Π½Π΄Π°Ρ‚ΠΎΡ€ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ доступ ΠΊ Ρ‡ΡƒΠΆΠΈΠΌ Π΄Π°Π½Π½Ρ‹ΠΌ
2. Π‘Ρ‚Π°Π±ΠΈΠ»ΡŒΠ½Π°Ρ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ β€” Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π°Ρ€Π΅Π½Π΄Π°Ρ‚ΠΎΡ€Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π·Π°ΠΌΠ΅Π΄Π»ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΡ…

πŸ›‘οΈ БтратСгия β„–1 β€” ЀизичСская изоляция (Dedicated Instances)

Π‘Π°ΠΌΡ‹ΠΉ прямой способ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ эти обСщания β€” запуск ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ инстанса прилоТСния Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π°Ρ€Π΅Π½Π΄Π°Ρ‚ΠΎΡ€Π°.

Π§Ρ‚ΠΎ это Π΄Π°Ρ‘Ρ‚:

βœ… Π”Π°Π½Π½Ρ‹Π΅ Π°Ρ€Π΅Π½Π΄Π°Ρ‚ΠΎΡ€ΠΎΠ² хранятся Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Π‘Π” (ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ Π² Ρ€Π°Π·Π½Ρ‹Ρ… VPC/ΠΎΠ±Π»Π°ΠΊΠ°Ρ…)
βœ… Полная изоляция рСсурсов β€” Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ ΡˆΡƒΠΌΠΈΡ‚ ΠΈ Π½Π΅ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚
βœ… Π‘Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ инфраструктуры

πŸ’Έ Но Ρƒ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° Π΅ΡΡ‚ΡŒ ΠΈ минусы:

β€’ Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π² ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ: сотни ΠΈ тысячи Ρ€Π°Π·Π²Ρ‘Ρ€Π½ΡƒΡ‚Ρ‹Ρ… инстансов, каТдая со своСй Π‘Π” ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ
β€’ Π‘Ρ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ: ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ инстанс потрСбляСт рСсурсы, ΠΈ это Π΄ΠΎΡ€ΠΎΠ³ΠΎ
β€’ ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ: ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ = Π½ΠΎΠ²Ρ‹ΠΉ Π΄Π΅ΠΏΠ»ΠΎΠΉ
β€’ БлоТности с Π½Π°Π±Π»ΡŽΠ΄Π°Π΅ΠΌΠΎΡΡ‚ΡŒΡŽ: Π»ΠΎΠ³ΠΈ, ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ ΠΈ Π΄Π΅Π±Π°Π³ β€” Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ распрСдСлСны ΠΏΠΎ ΠΊΡƒΡ‡Π΅ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΉ

Π’ ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π°Π²Ρ‚ΠΎΡ€Ρ‹ Ρ€Π°Π·Π±ΠΈΡ€Π°ΡŽΡ‚ Π³ΠΈΠ±Ρ€ΠΈΠ΄Π½Ρ‹Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹, ΠΌΠΎΠ΄Π΅Π»ΠΈ хранСния, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΉ ΠΈ совСты ΠΏΠΎ ΠΊΠΎΠ΄Ρƒ.

πŸ”— ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ Ρ‡ΠΈΡ‚Π°ΠΉ Ρ‚ΡƒΡ‚:
https://atlasgo.io/blog/2025/05/26/gophercon-scalable-multi-tenant-apps-in-go

@golang_google
πŸ“¦ godump β€” ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ Go-инструмСнт для Π΄Π°ΠΌΠΏΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΠΌ Π²ΠΈΠ΄Π΅

godump β€” это мощная Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° fmt.Printf("%#v") ΠΈ spew.Dump для Go-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ².

Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ красиво ΠΈ наглядно Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ содСрТимоС структур, ΠΊΠ°Ρ€Ρ‚, срСзов ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

πŸ› οΈ Π§Ρ‚ΠΎ ΡƒΠΌΠ΅Π΅Ρ‚ godump:
β€’ ΠšΡ€Π°ΡΠΈΠ²ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ структуры ΠΈ срСзы
β€’ ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΊΠ°Ρ€Ρ‚Ρ‹, интСрфСйсы, ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, Ρ†ΠΈΠΊΠ»Ρ‹
β€’ Π’Ρ‹Π²ΠΎΠ΄ Π² Ρ†Π²Π΅Ρ‚Π΅ (ANSI) ΠΈ с отступами
β€’ Π£ΠΌΠ΅Π΅Ρ‚ ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ цикличСскиС ссылки
β€’ ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ API: godump.Dump(anyObject)

πŸ’‘ ΠžΡ‚Π»ΠΈΡ‡Π½ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для:
- ΠžΡ‚Π»Π°Π΄ΠΊΠΈ ΠΈ логирования слоТных структур
- Π˜Π½ΡΠΏΠ΅ΠΊΡ†ΠΈΠΈ JSON-Π΄Π°Π½Π½Ρ‹Ρ… послС Π°Π½ΠΌΠ°Ρ€ΡˆΠ°Π»ΠΈΠ½Π³Π°
- Быстрой Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ содСрТимого Π±Π΅Π· IDE

πŸ” ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования:

import "github.com/goforj/godump"

type User struct {
Name string
Tags []string
}

func main() {
user := User{"Alice", []string{"dev", "golang"}}
godump.Dump(user)
}


πŸš€ Установка:

go get github.com/goforj/godump


πŸ”— https://github.com/goforj/godump

Если fmt.Println ΡƒΠΆΠ΅ Π½Π΅ справляСтся β€” ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉ godump. ΠšΡ€Π°ΡΠΈΠ²ΠΎ. Быстро. Π“Π»ΡƒΠ±ΠΎΠΊΠΎ.

@golang_google
πŸ‘£ Tyk Gateway

Π­Ρ‚ΠΎ соврСмСнный, ΡΠ²Π΅Ρ€Ρ…ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ, ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΉ API-шлюз с ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ исходным ΠΊΠΎΠ΄ΠΎΠΌ.

Tyk Operator прСдоставляСт возмоТности ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π° управлСния API Π² Kubernetes. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ Ingress, API, ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ бСзопасности, Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ, Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΡŽ, посрСдничСство, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π»ΡƒΡ‡ΡˆΠΈΠ΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ GitOps с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… рСсурсов ΠΈ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ², присущих Kubernetes.

πŸ“Œ Github

#golang #devops #дСвопс

@golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
HTML Embed Code:
2025/06/29 22:44:40
Back to Top