https://github.com/tsingsun/members
hashicorp memberlist extension
https://github.com/tsingsun/members
Last synced: 2 months ago
JSON representation
hashicorp memberlist extension
- Host: GitHub
- URL: https://github.com/tsingsun/members
- Owner: tsingsun
- License: mit
- Created: 2023-07-06T08:58:38.000Z (almost 2 years ago)
- Default Branch: main
- Last Pushed: 2025-03-28T15:21:39.000Z (3 months ago)
- Last Synced: 2025-03-28T16:29:10.551Z (3 months ago)
- Language: Go
- Size: 39.1 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# members
[](https://golang.org/)
[](https://goreportcard.com/report/github.com/tsingsun/members)
[](https://codecov.io/gh/tsingsun/members)
[](https://github.com/tsingsun/members/actions)
[](https://github.com/tsingsun/members/releases)
[](https://pkg.go.dev/github.com/tsingsun/members?tab=doc)this project is base on hashicorp memberlist library.
## Usage
```bash
go get github.com/tsingsun/members
``````go
package mainimport (
"context"
"flag"
"github.com/tsingsun/members"
"github.com/vmihailenco/msgpack/v5"
"strings"
)var (
peers = flag.String("peers", "", "comma seperated list of peers")
address = flag.String("address", ":4001", "http host:port")
)func init() {
flag.Parse()
}func main() {
var ms []string
if len(*peers) > 0 {
ms = strings.Split(*peers, ",")
}
group, err := members.NewPeer()
if err != nil {
panic(err)
}
group.Options.ExistsPeers = ms
if err = group.Join(context.Background()); err != nil {
panic(err)
}
// OrderHandler implement members.Shard interface
orderhdl := &OrderHandler{
ShardId: "order",
}
sd, err := group.AddShard(orderhdl)
if err != nil {
panic(err)
}
orderhdl.Spreader = sd
}type OrderHandler struct {
ShardId string
Spreader members.Spreader
Orders []string
}// Name returns the name of the shard, which is used to identify the shard.
func (OrderHandler) Name() string {
return "order"
}// MarshalBinary marshals the shard data into a binary to sync other nodes.
func (o *OrderHandler) MarshalBinary() ([]byte, error) {
return msgpack.Marshal(o.Orders)
}// Merge data from remote node MarshalBinary result. The Shard should be able to dedupe the data.
func (o *OrderHandler) Merge(b []byte) error {
var ors []string
if err := msgpack.Unmarshal(b, &ors); err != nil {
return err
}
for _, ord := range ors {
if !strings.Contains(ord, "order") {
continue
}
o.Orders = append(o.Orders, ord)
}
return nil
}func (o *OrderHandler) Receive(ord string) error {
o.Orders = append(o.Orders, ord)
bs, err := msgpack.Marshal([]string{ord})
if err != nil {
return err
}
return o.Spreader.Broadcast(bs)
}