Slide 14
Slide 14 text
14
SharedMemory
Actor間でデータ共有するもう一つの方法。KVストア。用途は、動的な設定、テスト用変数、リー
ダー状態などの保持。正直、アクターモデルの良さを殺しているが、すべてメッセージにすると開発コ
ストが高くなったりするため最小限ならよしとしている。
type SharedMemoryAccessor interface {
Get(key StateKey) (any, bool)
Set(key StateKey, value any)
Pop(key StateKey) (any, bool)
Upsert(key StateKey, value any, cb UpsertCb)
}
type SharedMemory interface {
SharedMemoryAccessor
Load(ctx context.Context, r io.Reader) error
Store(ctx context.Context) (io.Reader, error)
Clear()
}
内部実装はconcurrent-map (shard毎ロック)。公式のsync.Mapはwrite-once-read-many最適され
てたりするのでやめた。 concurrent-swiss-map (最適なメモリレイアウト+ SSEの活用等で高速lookup
が可能なSwissMap のスレッドセーフ版)はまだちゃんとさわれていないが感触早い。 Load/Storeはリー
ダー状態をDBへ永続化し新リーダーに継承させるための機能で、 gobでシリアライズしている。