Channel: Golang
ΠΠ½ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠΈΠΏΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠ΅ 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
ΠΠ΅Π· ΡΠ΅ΡΠ»Π΅ΠΊΡΠΈΠΈ. ΠΠ΅Π· Π°Π»Π»ΠΎΠΊΠ°ΡΠΈΠΉ. Π ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ.
β ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Π½ΠΎΠ²ΡΡ 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.
π©βπ» GitHub
@golang_google
ΠΠ½ΡΡΡΡΠΌΠ΅Π½Ρ ΠΎΡΠ½ΠΎΠ²Π°Π½ Π½Π° Π΄Π²ΠΈΠΆΠΊΠ΅ BuildKit ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΡΠ΅Ρ Π΅Π³ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΌΠΈ ΡΠΈΡΠΊΠ°ΠΌΠΈ:
β’ "ΠΠ³ΡΠ΅ΡΡΠΈΠ²Π½ΠΎΠ΅" ΠΊΠ΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΡΠ΅Ρ ΡΡΠ°ΠΏΠΎΠ² ΡΠ±ΠΎΡΠΊΠΈ;
β’ ΠΡΠΎΡΡΠΎΠΉ ΡΠΎΡΠΌΠ°Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π² JSONNET.
ΠΠ»Π°Π²Π½ΠΎΠ΅ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎ brewkit Π² ΡΠΎΠΌ, ΡΡΠΎ ΡΠ±ΠΎΡΠΊΠ° ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠ° ΠΎΡ ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ ΠΈ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ Π½Π° Ρ ΠΎΡΡΠ΅ Π²ΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ, ΠΊΠΎΠ΄ΠΎΠ³Π΅Π½Π΅ΡΠ°ΡΠΎΡΡ, Π»ΠΈΠ½ΡΠ΅ΡΡ ΠΈ Ρ.Π΄., Π²Π΅Π΄Ρ Π²ΡΡ ΠΏΠΎΠ΄ΡΡΠ³ΠΈΠ²Π°Π΅ΡΡΡ ΠΈΠ· Docker-ΠΎΠ±ΡΠ°Π·ΠΎΠ².
ΠΡΠΎΠ΅ΠΊΡ β open-source ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ iSpring, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΎΠ½ ΠΏΠΎΠ²ΡΠ΅ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° Go, ΠΊΠ°ΠΊ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ, ΡΠ°ΠΊ ΠΈ Π² CI/CD.
go install github.com/ispringtech/brewkit/cmd/brewkit@latest
@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
ΠΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΡΡΡ ΡΡΡΠΎΠΊ ΠΊΠΎΠ΄Π°, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°ΡΡΡΡ Π½Π° ΡΠΎΠΏΠΈΠΊ ΠΈ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎ. ΠΠ»ΠΈΠ΅Π½Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π²ΡΠ΅ ΡΠΈΡΠΊΠΈ NATS: wildcard-ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠΈ, TLS-Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΠΈ Π΄Π°ΠΆΠ΅ ΡΠ΅ΡΠ²ΠΈΡΠ½ΡΠΉ API Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠΎΠ².
π€ GitHub
@golang_google
π°οΈ ΠΠΎΠ΄Π²ΠΎΠ΄Π½ΡΠ΅ ΠΊΠ°ΠΌΠ½ΠΈ ΡΠ°Π±ΠΎΡΡ Ρ ΠΏΠ°ΠΊΠ΅ΡΠΎΠΌ `time` Π² Go
ΠΠ°ΠΊΠ΅Ρ
Π Π°Π±ΠΎΡΠ° ΡΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ β ΡΡΠΎ Π²ΡΠ΅Π³Π΄Π° Π·ΠΎΠ½Π° ΡΠΈΡΠΊΠ°: Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π΅ Π·Π°ΠΌΠ΅ΡΠΈΡΡ, ΠΊΠ°ΠΊ ΠΈΠ·-Π·Π° ΡΠΌΠ΅Π½Ρ ΡΠ°ΡΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΡΡΠ° ΠΈΠ»ΠΈ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π° Π½Π° Π»Π΅ΡΠ½Π΅Π΅ Π²ΡΠ΅ΠΌΡ Π²Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° Π½Π°ΡΠ½ΡΡ Π²Π΅ΡΡΠΈ ΡΠ΅Π±Ρ Π½Π΅ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΠΎ. Π Go ΡΡΠΎ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΠΊΡΠΈΡΠΈΡΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ·ΡΠΊ Π΄Π΅Π»Π°Π΅Ρ ΡΡΠ°Π²ΠΊΡ Π½Π° ΠΏΡΠΎΡΡΠΎΡΡ, Π½ΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ½ΠΊΠΈΠ΅ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ.
ΠΠ΅ΡΠ΅ΠΉΠ΄ΡΠΌ ΠΊ ΠΎΡΠ½ΠΎΠ²Π½ΡΠΌ ΠΈΠ΄Π΅ΡΠΌ ΡΡΠ°ΡΡΠΈ:
- ΠΠΎΠ½ΠΎΡΠΎΠ½Π½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ Π² Go
Go ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΌΠΎΠ½ΠΎΡΠΎΠ½Π½ΡΠ΅ ΡΠ°ΡΡ (monotonic time) ΠΏΡΠΈ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠΈ Π²ΡΠ΅ΠΌΡΠ½ ΠΈ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΈ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»ΠΎΠ². ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΡΠΎΠ΄Π΅
ΠΠ΄Π½Π°ΠΊΠΎ Π΅ΡΡΡ Π½ΡΠ°Π½Ρ: ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΌΠΎΠ½ΠΎΡΠΎΠ½Π½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π° Windows ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ ΠΎΡ Linux. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ
Π’ΠΎΡΠ½ΠΎΡΡΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΉ
Π€ΡΠ½ΠΊΡΠΈΠΈ Π²ΡΠΎΠ΄Π΅
Π’Π°ΠΊΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΠΎΠ»Π΅Π·Π΅Π½ Π² ΡΠ΅ΡΡΠ°Ρ , Π³Π΄Π΅ Π½ΡΠΆΠ½Π° Π²ΡΡΠΎΠΊΠ°Ρ ΡΠΎΡΠ½ΠΎΡΡΡ, Π½ΠΎ Π΄Π»Ρ ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½Π° Π½Π΅ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ ΠΈΠ·-Π·Π° Π½Π°Π³ΡΡΠ·ΠΊΠΈ.
ΠΠ΅Π½ΡΠΌΠ°ΡΠΊΠΈΠ½Π³ ΠΈ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ
ΠΠ½ΠΎΠ³ΠΈΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ
Go ΡΠ°ΠΌ ΠΏΠΎΠ΄Π±Π΅ΡΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΉ ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡ Π½Π°Π΄ΡΠΆΠ½ΡΠ΅ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Ρ ΡΡΡΡΠΎΠΌ ΡΡΠΌΠΎΠ² ΠΈ ΡΠ±ΠΎΡΡΠΈΠΊΠ° ΠΌΡΡΠΎΡΠ°.
Π§Π°ΡΠΎΠ²ΡΠ΅ ΠΏΠΎΡΡΠ°
Π 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
Π‘ΡΠ°ΡΡΡ Π½Π° [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
ΠΠ»ΡΡΠΈ ΡΠ°ΡΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΌΠΎΠ³ΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡΡΡ Π² Π·Π°ΠΏΡΠΎΡΠ΅ ΠΊΠ°ΠΊ ΡΠ²Π½ΠΎ, ΡΠ°ΠΊ ΠΈ Π½Π΅ΡΠ²Π½ΠΎ, Π² Π²ΠΈΠ΄Π΅ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅Π².
Π SPQR ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ ΠΈ ΡΠ΅ΡΡΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠ»ΠΈΠ½Π³Π°, Π°Π²ΡΠΎΠ±Π°Π»Π°Π½ΡΠΈΡΠΎΠ²ΠΊΠΈ ΡΠ°ΡΠ΄ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΡΠ°Π±Π»ΠΈΡ, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Π²ΡΠ΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ, ΡΠ±ΠΎΡΠ° ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΈ ΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΏΠ΅ΡΠ΅Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ.
SPQR ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΊΠ°ΠΊ Π·Π°ΠΏΡΠΎΡΡ ΠΊ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΠΎΠΌΡ ΡΠ°ΡΠ΄Ρ, ΡΠ°ΠΊ ΠΈ Π·Π°ΠΏΡΠΎΡΡ ΠΊΠΎ Π²ΡΠ΅ΠΌ ΡΠ°ΡΠ΄Π°ΠΌ. Π Π±Π»ΠΈΠΆΠ°ΠΉΡΠΈΡ ΠΏΠ»Π°Π½Π°Ρ β Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ Π΄Π²ΡΡ ΡΠ°Π·Π½ΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ ΠΈ ΡΠ΅ΡΠ΅ΡΠ΅Π½ΡΠ½ΡΡ ΡΠ°Π±Π»ΠΈΡ.
ΠΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ SPQR ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½ΡΠ΅ΡΡΡ ΠΏΠΎΠ΄ Π»ΠΈΡΠ΅Π½Π·ΠΈΠ΅ΠΉ PostgreSQL Global Development Group
β‘οΈ Π‘ΡΡΠ»ΠΊΠΈ:
@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.
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΡΠ΅ΡΠ΅Π·
π€ GitHub
@golang_google
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΡΠ΅ΡΠ΅Π·
.rr.yaml
Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ docker-compose: ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ, ΠΊΠ΅Ρ ΠΈ ΠΌΠ΅ΡΡΠΈΠΊΠΈ ΠΊΠ°ΠΊ ΠΏΠ»Π°Π³ΠΈΠ½Ρ. Π Π°Π±ΠΎΡΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΡ PHP ΠΎΡΡΠ°ΡΡΡΡ Π² ΠΏΠ°ΠΌΡΡΠΈ, ΡΡΠΎ Π΄Π°ΡΡ Π΄ΠΎ 10x ΠΏΡΠΈΡΠΎΡΡ ΡΠΊΠΎΡΠΎΡΡΠΈ ΠΏΡΠΎΡΠΈΠ² ΡΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ FPM. ΠΡΠΎΠ±Π΅Π½Π½ΠΎ ΡΠ°Π΄ΡΠ΅Ρ Π²ΡΡΡΠΎΠ΅Π½Π½Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠ° ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ΅ΡΡΠ°ΡΡΡ ΡΠΏΠ°Π²ΡΠΈΡ
Π²ΠΎΡΠΊΠ΅ΡΠΎΠ². π€ GitHub
@golang_google
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 ΠΎΡΠ΅ΡΠ΅Π΄Ρ:
β’ Π‘ SQLite-ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ:
β’ Π‘ Redis (Π΄Π»Ρ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΠΎΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ):
Π ΠΈΡΠΎΠ³Π΅ Π²ΠΎΡΠΊΠ΅Ρ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ Π·Π°Π΄Π°ΡΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ β Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ°.
β ΠΠΎΡΠ΅ΠΌΡ ΡΡΠΎ ΠΊΡΡΡΠΎ
β’ ΠΠΈΠ±ΠΊΠΎΡΡΡ: Π°Π΄Π°ΠΏΡΠ΅ΡΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ Π»Π΅Π³ΠΊΠΎ ΠΌΠ΅Π½ΡΡΡ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π±Π΅Π· ΠΏΡΠ°Π²ΠΎΠΊ Π²ΠΎΡΠΊΠ΅ΡΠ°
β’ ΠΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ: Π² ΡΠ΄
π Π§ΠΈΡΠ°ΡΡ
ΠΠΎΠ½ΡΠ΅ΠΊΡΡ:
Π Π°Π±ΠΎΡΠ°Ρ Π½Π° 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
ΠΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π² Π³Π»ΡΠ±ΠΎΠΊΠΎΠΉ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ². ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΈ ΠΏΠ°Π΄Π΅Π½ΠΈΠΈ ΡΠ΅ΡΠ²ΠΈΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠΎΠ·Π΄Π°ΡΡ ΠΈΠ½ΡΠΈΠ΄Π΅Π½Ρ, ΡΠ²Π΅Π΄ΠΎΠΌΠ»ΡΠ΅Ρ ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΡΡ ΡΠ΅ΡΠ΅Π· ΡΡΠΊΠ°Π»Π°ΡΠΈΡ ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅Ρ ΡΡΠ°ΡΡΡ-ΡΡΡΠ°Π½ΠΈΡΡ. ΠΡΡΡ Π΄Π°ΠΆΠ΅ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΉ APM Ρ ΡΡΠ΅ΠΉΡΠ°ΠΌΠΈ ΠΈ ΠΌΠ΅ΡΡΠΈΠΊΠ°ΠΌΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ. Π Π°Π·Π²Π΅ΡΠ½ΡΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π½Π° Kubernetes ΠΈΠ»ΠΈ ΡΠ΅ΡΠ΅Π· Docker Compose.
π€ GitHub
@golang_google
π§ͺ Go synctest β ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ Π½Π΅ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΡΡ
(flaky) ΡΠ΅ΡΡΠΎΠ²
Flaky-ΡΠ΅ΡΡΡ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠΌ Go-ΠΊΠΎΠ΄Π΅ β Π±ΠΎΠ»Ρ. ΠΠΎΠ²ΡΠΉ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ
π Π§ΡΠΎ ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅:
β’
β’ Π²ΡΠ΅ goroutine ΠΈΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π΄Π΅ΡΠ΅ΡΠΌΠΈΠ½ΠΈΡΠΎΠ²Π°Π½Π½ΠΎ
β’ Π½Π΅Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊΠ° ΠΈ Π½Π°Π³ΡΡΠ·ΠΊΠΈ ΠΠ‘
π§ ΠΡΠΈΠΌΠ΅Ρ:
β± ΠΠ°ΠΆΠ΅ Ρ
βοΈ ΠΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π°:
β Π£ΡΡΡΠ°Π½Π΅Π½ΠΈΠ΅ race-ΡΡΠ»ΠΎΠ²ΠΈΠΉ ΠΏΡΠΈ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ
β ΠΠ΅Ρ Π·Π°Π΄Π΅ΡΠΆΠ΅ΠΊ β
β ΠΠΎΠΆΠ½ΠΎ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ ΡΠΎΡΠ½ΠΎΡΡΡΡ Π΄ΠΎ ΠΌΠΈΠΊΡΠΎΡΠ΅ΠΊΡΠ½Π΄Ρ
β ΠΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π΄Π»Ρ Π»ΡΠ±ΡΡ
π« ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ:
β’ ΠΠΎΠΊΠ° ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΠΎ: Π½ΡΠΆΠ½ΠΎ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ Ρ
β’ ΠΠ΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π΄Π»Ρ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π°, ΡΠ°Π±ΠΎΡΡ Ρ ΡΠ΅ΡΡΡ ΠΈΠ»ΠΈ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ Π²Π½Π΅ "bubble"
π ΠΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅:
https://victoriametrics.com/blog/go-synctest/
@golang_google
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 Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅Ρ ΠΏΠΎΠ»Ρ ΡΡΡΡΠΊΡΡΡ ΠΏΠΎ ΠΈΡ ΡΠ°Π·ΠΌΠ΅ΡΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
ΠΠ°ΠΆΠ΅ΡΡΡ, ΡΡΠΎ struct Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°Π½ΠΈΠΌΠ°ΡΡ 10 Π±Π°ΠΉΡ. ΠΠΎ ΠΈΠ·-Π·Π° Π²ΡΡΠ°Π²Π½ΠΈΠ²Π°Π½ΠΈΡ Go Π²ΡΡΠ°Π²ΠΈΡ ΠΏΠ°Π΄Π΄ΠΈΠ½Π³, ΠΈ ΠΈΡΠΎΠ³ΠΎΠ²ΡΠΉ ΡΠ°Π·ΠΌΠ΅Ρ ΠΎΠΊΠ°ΠΆΠ΅ΡΡΡ 24 Π±Π°ΠΉΡΠ°.
β ΠΠ°ΠΊ ΡΡΠΎ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ?
ΠΠ΅Π½ΡΠ΅ΠΌ ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΠΏΠΎΠ»Π΅ΠΉ:
Π’Π΅ΠΏΠ΅ΡΡ ΡΡΡΡΠΊΡΡΡΠ° Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ 16 Π±Π°ΠΉΡ, Π° Π½Π΅ 24 β ΠΈ Π²ΡΡ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ Π³ΡΠ°ΠΌΠΎΡΠ½ΠΎΠΌΡ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΠΏΠΎΠ»Π΅ΠΉ.
π Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΠΈ:
β’ Π‘ΠΎΡΡΠΈΡΡΠΉ ΠΏΠΎΠ»Ρ ΠΎΡ ΡΠ°ΠΌΡΡ ΠΊΡΡΠΏΠ½ΡΡ ΠΊ ΡΠ°ΠΌΡΠΌ ΠΌΠ΅Π»ΠΊΠΈΠΌ
β’ ΠΡΡΠΏΠΏΠΈΡΡΠΉ ΠΎΠ΄Π½ΠΎΡΠΈΠΏΠ½ΡΠ΅ ΠΏΠΎΠ»Ρ
β’ ΠΠ·Π±Π΅Π³Π°ΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠΈΠ²Π°Π½ΠΈΡ
β’ ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, viztruct) Π΄Π»Ρ Π°Π½Π°Π»ΠΈΠ·Π° struct'ΠΎΠ²
β’ ΠΡΠΎΠ²Π΅ΡΡΠΉ ΡΠ°Π·ΠΌΠ΅Ρ struct ΡΠ΅ΡΠ΅Π·
π― ΠΡΠΎ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π²Π°ΠΆΠ½ΠΎ ΠΏΡΠΈ:
β’ ΠΌΠ°ΡΡΠΎΠ²ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ struct Π² ΠΌΠ°ΡΡΠΈΠ²Π°Ρ ΠΈ ΡΠ»Π°ΠΉΡΠ°Ρ
β’ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ struct ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ
β’ ΡΠ°Π±ΠΎΡΠ΅ Ρ Π±ΠΈΠ½Π°ΡΠ½ΡΠΌΠΈ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°ΠΌΠΈ ΠΈΠ»ΠΈ mmap
π ΠΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ°ΠΌΠΈ: https://dev.to/buarki/optimizing-struct-layout-and-padding-in-practice-23p1
ΠΠΎΠ³Π΄Π° ΡΡ ΡΠ°Π±ΠΎΡΠ°Π΅ΡΡ Ρ 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
Π ΡΡΠ°ΡΡΠ΅ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΡΡΡ, ΠΊΠ°ΠΊ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ "ΡΠ΅ΡΠ΄ΡΠ΅Π±ΠΈΠ΅Π½ΠΈΡ" (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
β’ ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ°
β’ CLI-ΡΠ΅ΠΆΠΈΠΌ ΠΈ in-memory Π±Π°Π·Π°
π¦ Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°:
π₯ ΠΡΡΡΡΡΠΉ ΡΡΠ°ΡΡ (CLI):
π Π Π΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ: https://github.com/stoolap/stoolap
π Π‘Π°ΠΉΡ: https://stoolap.io
@golang_google
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
Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π° 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:
β’ ΠΡΠ°ΡΠΈΠ²ΠΎ ΡΠΎΡΠΌΠ°ΡΠΈΡΡΠ΅Ρ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠ΅ ΡΡΡΡΠΊΡΡΡΡ ΠΈ ΡΡΠ΅Π·Ρ
β’ ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΊΠ°ΡΡΡ, ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ, ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ, ΡΠΈΠΊΠ»Ρ
β’ ΠΡΠ²ΠΎΠ΄ Π² ΡΠ²Π΅ΡΠ΅ (ANSI) ΠΈ Ρ ΠΎΡΡΡΡΠΏΠ°ΠΌΠΈ
β’ Π£ΠΌΠ΅Π΅Ρ ΠΎΠ±Ρ ΠΎΠ΄ΠΈΡΡ ΡΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΡΡΠ»ΠΊΠΈ
β’ ΠΡΠΎΡΡΠΎΠΉ API:
π‘ ΠΡΠ»ΠΈΡΠ½ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π΄Π»Ρ:
- ΠΡΠ»Π°Π΄ΠΊΠΈ ΠΈ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ»ΠΎΠΆΠ½ΡΡ ΡΡΡΡΠΊΡΡΡ
- ΠΠ½ΡΠΏΠ΅ΠΊΡΠΈΠΈ JSON-Π΄Π°Π½Π½ΡΡ ΠΏΠΎΡΠ»Π΅ Π°Π½ΠΌΠ°ΡΡΠ°Π»ΠΈΠ½Π³Π°
- ΠΡΡΡΡΠΎΠΉ Π²ΠΈΠ·ΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ Π±Π΅Π· IDE
π ΠΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ:
π Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°:
π https://github.com/goforj/godump
ΠΡΠ»ΠΈ
@golang_google
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
ΠΡΠΎ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ, ΡΠ²Π΅ΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ, ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π½Π½ΡΠΉ 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: