go / expert
Snippet
Hoch-performante Map durch Lock-Striping
Lock-Striping ist ein Entwurfsmuster zur Reduzierung von Ressourcenkonflikten, indem eine geteilte Ressource in mehrere unabhängige 'Shards' mit jeweils eigenem Lock aufgeteilt wird. In Umgebungen mit hoher Parallelität wird ein einzelner globaler Mutex auf einer Map zum Flaschenhals. Durch Hashing des Schlüssels zur Auswahl eines Shards können mehrere Goroutinen gleichzeitig auf verschiedene Teile der Map zugreifen.
snippet.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
type Shard struct {sync.RWMutexm map[string]string}type ShardedMap []*Shardfunc (s ShardedMap) getShard(key string) *Shard {return s[uint32(crc32.ChecksumIEEE([]byte(key)))%uint32(len(s))]}func (s ShardedMap) Get(key string) string {shard := s.getShard(key)shard.RLock()defer shard.RUnlock()return shard.m[key]}
Erklärung
1
type Shard struct
Definiert ein Datensegment, das durch einen eigenen Mutex geschützt ist.
2
s[uint32(crc32.ChecksumIEEE([]byte(key)))%uint32(len(s))]
Bestimmt über Hashing, welcher Shard für den gegebenen Schlüssel zuständig ist.