|
|
|
@ -2,9 +2,12 @@ package deliver |
|
|
|
|
|
|
|
|
|
|
|
import ( |
|
|
|
import ( |
|
|
|
"context" |
|
|
|
"context" |
|
|
|
|
|
|
|
"fmt" |
|
|
|
"google.golang.org/grpc" |
|
|
|
"google.golang.org/grpc" |
|
|
|
|
|
|
|
"google.golang.org/grpc/credentials/insecure" |
|
|
|
"google.golang.org/protobuf/proto" |
|
|
|
"google.golang.org/protobuf/proto" |
|
|
|
"sonet/api/gen/postal" |
|
|
|
"sonet/api/gen/postal" |
|
|
|
|
|
|
|
"sonet/pkg/grpc/balancer" |
|
|
|
"sonet/pkg/grpc/discovery" |
|
|
|
"sonet/pkg/grpc/discovery" |
|
|
|
"sonet/pkg/utils/logger" |
|
|
|
"sonet/pkg/utils/logger" |
|
|
|
"sync" |
|
|
|
"sync" |
|
|
|
@ -14,15 +17,11 @@ type GroupLoader interface { |
|
|
|
Load(uid string) (groupIds []string) |
|
|
|
Load(uid string) (groupIds []string) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
type Postal struct { |
|
|
|
|
|
|
|
conn *grpc.ClientConn |
|
|
|
|
|
|
|
Client postal.PostalClient |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
type GroupDeliver struct { |
|
|
|
type GroupDeliver struct { |
|
|
|
svcName string |
|
|
|
svcName string |
|
|
|
groupLoader GroupLoader |
|
|
|
groupLoader GroupLoader |
|
|
|
resolver discovery.Resolver |
|
|
|
resolver discovery.Resolver |
|
|
|
|
|
|
|
postal postal.PostalClient // postal consistent hash client
|
|
|
|
postalDialOptions []grpc.DialOption |
|
|
|
postalDialOptions []grpc.DialOption |
|
|
|
postals map[string]*Postal |
|
|
|
postals map[string]*Postal |
|
|
|
lock *sync.RWMutex |
|
|
|
lock *sync.RWMutex |
|
|
|
@ -42,8 +41,13 @@ func NewGroupDeliver( |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (d *GroupDeliver) Init(ctx context.Context) (err error) { |
|
|
|
func (d *GroupDeliver) Init(ctx context.Context, grpcResolver discovery.GrpcResolver, opts ...grpc.DialOption) (err error) { |
|
|
|
// initial all postal clients
|
|
|
|
err = d.initPostal(ctx, grpcResolver, opts...) |
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
|
|
|
return |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// initial all postal direct clients
|
|
|
|
servers, err := d.resolver.ResolveAll(ctx, postal.Postal_ServiceDesc.ServiceName) |
|
|
|
servers, err := d.resolver.ResolveAll(ctx, postal.Postal_ServiceDesc.ServiceName) |
|
|
|
if err != nil { |
|
|
|
if err != nil { |
|
|
|
return |
|
|
|
return |
|
|
|
@ -58,6 +62,28 @@ func (d *GroupDeliver) Init(ctx context.Context) (err error) { |
|
|
|
return |
|
|
|
return |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (d *GroupDeliver) initPostal(ctx context.Context, resolver discovery.GrpcResolver, opts ...grpc.DialOption) (err error) { |
|
|
|
|
|
|
|
balancer.InitConsistentHashBuilder() |
|
|
|
|
|
|
|
rb, err := resolver.Resolver() |
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
|
|
|
return |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
postalUrl := resolver.DialUrl(postal.Postal_ServiceDesc.ServiceName) |
|
|
|
|
|
|
|
var options []grpc.DialOption |
|
|
|
|
|
|
|
// consistent hash lb
|
|
|
|
|
|
|
|
options = append(options, grpc.WithDefaultServiceConfig(fmt.Sprintf(`{"loadBalancingPolicy":"%s"}`, balancer.ConsistentHash))) |
|
|
|
|
|
|
|
options = append(options, grpc.WithResolvers(rb)) |
|
|
|
|
|
|
|
options = append(options, grpc.WithTransportCredentials(insecure.NewCredentials())) |
|
|
|
|
|
|
|
options = append(options, opts...) |
|
|
|
|
|
|
|
conn, err := grpc.DialContext(ctx, postalUrl, options...) |
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
|
|
|
return |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
d.postal = postal.NewPostalClient(conn) |
|
|
|
|
|
|
|
return |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// watchPostal watch postal service list
|
|
|
|
// watchPostal watch postal service list
|
|
|
|
func (d *GroupDeliver) watchPostal(ctx context.Context) (err error) { |
|
|
|
func (d *GroupDeliver) watchPostal(ctx context.Context) (err error) { |
|
|
|
ch, err := d.resolver.Watch(ctx, postal.Postal_ServiceDesc.ServiceName) |
|
|
|
ch, err := d.resolver.Watch(ctx, postal.Postal_ServiceDesc.ServiceName) |
|
|
|
@ -90,10 +116,7 @@ func (d *GroupDeliver) buildPostals(servers []discovery.Server) { |
|
|
|
logger.Errorf("dial postal server %+v error: %v", server.Addr, err) |
|
|
|
logger.Errorf("dial postal server %+v error: %v", server.Addr, err) |
|
|
|
continue |
|
|
|
continue |
|
|
|
} |
|
|
|
} |
|
|
|
postals[server.Addr] = &Postal{ |
|
|
|
postals[server.Addr] = NewPostal(conn) |
|
|
|
conn: conn, |
|
|
|
|
|
|
|
Client: postal.NewPostalClient(conn), |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// close old connection
|
|
|
|
// close old connection
|
|
|
|
@ -101,9 +124,7 @@ func (d *GroupDeliver) buildPostals(servers []discovery.Server) { |
|
|
|
d.postals = postals |
|
|
|
d.postals = postals |
|
|
|
for addr, p := range oldPostals { |
|
|
|
for addr, p := range oldPostals { |
|
|
|
if _, ok := d.postals[addr]; !ok { |
|
|
|
if _, ok := d.postals[addr]; !ok { |
|
|
|
if err := p.conn.Close(); err != nil { |
|
|
|
p.Close() |
|
|
|
logger.Errorf("close old postal conn %s error: %v", addr, err) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
@ -114,20 +135,21 @@ func (d *GroupDeliver) DeliverGroup(ctx context.Context, gid string, msg proto.M |
|
|
|
if err != nil { |
|
|
|
if err != nil { |
|
|
|
return |
|
|
|
return |
|
|
|
} |
|
|
|
} |
|
|
|
req := &postal.ReqDeliverGroup{ |
|
|
|
req := postal.ReqDeliverGroup{ |
|
|
|
Gid: gid, |
|
|
|
Gid: gid, |
|
|
|
Msg: message, |
|
|
|
Msg: message, |
|
|
|
} |
|
|
|
} |
|
|
|
for _, p := range d.postals { |
|
|
|
for _, p := range d.postals { |
|
|
|
res, err := p.Client.DeliverGroup(ctx, req) |
|
|
|
p.DeliverGroup(&req) |
|
|
|
if err != nil || !res.Ok { |
|
|
|
|
|
|
|
logger.Errorf("deliver to postal failed: %+v, %v", res, err) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
return |
|
|
|
return |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (d *GroupDeliver) GroupJoin(ctx context.Context, uid string, gid []string) (err error) { |
|
|
|
func (d *GroupDeliver) GroupJoin(ctx context.Context, uid string, gids []string) (err error) { |
|
|
|
|
|
|
|
req := &postal.ReqGroupJoin{ |
|
|
|
|
|
|
|
Uid: uid, |
|
|
|
|
|
|
|
Gids: gids, |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
_, err = d.postal.GroupJoin(ctx, req) |
|
|
|
return |
|
|
|
return |
|
|
|
} |
|
|
|
} |