You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
136 lines
3.6 KiB
136 lines
3.6 KiB
package deprecated |
|
|
|
import ( |
|
"context" |
|
"fmt" |
|
"google.golang.org/grpc" |
|
"google.golang.org/grpc/credentials/insecure" |
|
"google.golang.org/protobuf/proto" |
|
"sonet/api/gen/postal" |
|
"sonet/pkg/grpc/balancer" |
|
"sonet/pkg/grpc/discovery" |
|
"sonet/pkg/protocol/deliver" |
|
"sonet/pkg/utils/logger" |
|
) |
|
|
|
type Status int16 |
|
|
|
const ( |
|
StatusSuccess Status = 1 |
|
StatusError Status = 2 |
|
StatusReceiverOffline Status = 10 |
|
) |
|
|
|
// DDeliver n包,通知消息投递 |
|
// Deprecated |
|
type DDeliver struct { |
|
svcName string |
|
postal postal.PostalClient |
|
} |
|
|
|
func NewDDeliver(msgInServiceName string) *DDeliver { |
|
return &DDeliver{ |
|
svcName: msgInServiceName, |
|
} |
|
} |
|
|
|
func (d *DDeliver) InitWithResolver(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 |
|
} |
|
|
|
func (d *DDeliver) InitWithAddr(postalAddr string, opts ...grpc.DialOption) (err error) { |
|
// Conn *grpc.ClientConn |
|
var options []grpc.DialOption |
|
options = append(options, grpc.WithTransportCredentials(insecure.NewCredentials())) |
|
options = append(options, opts...) |
|
conn, err := grpc.Dial(postalAddr, options...) |
|
if err != nil { |
|
return |
|
} |
|
d.postal = postal.NewPostalClient(conn) |
|
return |
|
} |
|
|
|
func (d *DDeliver) Deliver(ctx context.Context, msg proto.Message, receiver string, options ...deliver.Option) (Status, error) { |
|
return d.deliver0(ctx, msg, []string{receiver}, options...) |
|
} |
|
|
|
func (d *DDeliver) DeliverBatch(ctx context.Context, msg proto.Message, receivers []string, options ...deliver.Option) (Status, error) { |
|
return d.deliver0(ctx, msg, receivers, options...) |
|
} |
|
|
|
func (d *DDeliver) deliver0(ctx context.Context, msg proto.Message, receivers []string, options ...deliver.Option) (status Status, err error) { |
|
//opts := deliver.defaultOptions |
|
//if options != nil { |
|
// for _, opt := range options { |
|
// opt.f(&opts) |
|
// } |
|
//} |
|
if receivers == nil || len(receivers) == 0 { |
|
// return StatusError, errors.New("receivers is empty") |
|
return StatusSuccess, nil |
|
} |
|
|
|
// encode msg |
|
message, err := deliver.Proto2DeliverMessage(d.svcName, msg) |
|
if err != nil { |
|
return StatusError, err |
|
} |
|
|
|
// deliver to gateway |
|
if len(receivers) == 1 { |
|
// deliver one receiver |
|
reqDeliver := &postal.ReqDeliver{ |
|
Receiver: receivers[0], |
|
Msg: message, |
|
} |
|
|
|
ctx = context.WithValue(ctx, balancer.ConsistentHashKey, reqDeliver.Receiver) |
|
res, err := d.postal.Deliver(ctx, reqDeliver) |
|
if err != nil { |
|
return StatusError, err |
|
} |
|
// TODO res code |
|
if res.Ok { |
|
status = StatusSuccess |
|
} else { |
|
status = StatusError |
|
} |
|
logger.Info("deliver result: ", err, res) |
|
} else { |
|
|
|
// deliver batch receiver |
|
ctx = context.WithValue(ctx, balancer.ConsistentHashKey, receivers[0]) |
|
req := &postal.ReqDeliverBatch{Receivers: receivers, Msg: message} |
|
res, err := d.postal.DeliverBatch(ctx, req) |
|
if err != nil { |
|
logger.Error("deliver error: ", err) |
|
return StatusError, err |
|
} |
|
if res.Ok { |
|
status = StatusSuccess |
|
} else { |
|
status = StatusError |
|
} |
|
logger.Info("deliver batch result: ", res) |
|
} |
|
return |
|
}
|
|
|