go-mysql-lock alternatives and similar packages
Based on the "Distributed Systems" category.
Alternatively, view go-mysql-lock alternatives based on common mentions on social networks and blogs.
-
Nomad
Nomad is an easy-to-use, flexible, and performant workload orchestrator that can deploy a mix of microservice, batch, containerized, and non-containerized applications. Nomad is easy to operate and scale and has native Consul and Vault integrations. -
go-zero
DISCONTINUED. go-zero is a web and rpc framework written in Go. It's born to ensure the stability of the busy sites with resilient design. Builtin goctl greatly improves the development productivity. [Moved to: https://github.com/zeromicro/go-zero] -
rpcx
Best microservices framework in Go, like alibaba Dubbo, but with more features, Scale easily. Try it. Test it. If you feel it's better, use it! ๐๐๐ฏ๐ๆ๐๐ฎ๐๐๐จ, ๐๐จ๐ฅ๐๐ง๐ ๆ๐ซ๐ฉ๐๐ฑ! build for cloud! -
Encore
Open Source Development Platform for building robust type-safe distributed systems with declarative infrastructure -
gleam
Fast, efficient, and scalable distributed map/reduce system, DAG execution, in memory or on disk, written in pure Go, runs standalone or distributedly. -
glow
Glow is an easy-to-use distributed computation system written in Go, similar to Hadoop Map Reduce, Spark, Flink, Storm, etc. I am also working on another similar pure Go system, https://github.com/chrislusf/gleam , which is more flexible and more performant. -
Olric
Distributed, in-memory key/value store and cache. It can be used as an embedded Go library and a language-independent service. -
Dragonfly
Dragonfly is an open source P2P-based file distribution and image acceleration system. It is hosted by the Cloud Native Computing Foundation (CNCF) as an Incubating Level Project. -
go-doudou
go-doudou๏ผdoudou pronounce /dษudษu/๏ผis OpenAPI 3.0 (for REST) spec and Protobuf v3 (for grpc) based lightweight microservice framework. It supports monolith service application as well. -
resgate
A Realtime API Gateway used with NATS to build REST, real time, and RPC APIs, where all your clients are synchronized seamlessly. -
go-sundheit
A library built to provide support for defining service health for golang services. It allows you to register async health checks for your dependencies and the service itself, provides a health endpoint that exposes their status, and health metrics. -
Maestro
Take control of your data, connect with anything, and expose it anywhere through protocols such as HTTP, GraphQL, and gRPC. -
celeriac
Golang client library for adding support for interacting and monitoring Celery workers, tasks and events. -
drmaa
Compute cluster (HPC) job submission library for Go (#golang) based on the open DRMAA standard.
CodeRabbit: AI Code Reviews for Developers
Do you think we are missing an alternative of go-mysql-lock or a related project?
README
go-mysql-lock
go-mysql-lock provides locking primitive based on MySQL's GET_LOCK Lock names are strings and MySQL enforces a maximum length on lock names of 64 characters.
Use cases
Though there are mature locking primitives provided by systems like Zookeeper and etcd, when you have an application which is primarily dependent on MySQL for its uptime and health, added resiliency provided by systems just mentioned doesn't add much benefit. go-mysql-lock helps when you have multiple application instances which are backed by a common mysql instance and you want only one of those application instances to hold a lock and do certain tasks.
Installation
go get github.com/sanketplus/go-mysql-lock
Example:
package main
import (
"context"
"database/sql"
_ "github.com/go-sql-driver/mysql"
"github.com/sanketplus/go-mysql-lock"
)
func main() {
db, _ := sql.Open("mysql", "root@tcp(localhost:3306)/dyno_test")
locker := gomysqllock.NewMysqlLocker(db)
lock, _ := locker.Obtain("foo")
lock.Release()
}
Features
Customizable Refresh Period
Once the lock is obtained, a goroutine periodically (default every 1 second) keeps pinging on connection since the lock is valid on a connection(session). To configure the refresh interval
locker := gomysqllock.NewMysqlLocker(db, gomysqllock.WithRefreshInterval(time.Millisecond*500))
Obtain Lock With Context
By default, an attempt to obtain a lock is backed by background context. That means the Obtain
call would block
indefinitely. Optionally, an Obtain
call can be made with user given context which will get cancelled with the given
context.
The following call will give up after a second if the lock was not obtained.
locker := gomysqllock.NewMysqlLocker(db)
ctxShort, _ := context.WithDeadline(context.Background(), time.Now().Add(time.Second))
lock, err := locker.ObtainContext(ctxShort, "key")
Obtain Lock With (MySQL) Timeout
MySQL has the ability to timeout and return if the lock can't be acquired in a given number of seconds.
This timeout can be specified when using ObtainTimeout
and ObtainTimeoutContext
. On timeout, ErrMySQLTimeout
is returned, and the lock is not obtained.
The following call will give up after a second if the lock was not obtained, using MySQL timeout option:
locker := gomysqllock.NewMysqlLocker(db)
lock, err := locker.ObtainTimeout("key", 1)
Know When The Lock is Lost
Obtained lock has a context which is cancelled if the lock is lost. This is determined while a goroutine keeps pinging the connection. If there is an error while pinging, assuming connection has an error, the context is cancelled. And the lock owner gets notified of the lost lock.
context := lock.GetContext()
Compatibility
This library is tested (automatically) against MySQL 8 and MariaDB 10.1, and it should work for MariaDB versions >= 10.1 and MySQL versions >= 5.6.
Note that GET_LOCK
function won't lock indefinitely on MariaDB 10.1 / MySQL 5.6 and older, as 0
or negative value for timeouts are not accepted in those versions. This means that in MySQL <= 5.6 / MariaDB <= 10.1 you can't use Obtain
or ObtainContext
. To achieve a similar goal, you can use ObtainTimeout
(and ObtainTimeoutContext
) using a very high timeout value.